gpt4 book ai didi

lisp - 什么是印读一致性?

转载 作者:行者123 更新时间:2023-12-04 22:34:16 25 4
gpt4 key购买 nike

在定义 print-object 方法时它有多重要?

例如,在我看来,SBCL 中的 hash-table 实例违反了这一原则。

最佳答案

打印-读取一致性表示,在 CL 中,如果 *print-readably*是真的,那么打印一个对象应该:

  • 在使用有效的标准可读表读取时,生成与对象相似的打印表示;
  • 或发出 print-not-readable 类型的错误信号.

相似性 有一个稍微复杂的定义,因为它不一定能在单个图像中定义,因为它的全部目的是允许对象被打印,然后在另一个图像中读取。它在 3.2.4.2 中定义规范的,虽然所有3.2.4值得一读。请特别注意,允许实现扩展相似性的定义。

请注意,我上面的定义中存在一些缺陷:特别是我认为其他打印​​机和阅读器控制变量需要具有标准值才能使 *print-readably* 有意义(例如*package**read-default-float-format* 等等。with-standard-io-syntax 是您想要的工具。

最后请注意,在某些情况下,同一实现的多个图像定义了相似性。对于标准未定义其可读打印表示形式的对象,允许实现打印内容,以便 自身 的另一个实例可以重建类似的对象:它不必确保其他实现可以.

这意味着如果您正在定义一种打印对象的机制,那么如果 *print-readably* 为真,它应该以类似的方式打印对象对象将被读取(可能在相同的实现中),或者发出适当的错误信号:它应该做的是以一种不可读的方式悄悄地打印对象,或者以一种读取表示不会被读取的方式返回一个类似的对象。这样做的一个好方法是使用 print-unreadable-object其全部目的是为您确保这一点。

哈希表可能是可读的,也可能不是可读的。在 SBCL 中,它们是:

* (defvar *h* (make-hash-table))
*h*
* (setf (gethash 'foo *h*) 1)
1
* *h*
#<hash-table :TEST eql :COUNT 1 {1002CE5863}>
* (with-standard-io-syntax (print *h*))

#.(SB-IMPL::%STUFF-HASH-TABLE (MAKE-HASH-TABLE) (QUOTE ((FOO . 1))))
#<hash-table :TEST eql :COUNT 1 {1002CE5863}>

#.(...) 形式将在读取时在 SBCL 中(但仅在 SBCL 中)重新创建一个类似的哈希表。

在另一个实现 (Clozure CL) 中,哈希表不可读地打印:

? (defvar *h* (make-hash-table))
*h*
? (setf (gethash 'foo *h*) 1)
1
? *h*
#<hash-table :test eql size 1/60 #x3020012A119D>
? (with-standard-io-syntax (print *h*))

> Error: Attempt to print object #<HASH-TABLE :TEST EQL size 1/60 #x3020012A119D> on stream #<SYNONYM-STREAM to *TERMINAL-IO* #x302000B9DC1D>

关于lisp - 什么是印读一致性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70797208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com