Несоответствие 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)
Другие вопросы по тегам