【问题标题】:What does the output value mean when mit-scheme evaluates a list?当 mit-scheme 评估一个列表时,输出值是什么意思?
【发布时间】:2019-12-29 23:04:47
【问题描述】:

如果我评估在mit-schemeREPL 中

(list 1 2 3)

我第一次得到这个

;Value 13: (1 2 3)

那么这是第二次

;Value 14: (1 2 3)

这是第三次

;Value 15: (1 2 3)

值每次加一。

在其他方案 REPL 中,我注意到 ;Value xx 部分根本没有显示。

值是什么意思?我猜这是列表的内存地址?如果是这样,为什么它总是从 13 开始,为什么只显示列表的地址?

快速搜索manual 对我没有帮助。

我正在运行mit-scheme 9.1.1 版

【问题讨论】:

    标签: scheme mit-scheme


    【解决方案1】:

    值是什么意思?

    显示的数字是列表的哈希值。

    1 ]=> (define my-list '(1 2 3))
    
    ;Value: my-list
    
    1 ]=> my-list
    
    ;Value 13: (1 2 3)
    
    1 ]=> (hash-object my-list)
    
    ;Value: 13
    

    (对于版本 10 之前的 MIT 方案,使用 hash 而不是 hash-object)。

    有关散列的详细信息,请参阅MIT/GNU Scheme 参考中有关Object Hashing 的部分。

    为什么[它]只显示列表的地址?

    这是 MIT Scheme 的作者选择编写 REPL 的方式。 MIT Scheme 9.1.1 源代码中src/runtime/rep.scm 的第 491-500 行处理打印 REPL 结果:

    (define (default/repl-write object s-expression environment repl)
      (port/write-result (cmdl/port repl)
                 s-expression
                 object
                 (and repl:write-result-hash-numbers?
                  (object-pointer? object)
                  (not (interned-symbol? object))
                  (not (number? object))
                  (object-hash object))
                 environment))
    

    如您所见,仅当对象是指针(这是一个实现细节)、不是内部符号且不是数字时,对象哈希才会显示在 REPL 中。

    【讨论】:

    • 为什么哈希不是基于列表的内容?创建的第一个列表将始终给出 13 的哈希值,无论其内容如何。但是,另一个具有相同内容的列表将生成不同的哈希。似乎有点反直觉。
    • @David 这是一个实现细节,但“列表的哈希”实际上是指向列表的指针的哈希。在 MIT 方案中,对象的哈希类似于对象的内存地址,只是“哈希数与对象的地址不同,垃圾回收不会改变”(来源:第 11.5 节 Object Hashing来自 MIT Scheme 9.1.1 的参考)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    相关资源
    最近更新 更多