Что о едином пространстве имен приводит к антисанитарным макросам? (в LISP)

Некоторое заявление, что единое пространство имен в LISP приводит к антисанитарным макросам. http://community.schemewiki.org/?hygiene-versus-gensym

http://www.nhplace.com/kent/Papers/Technical-Issues.html

Что точно о наличии единственного, двойного или несколько пространств имен приводит к макро-гигиене?

8
задан hawkeye 15 August 2010 в 12:49
поделиться

1 ответ

Lisp-2 означает, что у вас есть два пространства имен: одно для функций, другое для всего остального.

Это означает, что у вас меньше шансов нечаянно перепривязать значение функции (или значение var) в макросе.

В Lisp-1, поскольку пространство имен одно, вы (статистически, но не практически) вдвое чаще попадаете в существующее определение.

В действительности, в Lisp-1 гигиена прикрыта такими вещами, как gensym и запутанным широким набором syntax-structure-подобных макросов Scheme, которые поддерживают гигиену.

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

Clojure предлагает гигиеничные макросы через gensym или макрос для чтения myvar# (# - это по сути gensym).

И вам также не нужно беспокоиться о перепривязке локальной области видимости вашей функции в макросах: в Clojure все чисто:

user=> (defmacro rev [xs] `(reverse ~xs))
#'user/rev
user=> (rev [1 2 3])
(3 2 1)
user=> (let [reverse sort] (rev [1 2 5 3 6]))
(6 3 5 2 1)

А вот немного гигиены переменных:

user=> (defmacro k [] (let [x# "n"] x#))
#'user/k
user=> (k)
"n"
user=> (let [x "l"] (k))
"n"
user=> (let [x "l"] (str (k) x))
"nl"

Обратите внимание на наш сексуальный gensym'd x#.

7
ответ дан 5 December 2019 в 21:15
поделиться