我在 Chez Scheme 中使用了很多(标准 R6RS)哈希表,但在 REPL 中使用它们并不是很好,因为它们只是打印为#<eq hashtable>
. 我已经编写了一个print-table
函数,但是每次我想检查我的数据时都继续调用它有点烦人。
看起来 Racket 有一种方法可以为给定的类型进行自定义打印。有没有办法在Scheme中做类似的事情?
我在 Chez Scheme 中使用了很多(标准 R6RS)哈希表,但在 REPL 中使用它们并不是很好,因为它们只是打印为#<eq hashtable>
. 我已经编写了一个print-table
函数,但是每次我想检查我的数据时都继续调用它有点烦人。
看起来 Racket 有一种方法可以为给定的类型进行自定义打印。有没有办法在Scheme中做类似的事情?
Chez Scheme 允许自定义读取和写入大多数记录,包括哈希表。Chez Scheme 提供了一个record-writer
和record-reader
过程,允许自定义用于写入和读取记录的函数:
http://cisco.github.io/ChezScheme/csug9.5/objects.html#./objects:s176
该页面上有一些很好的示例,但一个重要的细节是,您可以将#f
新记录类型的默认值指定为写入器,它将使用能够被默认读取器读回的格式。这不会 100% 起作用,因为有些类型没有可序列化的表示,比如函数。
一旦我禁用 eq-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]
不幸的是,看起来有一个带有自定义写入器的对象作为哈希表存储的一部分,因此您不能使用默认写入器来查看条目。