Прочитав «Практический Common Lisp», я наконец понял, в чем заключаются большие проблемы с макросами, и искал язык для платформы .NET, который бы это поддерживал. Есть несколько диалектов шепеля для .NET, но из того, что мне удалось собрать, все они либо очень бета-версии, либо заброшены. Недавно мой интерес был вызван Clojure, но он предназначен для платформы java, и хотя, вероятно, можно было бы использовать ikvm, он не чувствует себя интегрированным. Особенно, если вы хотите делать такие вещи, как WPF.
Недавно я слышал шепот о F#, я пытался посмотреть документацию, могу ли я найти что-нибудь о поддержке макросов, но не нашел. Так кто-нибудь знает?
Спасибо :)





Неа. Нет макросов для F#.
Можно было бы рассматривать вычислительные выражения как замену макросистеме в том смысле, что они позволяют создавать своего рода языки, специфичные для предметной области.
Что ж, F# основан на OCaml, а OCaml имеет скорее обширная система макросов. Учитывая синтаксическое и семантическое сходство F# и OCaml, вы можете перенести макросистему Ocaml на F#.
Кроме кражи макросистемы Ocaml, мне неизвестна стандартная система макросов для F#.
Портирование camlp4 - задача нетривиальная. Но это не требуется, пока вы остаетесь в совместимом с ocaml подмножестве F#. Хотя весь процесс потребует некоторой ручной настройки и приведет к определенным ограничениям.
но хорошие ужасы синтаксис в этих примерах ocaml выглядит неясным
Здесь вы сталкиваетесь с тем же фундаментальным синтаксическим компромиссом, что и с Lisp. Если вам нужна мощь макросов, подобных Lisp, вы, как правило, либо получаете синтаксис языка, похожий на Lisp, либо синтаксис макроса сильно отличается от вашего обычного синтаксиса ... нет ничего плохого в любом подходе, просто разные варианты
Не совсем. Макросы OCaml усложняются необходимостью различать разные виды синтаксических конструкций (например, определения типов и выражения), поскольку они представлены значениями разных статических типов. Например, Mathematica имеет богатый синтаксис и одновременно мощные макросы.
Хотя я считаю ваше утверждение истинным, из этого аргумента можно сделать один вывод, который мало кто когда-либо делал, так это то, что хороший компилятор для языка, отличного от лиспа, должен иметь в своем компиляторе интерпретатор лиспа :) Затем вы могли бы создать макросистему поверх s выражений, игнорируя специальный синтаксис «реального» языка. Фактически, наиболее близким к этой идее является язык Julia.
Nemerle (http://nemerle.org/) - это язык .NET (также поддерживающий моно), который поддерживает большую часть парадигмы функционального программирования, оставаясь при этом визуально близким к C#. Имеет обширную поддержку макросов.
Вы смотрели Бу? Хотя у Boo нет макросов, у него есть открытый конвейер компилятора, который является хорошей альтернативой макросам для синтаксического метапрограммирования.
[EDIT] Как отмечалось в комментариях, Boo делает теперь имеет макросы.
У Boo в настоящее время есть макросы (это могло быть не так, когда вы писали).
Возможно. Скорее всего, в сделал есть макросы, когда я это опубликовал, но не было, когда я последний раз проверял (что было задолго до этого сообщения). В любом случае это не имеет значения, поскольку вы можете делать все, что можете с макросами, с открытым компилятором и наоборот.
Это может быть наоборот, но знаете ли вы о РДНЗЛ? Это интерфейс foerign-function (FFI), который позволяет вам вызывать библиотеки .NET из вашего кода Lisp.
Скорее всего, они намного менее зрелы, чем любая реализация Common Lisp или Scheme, но существуют диалекты Lisp для .NET: L # и DotLisp.
Просто, к вашему сведению, Dotlist больше не поддерживается (Рич - парень, стоящий за Clojure), поэтому я не думаю, что буду с ним связываться. Имейте в виду, если вам нужна шепелявка, которая не является CL / Scheme, я бы лично использовал Clojure.
По общему признанию, DotLisp немного отстает, но это потому, что он стабилен, работает, и я слишком занят, чтобы загружать свои патчи :-(
Существует два активно разрабатываемых Lisp для .net.
IronScheme - реализация схемы на основе DLR
Xronos - порт закрытия на основе DLR
Ксронос мне кажется мертвым. Попробуйте ClojureCLR - github.com/richhickey/clojure-clr/wiki
Как насчет использования цитат F#?
http://tomasp.net/blog/fsquotations.aspx
Цитаты просто позволяют вам цитировать код, чтобы получить его представление во время выполнения, а цитаты F# часто даже не позволяют вам этого сделать (например, F# отказывается цитировать <@ a @>). Макросы позволяют делать больше, например изменить синтаксис языка. В F# нет возможности сделать это. F# также не имеет полной CodeDOM, поэтому вы не можете использовать компилятор F# программно. В самом деле, можно сказать, что F# специально разработан для предотвращения такого рода программирования.
Recently I have been hearing whisper about F#, I tried to look at the documentation if I could find anything about macro support, but haven't found it. So does anyone know?
F# не поддерживает макросы и вряд ли когда-нибудь будет.
Я подумал, что должен указать, что сейчас существует довольно активный порт .NET / Mono для Clojure. Clojure поддерживает макросы в стиле LISP, как указано в вопросе.
Как уже говорили другие, макросы не поддерживаются в F# на данный момент (конец 2010 г.).
В настоящее время я исследую возможности метапрограммирования на F#. Если мы определяем макросы как текстовый шаблон, который расширяется в код, то есть два очевидных подхода:
Шаблоны T4. Есть реализация для F#: https://github.com/kerams/Templatus
Я где-то видел вызов F# из строк в отдельную сборку, а затем загрузку сборки.
У Microsoft есть диалект Scheme, который используется внутри команды O365 и имеет расширения макросов, оптимизацию хвостовых вызовов и т. д. здесь Вы можете использовать пакет nuget или просто скомпилировать свою программу из исходного кода (он очень маленький). Хорошо работает и предоставляет хорошие возможности для написания сценариев.