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)に移動し、[詳細を表示]をクリックして、現在使用されている言語のオプションの1つで変数の再定義が許可されていないかどうかを確認します。または、別の言語を使用してみてください。

保存された結果を正確に使用する場所に応じて(質問のコードからはわかりません)、グローバル変数を使用する必要がなくなるように、関数パラメーターとして渡すことができます。これはより良いアイデアかもしれません。Schemeではグローバルな状態とミューテーション(set!操作)に依存することはお勧めしません。

于 2013-03-06T18:37:01.287 に答える
0

常に最後のレイヤーを維持したい場合は、ビルドするたびに last-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))))

注:本当の問題が「一定性」である場合は、次の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 に答える