问题描述
在方案中定义某些代码时遇到问题。我正在尝试为Scheme/racket中的节点创建一条记录,到目前为止,我的代码如下所示:
(define-record-type node
(make-node v l r)
node?
(v tree-value)
(l tree-left)
(r tree-right))
但是-当我尝试执行时,收到以下错误:
define-record-type: expected a
可变‘,immutable',
父’,protocol',
密封‘,opaque',
非生成’,或parent-rtd' clause in: (make-node v l r)
我知道您可以将字段类型定义为可变、不可变等。但我不明白为什么这需要是构造函数中的子句-如果是,它应该在哪里?
有人能解释一下吗
1)如何避免此错误
2)原因
推荐答案
您的代码与the R6RS standard reference doc不一致,可能的定义有:
#!r6rs
(import (rnrs) (rnrs records syntactic))
(define-record-type node (fields v l r))
(define tree-value (record-accessor node 0))
(define tree-left (record-accessor node 1))
(define tree-right (record-accessor node 2))
或
#!r6rs
(import (rnrs) (rnrs records syntactic))
(define-record-type node
(fields
(immutable v tree-value)
(immutable l tree-left)
(immutable r tree-right)))
或
#!r6rs
(import (rnrs) (rnrs records syntactic))
(define-record-type (node make-node node?)
(fields
(immutable v tree-value)
(immutable l tree-left)
(immutable r tree-right)))
对于其中任何一个,您将获得:
(define n (make-node 1 2 3))
(display n) (newline)
=> #(struct:node 1 2 3)
(display (node? n)) (newline)
=> #t
(display (tree-value n)) (newline)
=> 1
(display (tree-left n)) (newline)
=> 2
(display (tree-right n)) (newline)
=> 3