【问题标题】:Printing hashtables in Scheme (Chez)在 Scheme (Chez) 中打印哈希表
【发布时间】:2018-12-20 11:22:18
【问题描述】:

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

看起来 Racket 有办法为给定的类型执行custom printing。有没有办法在 Scheme 中做类似的事情?

【问题讨论】:

  • 我现在正在考虑使用关联列表,因为它们会打印得更好!此外,在大多数情况下,我希望我的表格中的元素少于 50 个,因此性能可能不会成为太大问题。
  • 我想在评估到哈希表时打印每个键和值可能并不总是可行。
  • 是的,也许这就是它不是默认行为的原因。就像我说的,我的地图会很小,所以也许关联列表会更好。相对有效的不变性的可能性也很有吸引力。

标签: scheme chez-scheme


【解决方案1】:

Chez Scheme 允许自定义读取和写入大多数记录,包括哈希表。 Chez Scheme 提供了一个record-writerrecord-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]

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

【讨论】:

  • 完美,虽然没有我希望的那么方便,但看起来我可以用这个做我想做的事。
猜你喜欢
  • 2022-12-10
  • 2016-11-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 2014-11-30
  • 2017-09-30
相关资源
最近更新 更多