更新整个结构(Update the whole structure)

2019-09-27 06:35发布

假设我有一些函数返回一个结构:

(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

请告诉我什么是做我想做的正确方法

Answer 1:

您正在使用什么语言? 现在看来,这是配置的问题,因为在原则上,你正在做的事情应该工作。 转到“选择语言”窗口(在Windows中按Ctrl + L),点击“显示详细信息”,看看语言的当前使用的选项之一不允许的变量重新定义。 或者,尝试使用不同的语言。

根据你要去什么地方使用存储的结果(我不能从问题的代码告诉),你可以围绕把它作为函数的参数,以这样的方式,使用全局变量不再是必要的。 这可能是一个更好的主意,依靠全局状态和变异(的set!操作)的方案被劝阻。



Answer 2:

如果你总是想保持周围的最后一层,那么你可能更喜欢设置的最后一个层,每次一个是内置。 像这样。

(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))))


文章来源: Update the whole structure