方案/球拍中的记录错误-为什么需要将构造函数定义为可变的?

人气:844 发布:2022-10-16 标签: scheme racket

问题描述

在方案中定义某些代码时遇到问题。我正在尝试为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

573