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.