我对方案很陌生,我对引号和符号不太确定。
这是我的理解:
'a
-> a
'()
->(list)
'(1 2 3)
(list 1 2 3)
'(1 . 2)
(cons 1 2)
''a
(quote a)
So:
'(1 . 'a)
(1 quote a) => (list 1 quote a)
我想要实现的是以下。
((let ((x 1) (y 2))
(lambda(f) ,f)) 'x)
-> 1
我向函数发送一个符号,该符号应评估为当前范围,在这种情况下将返回 1。
相反,我有这个错误:
*** ERROR IN #<procedure #4>, (console)@243.32 -- Unbound variable: unquote
就好像 unquote 只能从其内部获得quote
。
编辑
我只是在阅读一些文档并找到了函数:“eval”,它似乎可以满足我的要求。
(define a 'foobar)
(define foobar 2)
(eval a)
-> 2
(define a 'x)
(define f (let ((x 1) (y 2))
(lambda (h) (eval h))))
(f a)
*** ERROR -- Unbound variable: y
(f y)
*** ERROR IN (console)@278.4 -- Unbound variable: y
但我不确定是否真的明白。
这是鸡肉中的堆栈跟踪
Error: unbound variable: x
Call history:
<syntax> (f (quote x))
<syntax> (quote x)
<syntax> (##core#quote x)
<eval> (f (quote x))
<eval> (eval h) <--
编辑2
Eval is Evil 但我想知道它是如何工作的非常重要。
因此,在阅读了 Ankur 的答案后,我很确定这是范围的问题,实际上是这样。因此,据我了解,似乎eval
可能正在尝试使用“全局变量”来评估任何内容。
> (define a 11)
> (define b 'a)
> (eval b)
11
> (let ((a 10)) (eval b))
11
> (let* ((a 10) (b 'a)) (eval b))
11
> (let* ((a 10) (b 'a)) b)
a
> (let* ((c 10) (d 'c)) d)
c
> (let* ((c 10) (d 'c)) (eval d))
*** ERROR -- Unbound variable: c
计划中的 eval 显然是邪恶的!