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)
真的解决了这个问题。不幸的是,我在语言窗口中没有找到任何有用的信息。