构造 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]
我认为既然 cpoint
是 point
的 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))
因此 cpoint
和 point
获取 x
和 y
的访问器是不同的。
具有 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)
我有一个 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]
我认为既然 cpoint
是 point
的 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))
因此 cpoint
和 point
获取 x
和 y
的访问器是不同的。
具有 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)