gpt4 book ai didi

macros - 导致不卫生的宏的单个 namespace 是什么? (在 LISP 中)

转载 作者:太空宇宙 更新时间:2023-11-03 18:35:04 26 4
gpt4 key购买 nike

有人声称 LISP 中的单个命名空间会导致不卫生的宏。 http://community.schemewiki.org/?hygiene-versus-gensym

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

拥有单一、双重或多重命名空间究竟是什么导致宏观卫生?

最佳答案

Lisp-2 意味着你有两个 namespace :一个用于函数,一个用于其他东西。

这意味着您不太可能无意中在宏中重新绑定(bind)函数值(或 var 值)。

在 Lisp-1 中,因为只有一个 namespace ,所以您(从统计上来说,但实际上并非如此)命中现有定义的可能性是原来的两倍。

在现实中,Lisp-1 的卫生覆盖了诸如 gensym 和 Scheme 的令人困惑的范围广泛的 syntax-structure 之类的宏,以保持卫生。

据我所知,这个问题主要是一个稻草人的争论:它只是较差或较旧的实现中的一个问题。

Clojure 通过 gensym 或阅读器宏 myvar# 提供卫生宏(# 本质上是 gensym) .

而且您不必担心局部作用域会在您的宏中重新绑定(bind)您的函数,或者: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#

关于macros - 导致不卫生的宏的单个 namespace 是什么? (在 LISP 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3487417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com