Существуют ли какие-либо практические различия между специальными формами и макросами? В чем они отличаются?Каковы практические различия между специальными формами и макросами?
ответ
Эти термины не вполне синонимичны, но они не являются исключительными либо (этот ответ предполагает схему):
- особая форма (также известный как синтаксис в отчетах Scheme) это выражение, которое не оценивается в соответствии с правилом по умолчанию для приложения-функции. (Правило по умолчанию, просто чтобы быть явным, является
eval
все подвыражения, а затемapply
результат первой в списке результатов других.) - система макросов является функция языка что позволяет определять новые специальные формы внутри самого языка. A макрос - специальная форма, определяемая с использованием макросистемы.
Таким образом, можно сказать, что «особая форма» это термин, который относится к интерфейсу или семантики, в то время как «макро» это термин, который относится к реализации. «Специальная форма» означает «эти выражения оцениваются специальным правилом», а «макрос» означает «вот реализация специального правила для оценки некоторых выражений."
Теперь одна важная вещь, что большинство Scheme специальные формы могут быть определены как макросы из очень небольшого ядра примитивов: lambda
, if
и макросов Минимальная реализация схемы, которая обеспечивает только они могут по-прежнему осуществлять остальные как макросы;. недавние отчеты о схемах сделали это различие, обратившись к таким специальным формам, как «синтаксис библиотек», которые могут быть определены в терминах макросов. На практике, однако, практические системы Схемы часто реализуют более богатый набор форм в качестве примитивов.
Семантически говоря, единственное, что имеет значение для выражения, - это то, какое правило используется для его оценки, а не как это правило реализовано. Поэтому в этом смысле не важно, реализуется ли специальная форма как макро или примитив. Но, с другой стороны, детали реализации системы Scheme часто «утечки», поэтому вы можете заботиться об этом ...
Вы можете реализовать' if' в качестве макроса поверх 'lambda' также. Это не очень эффективно, но это нужно знать. – amalloy
Я чувствую, что этот ответ наиболее ясен. Поскольку он определяет 'special-form' в соответствии с его семантикой - то есть - не полагаясь на детали реализации. –
@amalloy, меня интересует, как это можно сделать, есть ли у вас ссылка? –
В отличие от специальных форм, макросов формы могут быть macroexpanded:
CL-USER(1): (macroexpand '(with-slots (x y z)
foo
(format t "~&X = ~A" x)))
(LET ((#:G925 FOO))
(DECLARE (IGNORABLE #:G925))
(DECLARE (SB-PCL::%VARIABLE-REBINDING #:G925 FOO))
#:G925
(SYMBOL-MACROLET ((X (SLOT-VALUE #:G925 'X))
(Y (SLOT-VALUE #:G925 'Y))
(Z (SLOT-VALUE #:G925 'Z)))
(FORMAT T "~&X = ~A" X)))
T
Привет, Matthias. В tAoAI Norvig утверждает, что 'setf' - особая форма. Однако это макроэкспозиция. Например: '(macroexpand '(setf test 4))' расширяется до '(SETQ TEST 4)' Может быть, есть ошибка в книге? Я также не вижу здесь 'setf': http://www.lispworks.com/documentation/lw60/CLHS/Body/03_ababa.htm#clspecialops – tsikov
Лисп имеет определенные примитивы языка, которые составляют лисповские формы:
- буквальных данных: числа, строки, конструкции, ...
- функциональные вызовы, например
(sin 2.1)
или подобные((lambda (a b) (+ a b 2)) 3 4)
- специальные операторы используется в особых формах. Это примитивные встроенные языковые элементы. См. Special Operators в Common Lisp. Они должны быть реализованы в интерпретаторе и компиляторе. Common Lisp не дает разработчику возможности вводить новые специальные операторы или предоставлять свою собственную версию. Инструмент синтаксического анализа кода должен понимать эти специальные операторы; эти инструменты обычно называются «кодовыми ходоками» в сообществе Lisp. Во время определения стандарта Common Lisp было удостоверено, что число очень мало и что все расширения в противном случае выполняются с помощью новых функций и новых макросов.
- макросы: макросы - это функции, которые преобразуют исходный код. Преобразование произойдет рекурсивно, пока в исходном коде не останется макрос. Common Lisp имеет встроенные макросы и позволяет пользователю писать новые.
Таким образом, самое важное практическое отличие между специальными формами и макросами заключается в следующем: специальные операторы являются встроенным синтаксисом и семантикой. Они не могут быть написаны разработчиком. Макросы могут быть написаны разработчиком.
Для меня самая практичная разница была в отладчике: макросы не показывают в отладчике; вместо этого в отладчике появляется (как правило) неясный код из расширения макроса. Это настоящая боль, чтобы отлаживать такой код и повод для обеспечения того, чтобы ваши макросы были твердыми, прежде чем вы начнете полагаться на них.
Это проблема, если у вас нет отладчика макросов, но некоторые Lisps на самом деле. Например, в Racket есть тот, который вы даже можете использовать из [REPL] (http: //docs.racket-lang.org/xrepl/index.html# \ (xrepl._syntax \)). –
супер короткий ответ для ленивых
Вы можете написать свои собственные макросы в любое время вы хотите, если вы не можете добавлять специальные формы без перекомпиляции Clojure.
- 1. Каковы практические различия между шаблонами и реактивными формами?
- 2. Каковы практические различия между монго и монго?
- 3. Каковы практические различия между while (true) и for (;;)?
- 4. Каковы практические различия между upvar и глобальными командами в tcl
- 5. Каковы практические различия между «ассоциированными» и «индексированными» массивами в PHP?
- 6. Каковы практические различия между компиляторами C в Windows?
- 7. Каковы практические различия между imagick :: INTERLACE_JPEG/INTERLACE_PLANE/INTERLACE_LINE?
- 8. Практические различия между meshgrid и ndgrid?
- 9. Различия между формами LEFT JOIN
- 10. Каковы практические различия между `REPLACE` и` INSERT ... ON DUPLICATE KEY UPDATE` в MySQL?
- 11. Каковы практические различия между методом модуля и методом класса в Ruby?
- 12. Каковы различия между этими вставками?
- 13. Каковы различия между типами запросов?
- 14. Каковы различия между следующими кодами
- 15. Практические различия между графиком потока управления и графиком вызова (потока?)?
- 16. Практические различия между SVG и Canvas внутри ggvis & Shiny контексте
- 17. Практические различия между использованием TPL и шаблоном Async
- 18. Практические различия между Rails 2.3.14 и 3/3.2?
- 19. Каковы различия между OLEDB и ODBC?
- 20. Каковы различия между управляемыми и неуправляемыми библиотеками?
- 21. Каковы различия между MSBuild и TFSBuild
- 22. Каковы различия между MySQL = и <>
- 23. Каковы основные различия между ASP.net и PHP?
- 24. Каковы различия между php5 и php5-Dev
- 25. Каковы различия между слоями и расширяемыми эффектами?
- 26. Каковы различия между запросами linq и linqToSql?
- 27. Каковы отношения/различия между видимостью и порядком?
- 28. Каковы различия между CClientDC и CWnd :: GetDC
- 29. Каковы различия между MediaPlayer, MediaSessionCompat и RemotePlaybackClient
- 30. Каковы различия между препроцессорами C и C++?
Возможный дубликат [Можно ли безопасно игнорировать разницу между макросом и встроенным?] (Http://stackoverflow.com/questions/5120780/can-one-safely-ignore-the-difference-between- a-macro-and-a-built-in) – amalloy