问题
i'm having trouble defining some code in scheme. I am trying to create a record for a node in Scheme/Racket, so far my code looks as follows:
(define-record-type node
(make-node v l r)
node?
(v tree-value)
(l tree-left)
(r tree-right))
However - when I try and execute I get the following error:
define-record-type: expected a
mutable',immutable',
parent',protocol',
sealed',opaque',
nongenerative', orparent-rtd' clause in: (make-node v l r)
I understand that you can define field types to be mutable, immutable etc. But I can't see why this needs to be a clause in the constructor - and if so where it should be?
Could someone please explain
1)How to get around this error
2)Why it arises
回答1:
Your code is not in accordance with the R6RS standard reference doc, possible definitions are:
#!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))
or
#!r6rs
(import (rnrs) (rnrs records syntactic))
(define-record-type node
(fields
(immutable v tree-value)
(immutable l tree-left)
(immutable r tree-right)))
or
#!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)))
For any of those, you get:
(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
来源:https://stackoverflow.com/questions/19883301/record-error-in-scheme-racket-why-do-you-need-to-define-constructors-as-mutabl