Несоответствие Arity при построении дочернего типа записи
У меня есть point
Тип записи определяется следующим образом:
(define-record-type point
(make-point x y)
point?
(x point-x)
(y point-y)
)
Теперь я хочу расширить point
тип записи и определите новый тип записи следующим образом:
(define-record-type cpoint
(make-cpoint color)
cpoint?
(color cpoint-color)
(parent point)
)
Когда я запускаю приведенные выше определения в оболочке схемы, все работает нормально. Я могу построить point
печатает правильно. Тем не менее, когда я пытаюсь построить cpoint
введите следующее:
(define p2 (make-cpoint 8 9 'red))
Я получаю следующую ошибку:
;... rfi / 9 / record.rkt: 100: 28: несоответствие арности;; ожидаемое количество аргументов не соответствует данному числу; ожидается: 1; дано: 3; [,bt для контекста]
Я думал с cpoint
это ребенок point
, он должен был принять аргументы point
введите его конструктор.
Как я могу сделать эту работу?
PS Я новичок в Схеме.
1 ответ
В SRFI-9 нет дочерних записей. При этом вам нужно указать их самостоятельно:
(define-record-type cpoint
(make-cpoint x y color)
cpoint?
(x cpoint-x)
(y cpoint-y)
(color cpoint-color))
Таким образом, аксессоры, чтобы получить x
а также y
за cpoint
а также point
разные.
Альтернативы, у которых есть родители
В R6RS у вас есть (rnrs records syntactic (6))
который похож на SRFI-9, но не совместим. Ваш код будет выглядеть так:
#!r6rs
(import (rnrs base)
(rnrs records syntactic))
(define-record-type (point make-point point?)
(fields (immutable x point-x)
(immutable y point-y)))
(define-record-type (cpoint make-cpoint cpoint?)
(fields (immutable c cpoint-c))
(parent point))
(make-cpoint 4 5 'red) ; ==> implementation chosen visual representation, perhaps #cpoint-4-5-red
Вы пометили Racket, и если вы используете язык по умолчанию, #lang racket
, у них есть struct
:
#lang racket
(struct point (x y) #:transparent)
(struct cpoint point (color) #:transparent)
(cpoint 4 5 'red) ; ==> (cpoint 4 5 'red)
я добавил #:transparent
так как это по умолчанию в R6RS. Вы действительно хотите, чтобы имя конструктора было make-xxx
вам нужно указать это:
#lang racket
(struct point (x y)
#:constructor-name make-point
#:transparent)
(struct cpoint point (color)
#:constructor-name make-cpoint
#:transparent)
(make-cpoint 4 5 'red) ; ==> (cpoint 4 5 'red)