如何在Guile scheme repl中很好地打印对象

时间:2018-05-05 17:59:19

标签: scheme guile

我在Guile Scheme 2.2.3中使用GOOPS。如果我的代码如下:

(use-modules (oop goops))

(define-class <vec3> ()
  (e0 #:init-value 0.0 #:init-keyword #:e0)
  (e1 #:init-value 0.0 #:init-keyword #:e1)
  (e2 #:init-value 0.0 #:init-keyword #:e2))

(define (make-point x y z)
  (make <vec3> #:e0 x #:e1 y #:e2 z))

当我在REPL中使用(make-point)并询问返回的值时,它看起来像这样:

scheme@(guile-user)> (define p0 (make-point 1 2 3))
scheme@(guile-user)> p0
$1 = #<<vec3> 556b26c087b0>

我是否可以通过某种方式覆盖Guile REPL使用的对象打印,以便我可以很好地打印p0(比如说​​)字段?

1 个答案:

答案 0 :(得分:2)

Guile GOOPS似乎提供了displaywrite的原始通用方法。所以你需要做的就是把它们专门化。

参考:https://www.gnu.org/software/guile/manual/html_node/GOOPS-Object-Miscellany.html#GOOPS-Object-Miscellany

使用此功能,您可以编写write这样的内容:

(define-method (write (o <vec3>) out) 
    (display "#<vec3 " out)
    (display (slot-ref o 'e0) out)
    (display ">" out)
    (newline out))

注意:Guile的REPL使用write程序打印评估结果。

display也是如此。