1

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

(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

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

4

2 回答 2

1

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

根据您将使用存储结果的确切位置(我无法从问题中的代码中看出),您可以将其作为函数参数传递,从而不再需要使用全局变量。这可能是一个更好的主意,在 Scheme 中不鼓励依赖全局状态和变异(set!操作)。

于 2013-03-06T18:37:01.287 回答
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))))
于 2013-03-06T18:59:40.370 回答