Ракетка: синтаксис модуля для экспорта функций класса publi c - PullRequest
0 голосов
/ 04 марта 2020

Как я могу использовать provide, чтобы module экспортировал все функции publi c из class?

На этом сайте я узнал, как экспортировать все get / установить функции из структуры [1]. Я не нашел никакого синтаксиса для классов.

#lang racket
(provide (struct-out foo-struct))
(struct foo-struct (biz bop))

[1] Как обеспечить все функции, связанные со структурой в Racket

Ответы [ 2 ]

3 голосов
/ 04 марта 2020

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!
3 голосов
/ 04 марта 2020

book.rkt:

#lang racket

(provide book-class%)

(define book-class%
  (class object%
    (field (pages 5))
    (define/public (letters)
      (* pages 500))
    (super-new)))

В другом файле:

#lang racket

(require "book.rkt")

(define class-o (new book-class%))

(send class-o letters)
; => 2500

define / publi c использовался для создания метода в классе publi c, когда класс экспортируется, эту функцию можно использовать с send.

...