在Scheme(Chez)中打印哈希表

时间:2018-12-20 11:22:18

标签: scheme chez-scheme

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

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

1 个答案:

答案 0 :(得分:2)

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

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

该页面上有一些很好的示例,但重要的细节是您可以将#f指定为writer,这是新记录类型的默认设置,它将使用一种能够默认读取的格式读者。由于某些类型没有可序列化的表示形式(例如函数),因此无法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]

不幸的是,看起来好像有一个带有自定义编写器的对象作为哈希表存储的一部分,所以您不能使用默认编写器来查看条目。