【问题标题】:Update the whole structure更新整个结构
【发布时间】:2013-02-21 16:17:24
【问题描述】:

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

(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

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

【问题讨论】:

    标签: struct scheme set racket assign


    【解决方案1】:

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

    具体取决于 where 您将使用存储的结果(我无法从问题中的代码中看出),您可以通过这种方式将其作为函数参数传递不再需要使用全局变量。这可能是一个更好的主意,在 Scheme 中不鼓励依赖全局状态和突变(set! 操作)。

    【讨论】:

    • 如果用户在 REPL 中执行set!,如果定义在模块中,则它可能不起作用。 Racket 会通过模块的主体来确定哪些绑定是恒定的,如果模块主体本身没有 set! 绑定,它也不允许 REPL 到 set! 它。请参阅:docs.racket-lang.org/reference/…
    • 如果是这种情况,那么用户可以在top-side的第一个定义下方添加以下内容:(set! top-side top-side)。它看起来像一个空操作,但它让 Racket 相信 top-side 不应被视为模块绑定常量。
    • 谢谢大佬。 (set! top-side top-side) 真的解决了这个问题。不幸的是,我在语言窗口中没有找到任何有用的信息。
    【解决方案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))))
    

    【讨论】:

      猜你喜欢
      • 2010-12-04
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多