构造 child 记录类型时的 Arity 不匹配

Arity mismatch when constructing a child record type

我有一个 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)    
)

当我 运行 上述方案 shell 中的定义时,一切正常。我可以正确构造 point 类型。但是,当我尝试按如下方式构造 cpoint 类型时:

(define p2 (make-cpoint 8 9 'red))

我收到以下错误:

; ...rfi/9/record.rkt:100:28: arity mismatch;; the expected number of arguments does not match the given number; expected: 1; given: 3; [,bt for context]

我认为既然 cpointpoint 的 child,它应该在其构造函数中接受 point 类型的参数。

我怎样才能完成这项工作?

P.S我是 Scheme 新手。

SRFI-9 中没有 child 条记录。因此你需要单独指定它们:

(define-record-type cpoint 
  (make-cpoint x y color)
  cpoint?
  (x cpoint-x)
  (y cpoint-y)
  (color cpoint-color))

因此 cpointpoint 获取 xy 的访问器是不同的。

具有 parents

的备选方案

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