【问题标题】:How do I dereference a scheme symbol?如何取消引用方案符号?
【发布时间】:2021-01-23 22:09:51
【问题描述】:

老 C/C++ 程序员,我刚刚开始学习/玩方案,所以我的措辞可能不正确,但是...

假设我愿意:

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

现在使用 y 如何到达 42?

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

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

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

【问题讨论】:

  • 我还处于学习计划的折腾阶段。我确实理解方案中没有像 C 中那样的固有类型,但是由于可以将符号分配给变量,因此必须有一种方法来获取基础值吗?
  • 这并不是符号的真正用途。让我们倒退一步:为什么你要这样做?解决这个实际问题比尝试改进这个不寻常的解决方案更有成效。
  • 正如我所说,我正在开始学习计划的过程。当我读到符号时,它们让我觉得它们类似于指针,所以我尝试了上述定义序列来测试理论,但我无法找到任何方法来获取基础数据。因此,如果我理解您的响应符号和指针类似?
  • Scheme 中没有(显式)指针,符号一点也不像指针!符号只是不可变的字符串。
  • 好的。然后背对着头挠。谢谢你

标签: scheme symbols dereference


【解决方案1】:

好的,用上述 cmets 的输入回答我的问题...

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

42的具体答案是用

(eval y)

或在诡计中(这是我正在使用的)

(eval y (interaction-environment))

请参阅@ex nihilo 的评论了解为什么会这样。

我在How do I evaluate a symbol returned 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

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

感谢所有帮助我解决这个问题的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2010-11-14
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    相关资源
    最近更新 更多