gpt4 book ai didi

common-lisp - Sharpsign Colon 和 Gensym 之间的差异

转载 作者:行者123 更新时间:2023-12-03 06:14:31 25 4
gpt4 key购买 nike

我刚刚阅读了 Sharpsign 冒号读取器宏,听起来它与 gensym 具有非常相似的效果

Sharpsign Colon: "introduces an uninterned symbol"

Gensym: "Creates and returns a fresh, uninterned symbol"

简单的测试

CL-USER> #:dave
; Evaluation aborted on #<UNBOUND-VARIABLE DAVE {1002FF77D3}>.
CL-USER> (defparameter #:dave 1)
#:DAVE
CL-USER> #:dave
; Evaluation aborted on #<UNBOUND-VARIABLE DAVE {100324B493}>.

很酷,所以它应该失败。

现在进行宏观测试

(defmacro test (x)
(let ((blah '#:jim))
`(let ((,blah ,x))
(print ,blah))))

CL-USER> (test 10)

10
10
CL-USER>

很不错,所以它可以像 gensym 那样使用。

对我来说,这看起来比 gensym 更干净,并且结果明显相同。我确信我错过了一个重要的细节,所以我的问题是,它是什么?

最佳答案

每次展开宏时,都会使用相同的符号。

(defmacro foo () `(quote #:x))
(defmacro bar () `(quote ,(gensym)))

(eq (foo) (foo)) => t
(eq (bar) (bar)) => nil

Gensym 将在每次求值时创建一个新符号,但尖冒号只会在读取时创建一个新符号。

虽然使用尖冒号不太可能引起问题,但在极少数情况下使用它会导致几乎不可能发现错误。为了安全起见,最好始终使用 gensym。

如果你想使用像尖冒号这样的东西,你应该看看 defmacro!来自 Let Over Lambda 的宏。

关于common-lisp - Sharpsign Colon 和 Gensym 之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28274635/

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