如何取消引用方案符号



旧的C/C++程序员,我刚刚开始学习/玩scheme,所以我的措辞可能不正确,但。。。

假设我愿意:

(define x 42)
(define y (quote x))

现在用y怎么到42?

我认为这相当于(用C术语(:

int x=42;
int* y=&x;

我想错了吗?如果不是,那么与*y等效的方案是什么?

好的,用上面评论的输入来回答我的问题。。。

符号是而不是指针,但可以像指针一样使用。

如何到达42的具体答案是使用

(eval y)

或者在狡诈中(这就是我正在处理的(

(eval y (interaction-environment))

请参阅@ex-nihilo的评论,了解为什么这样做有效。

我在How do I evaluate a symbol return from a function in Scheme中找到了狡猾的版本?

符号是符号表中的条目。一个绑定到符号的变量(本身是符号表中的一个条目(因此引用了符号表中另一个条目(在这方面类似于指针(。然而,引用的符号在绑定到变量时不必存在,但可以稍后定义,因为在评估符号之前,链接不会被解析。因此

scheme@(guile-user)> (define z 'r)
scheme@(guile-user)> z
$1 = r
scheme@(guile-user)> (eval z (interaction-environment))
ERROR: In procedure memoize-variable-access!:
ERROR: Unbound variable: r
Entering a new prompt.  Type `,bt' for a backtrace or `,q' to continue.
scheme@(guile-user) [1]> ,q
scheme@(guile-user)> (define r #t)
scheme@(guile-user)> (eval z (interaction-environment))
$2 = #t

不确定我会用后来的事实做什么,但有趣的是。

感谢所有帮助我理解这一点的人。

最新更新