Comments 7
Как пример такого подхода могу привести язык Julia. Он поступает тоже хитро: парсером разбирает входное выражение, превращает его в Лисп подобный код
Посмотрите ещё Elixir. Это язык, синтаксис которого полностью построен на макросах. И при том, что он внешне не похож на Lisp, внутренняя реализация очень похожа.
quote - а это уже не макрос а специальная форма
Специальная форма – это понятие семантики языка, а макрос – конкретный механизм реализации. Как quote, так и quasiquote являются специальными формами, фактически обычно реализованными с помощью макросов.
> quote
*** ERROR IN (stdin)@13.1 -- Macro name can't be used as a variable: quote
По сути, специальная форма – это просто любая форма, способ вычисления которой отличается от обычной подстановки значений в известном порядке (в большинстве реализаций Scheme слева-направо).
Кстати, никто почему-то не отмечает, что для макросов (и в других языках программирования тоже) по сути используется способ передачи параметров по имени, в отличие от обычного способа по значению. Так сказать, не умер Алгол-60.
Что касается выделения макросов специальным символом @, то мне это не кажется хорошей идеей (как я её понял). Мне не раз приходилось в ходе рефакторинга заменять функцию макросом и наоборот. Вся фишка в их синтаксической неотличимости.
Но в целом очень интересно читать Ваши статьи, много полезного для себя почерпнул из них.
Владимир, это вы в какой системе quote проверяли? В script-fu:
> quote
Error: eval: unbound variable: quote
> quasiquote
#<MACRO>
quote в тинисхеме обрабатывается интерпретатором, а quasiquote определён как макрос в init.scm.
Любопытно. Я проверял в Gambit Scheme. Конечно, ничто не обязывает обрабатывать их так или иначе. Но очень нелогично, что две эти формы, означающие по сути почти одинаковые вещи (собственно, ведь quote – это упрощённая версия quasiquote, оставшаяся в языке по историческим причинам), обрабатываются в TinyScheme по-разному. В Gambit они обе определены одинаковым образом через syntax-object в файле syntax-case.scm.
Моё же замечание было больше по терминологии.
да я вас понял. Это не существенный вопрос. То что вы назвали специальной формой, это дополнение к функциональной форме в классе форм. я бы то что вы назвали специальной формой назвал синтаксической формой, т.е. всё что отличается от функциональной. А уже синтаксические формы делятся на макросы и специальные формы, по принципу где реализована логика обработки, если в самом интерпретаторе то это именно специальная форма, если в виде макроса, т.е вне интерпретатора, то это макрос. В разных реализациях схем и даже разных версиях одной и той же реализации, набор специальных форм может различаться. но все синтаксические формы должны быть поддержаны, поддерживаются они с помощью инициализационных файлов, в которых и определяют недостающие в интерпретаторе синтаксические формы, в виде макросов. Классический пример формы if и cond, в одних интерпретаторах if может быть специальной формой, а cond макросом, раскрывающимся в набор if, а в других наоброт cond обрабатывается интерпретатором, а if определён как макрос. но это не обязательно можно обе формы сделать специальными и обрабатывать всё в интерпретаторе. В тинисхеме поддерживается старая школа макросов(олдскул) никаких синтаксических объектов нет, как и гигиены, это всё забота программиста.
GIMP Script-Fu Первый Дан. Макросы. Первое знакомство