2013-03-06 46 views
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 

請告訴我什麼是正確的方式做我想要的

回答

1

你在用什麼語言?它似乎是一個配置問題,因爲原則上你在做什麼應該可以工作。轉到「選擇語言」窗口(Windows中的Ctrl + L),點擊「顯示詳細信息」,查看當前正在使用的語言的選項是否不允許重新定義變量。或者,嘗試使用不同的語言。

根據其中您準備使用存儲結果(我無法從問題中的代碼中看出),您可以將它作爲函數參數傳遞,以這種方式使用全局變量不再是必需的。這可能是一個更好的主意,依賴於全局狀態和變異(set!操作)在Scheme中是不鼓勵的。

+1

如果用戶在做一個'設置'在REPL,如果定義在模塊中,它可能無法工作。 Racket會通過模塊的主體來確定哪些綁定是常量,如果模塊的主體本身沒有設置綁定,它將不允許REPL「設置」它。參見:http://docs.racket-lang.org/reference/eval.html#(def._((quote._~23~25kernel)._compile-enforce-module-constants))。 – dyoo 2013-03-06 19:11:20

+1

如果是這種情況,那麼用戶可以在'top-side'的第一個定義的下面添加以下內容:'(set!top-side top-side)'。它看起來像一個沒有操作,但它說服了球拍「頂端」不應被視爲模塊綁定常數。 – dyoo 2013-03-06 19:15:27

+0

謝謝,dyoo。 '(set!top-side top-side)'真的解決了這個問題。不幸的是,我在語言窗口中找不到任何有用的信息。 – skobls 2013-03-07 00:06:18

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