Clojure: разница между тем, как реализованы специальные формы, функции и макросы
Я только что начал с Clojure. Я читаю этот.
Я не понимал разницы между тем, как реализуются специальные формы и как реализуются функции и макросы, где говорится:
Почти все функции и макросы реализованы в исходном коде Clojure. Различия между функциями и макросами объясняются позже. Специальные формы распознаются компилятором Clojure и не реализованы в Clojure исходном коде.
Может кто-нибудь объяснить разницу между двумя вещами? (реализован в Clojure исходном коде и не реализован в Clojure исходном коде)
Ответы
Ответ 1
Реализовано в Clojure исходном коде
Код для конкретной функции/абстракции реализуется в Clojure самом языке i.e в файле .clj.
Не реализовано в Clojure исходном коде
Он реализован в Java-коде.
Проверьте код Clojure на github, и вы обнаружите, что есть Java, а также код Clojure.
Ответ 2
возможно, более полезный, с моей точки зрения, способ его размещения:
специальные формы являются частями языка, которые, если кто-то отнял их у вас,
вы не сможете их заменить, и их придется восстановить
другими способами.
например, если кто-то удалил cond, вы могли бы написать свой собственный макрос cond (это просто обертка вокруг if. если кто-то удалит, если... вам придется развить язык и вернуть его.
Ответ 3
Плюс цитата из книги Clojure Программирование Chas Emerick, которая, как мне кажется, очень полезна для понимания специальных форм Clojure.:]
Специальные формы - это Clojure примитивные строительные блоки вычисления, поверх которых строится все остальные Clojure.
Все, что не является специальной формой, реализовано в самом Clojure путем начальной загрузки из этого ограниченного набора примитивных операций.
В самом деле, если вы были так мотивированы, вы могли бы реализовать Clojure (или другой язык по вашему выбору) с нуля, самостоятельно, поверх Clojure специальных форм.
Ответ 4
Special forms
являются примитивными строительными блоками Clojure s, поверх которых
все остальные Clojure построены.
Functions
являются первоклассными значениями в Clojure; их создание попадает в специальную форму fn
.