Преобразование в 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
Ну, F# основан на OCaml, и OCaml имеет скорее обширная макро-система . Учитывая синтаксические и семантические близости F# и OCaml можно быть в состоянии портировать по системе макроса Ocaml на F#.
Кроме кражи макро-системы Ocaml я не знаю о консервированной макро-системе для F#.
Nemerle, в http://nemerle.org/ , является языком.NET (также поддерживающий моно), который поддерживает много из парадигмы функционального программирования при пребывании визуально близко к C#. Это имеет обширную макро-поддержку.
Вы посмотрели Шиканье ? В то время как Шиканье не имеет макросов, оно имеет открытый конвейер компилятора, который является хорошей альтернативой макросам для синтаксического метапрограммирования.
[РЕДАКТИРОВАНИЕ], Как отмечено в комментариях, Шиканье делает , имеют макросы теперь.
, но хорошие ужасы синтаксис в тех ocaml примерах выглядит неясным
Там, Вы сталкиваетесь с тем же фундаментальным синтаксическим компромиссом, который Вы делаете с Lisp. Если Вы хотите питание подобных шепелявости макросов, Вы склонны или заканчивать с подобным шепелявости синтаксисом для языка, или иначе Ваш макро-синтаксис выглядит очень отличающимся от Вашего регулярного синтаксиса... ничто неправильно с любым подходом, просто различным выбором
Это может быть наоборот, чем, что Вы хотите, но Вы знаете [приблизительно 110] RDNZL? Это - foerign-функциональный интерфейс (FFI), который позволяет Вам назвать библиотеки.NET от своего кода Lisp.
Они по всей вероятности намного менее зрелы, чем какой-либо язык Common LISP или реализация Схемы, но существуют диалекты Lisp для.NET: L# и DotLisp.
Существуют два активно разработаны, Шепелявит для .net
IronScheme - основанной на долларе реализации схемы
Xronos - основанный на долларе порт clojure