макро-поддержка в F#

Преобразование в JAVA довольно простое, но нужно некоторое понимание. Как поясняют в JLS для целых операций :

Если целочисленный оператор, отличный от оператора сдвига, имеет хотя бы один операнд типа long, то операция выполняется используя 64-битную точность, а результат численного оператора имеет тип long. Если другой операнд не длинный, он сначала расширяется (§5.1.5), чтобы печатать длинным путем численного продвижения (§5.6).

И пример всегда лучший способ перевести JLS;)

int + long -> long
int(1) + long(2) + int(3) -> long(1+2) + long(3)

В противном случае операция выполняется с использованием 32-битной точности , а результат численного оператора имеет тип int. Если какой-либо операнд не является int, он сначала расширен, чтобы вводить int посредством числовой рекламы.

short + int -> int + int -> int

Небольшой пример использования Eclipse, чтобы показать, что даже добавление двух short s не будет таким простым:

short s = 1;
s = s + s; <- Compiling error

//possible loss of precision
//  required: short
//  found:    int

Это потребует литье с возможной потерей точности.

То же самое верно для операторов с плавающей запятой

Если хотя бы один из операндов числовой оператор имеет тип double, тогда операция выполняется с использованием 64-разрядной арифметики с плавающей запятой, а результатом численного оператора является значение типа double. Если другой операнд не является двойным, он сначала расширяется (§5.1.5), чтобы набирать double путем числовой рекламы (§5.6).

Таким образом, продвижение выполняется по float в double.

И сочетание как целочисленного, так и плавающего значения приводит к плавающим значениям, указанным в

Если хотя бы один из операндов для двоичного оператора имеет тип с плавающей запятой, то операция является операцией с плавающей запятой, даже если другая является интегральной.

Это верно для двоичных операторов, но не для «операторов присваивания», таких как +=

Простой рабочий пример достаточно, чтобы доказать это

int i = 1;
i += 1.5f;

Причина в том, что здесь неявное выполнение сделано, это будет выполняться подобно

i = (int) i + 1.5f
i = (int) 2.5f
i = 2

21
задан Jason Olson 29 September 2008 в 21:50
поделиться

8 ответов

Ну, F# основан на OCaml, и OCaml имеет скорее обширная макро-система . Учитывая синтаксические и семантические близости F# и OCaml можно быть в состоянии портировать по системе макроса Ocaml на F#.

Кроме кражи макро-системы Ocaml я не знаю о консервированной макро-системе для F#.

11
ответ дан Robert Harvey 29 November 2019 в 06:56
поделиться

Nemerle, в http://nemerle.org/ , является языком.NET (также поддерживающий моно), который поддерживает много из парадигмы функционального программирования при пребывании визуально близко к C#. Это имеет обширную макро-поддержку.

13
ответ дан ben 29 November 2019 в 06:56
поделиться

Нет. Никакие макросы для F#.

7
ответ дан Jim Deville 29 November 2019 в 06:56
поделиться

Вы посмотрели Шиканье ? В то время как Шиканье не имеет макросов, оно имеет открытый конвейер компилятора, который является хорошей альтернативой макросам для синтаксического метапрограммирования.

[РЕДАКТИРОВАНИЕ], Как отмечено в комментариях, Шиканье делает , имеют макросы теперь.

6
ответ дан Jörg W Mittag 29 November 2019 в 06:56
поделиться

, но хорошие ужасы синтаксис в тех ocaml примерах выглядит неясным

Там, Вы сталкиваетесь с тем же фундаментальным синтаксическим компромиссом, который Вы делаете с Lisp. Если Вы хотите питание подобных шепелявости макросов, Вы склонны или заканчивать с подобным шепелявости синтаксисом для языка, или иначе Ваш макро-синтаксис выглядит очень отличающимся от Вашего регулярного синтаксиса... ничто неправильно с любым подходом, просто различным выбором

4
ответ дан simon 29 November 2019 в 06:56
поделиться

Существуют два активно разработаны, Шепелявит для .net

IronScheme - основанной на долларе реализации схемы

Xronos - основанный на долларе порт clojure

1
ответ дан Stefan Rusek 29 November 2019 в 06:56
поделиться

Как насчет использования цитат F #?

http://tomasp.net/blog/fsquotations.aspx

2
ответ дан 29 November 2019 в 06:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: