Какие языковые функции могут быть добавлены в Clojure через библиотеки? - PullRequest
4 голосов
/ 23 августа 2011

Например, сопоставление с образцом - это функция языка программирования, которую можно добавить в язык clojure с помощью макросов: http://www.brool.com/index.php/pattern-matching-in-clojure

Какие еще языковые функции можно добавить к языку?

Ответы [ 3 ]

2 голосов
/ 23 августа 2011

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

0 голосов
/ 03 июля 2012

Вы можете эффективно добавлять любые языковые функции, которые вам нравятся.

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

Некоторые примеры, которые я видел:

  • Языки запросов ( Korma )
  • Логическое программирование ( core.logic )
  • Синтез изображений DSL ( clisk )
  • Инфиксная запись для арифметики
  • Алгебраические манипуляции
  • Декларативное определение потоков данных в реальном времени ( Storm , Aleph )
  • Программирование музыки ( Обертон , МузыкаКак данные )

Есть несколько предостережений:

  • Если функция не поддерживается непосредственно JVM (например, оптимизация хвостового вызова во взаимно рекурсивнойслучай) тогда вам придется подражать.Ничего страшного, но это может оказать некоторое влияние на производительность.
  • Если для функции требуется синтаксис, не поддерживаемый средством чтения Clojure, вам необходимо предоставить собственный модуль чтения (поскольку в настоящее время в Clojure отсутствует расширяемый модуль чтения),В результате гораздо проще, если вы будете придерживаться синтаксиса / форм Clojure.
  • Если вы делаете что-то слишком необычное / неидиоматическое, это, вероятно, не будет воспринято другими.Придерживаться стандартных соглашений Clojure очень полезно.
  • Остерегайтесь использования макросов там, где они не нужны.Часто для реализации многих новых языковых функций достаточно просто использовать обычные функции (возможно, функции более высокого порядка).Общее правило: «не используйте макросы, если вам это абсолютно не нужно».
0 голосов
/ 23 августа 2011

Я думаю, что глупо задавать вопрос, что можно добавить, что вы должны спросить, что вы не можете добавить.Макросы позволяют вам подключиться к компилятору, что означает, что вы можете делать почти все.

В данный момент вы не можете добавить свой собственный синтаксис к языку.У Clojure нет читателя, расширяемого пользователем, это означает, что у вас нет макросов читателя (http://dorophone.blogspot.com/2008/03/common-lisp-reader-macros-simple.html).) Это не из-за технической проблемы, а скорее из-за решения Rich Hickey (создателя Clojure).

Чего вы не можете сделать, так это реализовать функции, которые требуют поддержки виртуальных машин, например, добавить семантику хвостового вызова или goto.

Если вы хотите увидеть, что сделано, то: Есть ликакие-либо DSL Clojure?

Обратите внимание, что этот список не обновлен на 100%.

Редактировать:

Поскольку вы, кажется, взяли пример сопоставления с образцом (это действительно хороший пример силы макросов) вы действительно должны взглянуть на библиотеку match. Это, вероятно, лучшая самая быстрая библиотека сопоставления с образцом в Clojure. http://vimeo.com/27860102

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