0

スキームでいくつかのコードを定義するのに問題があります。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 amutable', immutable',parent', protocol',sealed', opaque',nongenerative', or parent-rtd' clause in: (make-node v l r)

フィールド型を可変、不変などに定義できることは理解していますが、なぜこれがコンストラクターの句である必要があるのか​​ わかりません。

誰か説明してくれませんか

1) このエラーを回避する方法

2)なぜ発生するのか

4

1 に答える 1

0

あなたのコードはR6RS 標準リファレンス 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
于 2013-11-09T22:26:34.967 に答える