假设我有一些返回结构的函数:
(struct layer (points lines areas))
(define (build-new-layer height)
...
(layer list-a list-b list-c))
我想跟踪最后返回的结果,如:
(define top-side (build-new-layer 0)) ; store the first result
...
(set! top-side (build-new-layer 0.5)) ; throw away the first result and store the new one
但是,对于该特定代码,我收到错误:
set!: assignment disallowed;
cannot modify a constant
constant: top-side
请告诉我,做什么是正确的方法
答案 0 :(得分:1)
您使用的是哪种语言?这似乎是一个配置问题,因为原则上你所做的应该是有效的。转到“选择语言”窗口(在Windows中为Ctrl + L),单击“显示详细信息”并查看当前使用的语言的其中一个选项是否允许重新定义变量。或者,尝试使用其他语言。
根据其中确切地说你将使用存储的结果(我无法从问题中的代码中得知),你可以将它作为函数参数传递,以这种方式不再需要使用全局变量。这可能是一个更好的主意,在Scheme中不鼓励依赖于全局状态和变异(set!
操作)。
答案 1 :(得分:0)
如果您总是希望保留最后一层,那么您可能更喜欢在每次构建时设置最后一层。像这样。
(define last-layer #f)
(define build-new-layer
(let ((save-layer #f))
(lambda (height)
(let ((new-layer (layer list-a ...)))
(set! last-layer save-layer)
(set! save-layer new-layer)
new-layer))))
注意:如果真正的问题是last-layer
的'常数',那么建立一个小抽象:
(define-values (last-layer-get last-layer-set!)
(begin
(define last-layer-access
(let ((last-layer #f))
(lambda (type . layer)
(case type
((get) last-layer)
((set) (set! last-layer (car layer)))))))
(values (lambda () (last-layer-access 'get))
(lambda (layer) (last-layer-access 'set layer))))