Как сделать так, чтобы объекты печатались красиво в репозитории Guile - PullRequest
0 голосов
/ 05 мая 2018

Я использую GOOPS в схеме Guile 2.2.3. Если у меня есть код как:

(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))

Когда я использую (make-point) в REPL и запрашиваю возвращаемое значение, это выглядит примерно так:

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

Есть ли какой-нибудь способ, которым я могу переопределить печать объектов, используемую в реплее Guile, чтобы я мог красиво напечатать поля p0 (скажем)?

1 Ответ

0 голосов
/ 07 мая 2018

Похоже, что Guile GOOPS предоставляет примитивный обобщенный метод display и write. Так что все, что вам нужно сделать, это специализировать их.

Ссылка: 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))

ПРИМЕЧАНИЕ: REPL от Guile использует write процедуру для печати результата оценки.

То же самое идет display.

...