Имеет ли место «весь язык всегда доступный» в случае Clojure? - PullRequest
16 голосов
/ 19 сентября 2010

Девятая точка пули в фильме Пола Грэма Что отличало Лисп * говорит:

9. Весь язык всегда доступен.

Нет реального различия между временем чтения, временем компиляции и временем выполнения. Вы можете скомпилировать или запустить код во время чтения, чтения или запуска кода во время компиляции, а также для чтения или компиляции кода во время выполнения.

Запуск кода во время чтения позволяет пользователям перепрограммировать синтаксис Lisp; запуск кода во время компиляции является основой макросов; компиляция во время выполнения является основой использования Lisp в качестве языка расширения в таких программах, как Emacs; а чтение во время выполнения позволяет программам взаимодействовать с использованием s-выражений, идея, недавно заново изобретенная как XML.

Имеет ли этот последний пункт пули для Clojure?

Ответы [ 2 ]

13 голосов
/ 19 сентября 2010

Вы можете свободно смешивать время выполнения и время компиляции в Clojure, хотя Common Lisp здесь все же несколько более гибок (благодаря наличию макросов компилятора и макросов символов и полностью поддерживаемой macrolet; Clojure имеет преимущество в своей прохладеподход к макро-гигиене через автоматическое разрешение символов в синтаксической кавычке).В настоящее время устройство чтения закрыто, поэтому свободное смешивание времени выполнения, времени компиляции и время чтения невозможно 1 .


1 За исключением неподдерживаемых умных хаков .

4 голосов
/ 19 сентября 2010

Это действительно так,

(eval (read-string "(println \"Hello World!!\")"))
Hello World!!
nil

Так же, как в emacs, вы можете настроить свою программу в Clojure, один проект, для которого я знаю Clojure, это static , который позволяет вам иметь ваш шаблонкак вектор Clojure вместе с произвольным кодом, который будет выполнен во время чтения.

...