Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Struct 更新整个结构_Struct_Scheme_Set_Racket_Assign - Fatal编程技术网

Struct 更新整个结构

Struct 更新整个结构,struct,scheme,set,racket,assign,Struct,Scheme,Set,Racket,Assign,假设我有一个返回结构的函数: (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)) ; th

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

(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

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

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


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

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


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

如果您总是想保留最后一层,那么您可能更喜欢在每次构建最后一层时设置最后一层。像这样

(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))))
注意:如果真正的问题是
最后一层的“恒定性”
,那么将自己构建为一个小抽象:

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

如果您总是希望保留最后一层,那么您可能更喜欢在每次构建最后一层时设置最后一层。像这样

(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))))
注意:如果真正的问题是
最后一层的“恒定性”
,那么将自己构建为一个小抽象:

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

如果用户正在进行
设置在REPL,如果定义在模块中,则可能无法工作。Racket通过模块的主体来确定哪些绑定是常量,以及模块主体本身是否未设置
绑定,它不允许REPL
设置也可以。请参阅:。如果是这种情况,则用户可以在
顶面
的第一个定义的正下方添加以下内容:
(设置!顶面顶面)
。它看起来像一个无运算,但它让Racket相信,
top-side
不应该被视为模块绑定常量。谢谢,dyoo<代码>(set!top side top side)
真的解决了这个问题。不幸的是,我在语言窗口中没有找到任何有用的信息。如果用户正在进行
设置在REPL,如果定义在模块中,则可能无法工作。Racket通过模块的主体来确定哪些绑定是常量,以及模块主体本身是否未设置
绑定,它不允许REPL
设置也可以。请参阅:。如果是这种情况,则用户可以在
顶面
的第一个定义的正下方添加以下内容:
(设置!顶面顶面)
。它看起来像一个无运算,但它让Racket相信,
top-side
不应该被视为模块绑定常量。谢谢,dyoo<代码>(set!top side top side)
真的解决了这个问题。不幸的是,我在语言窗口中没有找到任何有用的信息。