2008-09-17 5 views
20

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

Недавно я слышал шепот о F #, я попытался посмотреть документацию, если бы мог найти что-нибудь о поддержке макросов, но не нашел его. Так кто-нибудь знает?

Спасибо :)

ответ

10

Ну, F # основано на OCaml и OCaml имеет довольно extensive macro system. Учитывая синтаксические и семантические сходства F # и OCaml, вы можете переносить поверх макроса Ocaml на F #.

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

+3

Портирование camlp4 не является тривиальной задачей. Но это не требуется, если вы находитесь в совместимом с ocaml подмножеством F #. Хотя весь процесс потребует некоторой ручной настройки и приведет к определенным ограничениям. – ygrek

+0

Ссылка на это сообщение: (http://www.ocaml-tutorial.org/camlp4_3.10) – theoski

7

Nope. Нет макросов для F #.

+0

В качестве замены для макросистемы можно выбрать вычисление выражений в том смысле, что оно позволяет создавать языки определенного типа домена. – BitTickler

4

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

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

+1

Не совсем. Макросы OCaml осложняются необходимостью различать различные типы синтаксических конструкций (например, определения типов vs выражения), поскольку они представлены значениями разных статических типов. Например, Mathematica имеет богатый синтаксис и мощные макросы. –

13

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

6

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

[EDIT] Как отмечено в комментариях, у Boo есть есть макросы.

+4

У Boo в настоящее время есть макросы (это могло быть не так, когда вы отправили). – JasonTrue

+0

Может быть. Скорее всего, он * сделал * есть макросы, когда я разместил это, но не сделал, когда я последний раз проверял (что было задолго до этого сообщения.) Неважно, в любом случае, поскольку вы можете делать все, что вы можете сделать с помощью макросов с открытым компилятор и наоборот. –

1

Это может быть наоборот, чем вы хотите, но знаете ли вы о RDNZL? Это интерфейс функции foerign (FFI), который позволяет вам вызывать библиотеки .NET из вашего кода Lisp.

Они, скорее всего, гораздо менее зрелые, чем любая реализация Common Lisp или Scheme, но есть диалекты Lisp для .NET: L# и DotLisp.

+1

Точка FYI Dotlist больше не поддерживается (Rich - парень, стоящий за Clojure), поэтому я не думаю, что я бы с ним справился. Имейте в виду, если вы хотите, чтобы lisp-like, который не является CL/Scheme, я бы использовал Clojure, лично. – Runevault

+0

DotLisp, по общему признанию, немного низкорослый, но это потому, что он стабилен, работает, и я слишком занят, чтобы загружать свои патчи :-( –

1

Есть два активно развиваются лепечет для .net

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

Xronos - DLR на основе порта Clojure

+0

Xronos выглядит мертвым для меня. Проверьте ClojureCLR - https://github.com/richhickey/ clojure-clr/wiki/ – Justin

2

Как об использовании F # котировок?

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

+2

Цитаты просто позволяют вам приводить код, чтобы получить представление во время выполнения, а цитаты F # часто даже не позволяют вам это делать (например, F # отказывается указывать «<@ a @>»). Макросы позволяют вам делать больше, например, изменить синтаксис языка. В F # нет способа сделать это.F # не имеет полной CodeDOM, так что вы не можете использовать программный компилятор F #. Действительно, вы можете сказать, что F # специально разработан для предотвращения такого рода программирования. –

3

Недавно я шёпот о F # слуха, я пытался посмотреть документацию, если я мог бы найти что-нибудь о макро-поддержке, но не нашел его. Так кто-нибудь знает?

F # не поддерживает макросы, и маловероятно, что он когда-либо будет.

4

Я думал, что должен отметить, что сейчас есть довольно активный порт .NET/Mono от Clojure. Clojure поддерживает макросы стиля LISP, как указано в вопросе.

Как уже говорилось, макросы не поддерживаются в F # на этом этапе (конец 2010 года).

0

В настоящее время я изучаю возможности метапрограммирования в F #. Если мы определяем макросы как текстовый шаблон, который расширяется в код, тогда существуют два очевидных подхода:

  1. T4 шаблоны. Существует реализация для F #: https://github.com/kerams/Templatus

  2. Я видел где-то вызов F # из строк в отдельную сборку, а затем загрузку сборки.