我在Chez方案中使用了很多(标准的R6R)Hashtables,但是在REPL上与它们合作并不是很好,因为它们只是将其打印为#<eq hashtable>
。我已经写了一个print-table
功能,但是每次我想检查数据时都会继续打电话有点烦人。
看来球拍可以为给定类型进行自定义打印。有什么方法可以在方案中做类似的事情?
chez方案确实允许自定义读取和写作大多数记录,包括Hashtables。Chez方案提供了record-writer
和record-reader
过程,该过程允许自定义用于编写和读取记录的功能:
http://cisco.github.io/chezscheme/csug9.5/objects.html#./objects:s176
该页面上有一些不错的示例,但是一个重要的细节是您可以将#f
指定为作者,而新的记录类型的默认值将使用能够由默认阅读器读取的格式。由于某些类型没有可序列化表示,例如函数。
一旦禁用EQ-Hashtables的特殊打印机和基本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]
不幸的是,看起来有一个带有自定义作者作为Hashtable存储的对象,因此您无法使用默认作者查看条目。