TLDR: вам просто нужно указать значение класса.
Форма struct
определяет методы доступа, сеттеры, предикат, конструктор и т. Д. c. Поэтому вам необходимо предоставить их все, если вы хотите, чтобы ваш клиент имел полную возможность манипулировать структурами:
(struct foo (bar) #:mutable)
;; this defines
;; constructor: foo
;; accessors: foo-bar
;; setters: set-foo-bar!
;; predicate: foo?
Форма class
, с другой стороны, возвращает значение класса первого класса, и не определяет ничего вообще. Тогда значение класса можно использовать с помощью форм, таких как new
и send
(которые уже предоставлены #lang racket
).
(class object% (super-new))
;; this defines nothing, but results in a class value
Таким образом, достаточно просто указать идентификатор, связанный с этим классное значение. Вот пример:
;; lib.rkt
#lang racket
(define human%
(class object% (super-new)
(define/public (speak)
(displayln "hello world!"))))
(provide human%)
;; client.rkt
#lang racket
(require "lib.rkt")
(send (new human%) speak)
;; display hello world!