在 Scheme 中打印哈希表 (Chez)

Printing hashtables in Scheme (Chez)

我在 Chez Scheme 中使用了很多(标准 R6RS)哈希表,但在 REPL 中使用它们并不是很好,因为它们只是打印为 #<eq hashtable>。我已经写了一个 print-table 函数,但是每次我想检查我的数据时都要继续调用它有点烦人。

看起来 Racket 有办法为给定的类型做 custom printing。有什么办法可以在 Scheme 中做类似的事情吗?

Chez Scheme 允许自定义读写大多数记录,包括哈希表。 Chez Scheme 提供了一个 record-writerrecord-reader 过程,允许自定义用于写入和读取记录的函数:

http://cisco.github.io/ChezScheme/csug9.5/objects.html#./objects:s176

该页面上有一些很好的示例,但一个重要的细节是您可以将 #f 指定为写入器,这是新记录类型的默认值,它将使用能够被读取的格式默认 reader。这不会在 100% 的情况下起作用,因为有些类型没有可序列化的表示形式,例如函数。

一旦我禁用了 eq-hashtables 的特殊打印机和 base hashtables 的特殊打印机,我就可以看到默认表示:

> (record-writer (record-rtd (make-eq-hashtable)) #f)
> (record-writer
    (record-type-parent
      (record-type-parent (record-rtd (make-eq-hashtable)))) #f)
> (make-eq-hashtable)
#[#{eq-ht icguu8mlhm1y7ywsairxck-0} eq #t #(0 1 2 3 4 5 6 7) 8 0 0]
> (define ht (make-eq-hashtable))
> (eq-hashtable-set! ht 'a "a")
> ht
#[#{eq-ht icguu8mlhm1y7ywsairxck-0} eq #t #(0 #<tlc> 2 3 4 5 6 7) 8 1 0]

不幸的是,似乎有一个对象带有自定义编写器作为哈希表存储的一部分,因此您无法使用默认编写器来查看条目。