Record error in Scheme/Racket - why do you need to define constructors as mutable?

江枫思渺然 提交于 2019-12-11 14:49:43

问题


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 amutable', immutable',parent', protocol',sealed', opaque',nongenerative', or parent-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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!