1

Pretty Big を使用した Dr.Scheme のこのコードの何が問題になっていますか? 過去に同様のことを問題なく行ったことを覚えているようです。

(lambda (x y) (set! (Frame-variables res) (append (Frame-variables res) (list (cons x y)))))

次のエラーが返されます。

set!: not an identifier in: (Frame-variables res)

(set! (Frame-variables res) ... )もちろん、リストが実際に変更されないことを除いて、その部分を省略しても問題なく動作します。2番目のものは認識し(Frame-varialbes res)ますが、最初のものは認識しませんか? set!またはその文脈での取引は何ですか?

Frameリストであるvariablesフィールドで呼び出された構造体があることを認識していただければ幸いです。

4

1 に答える 1

4

問題:

どのように設定!動作します。実際に行うことは、メモリ内のどこかにぶら下がっているオブジェクトに名前をバインドすることです。set! を実行すると、その名前が参照するものが変更されます。

それはエラーです:(Frame-variables res)は識別子ではないため、他のものを参照することはできません。

修正:

あなたがしようとしているのは、構造体のメンバーを変更することです。あなたがする必要があるのは、その構造メンバーを可変に変更してから、作成されるミューテーターを使用することです。

(define-struct frame (a b ... c [variables #:mutable] e ...))

次に、使用できます

(set-frame-variables! res (list "new" "value"))

これにより、必要に応じて構造が変更されます。

講義:

プログラムに適したデザインを選択しているかどうか疑問に思っています。リストへの変更と追加はどちらも、Scheme の設計に疑問を抱かせる操作です。

また、あなたがしていることは、変数の名前に基づいて、変数の連想リストを維持しようとしているようです。これはあまり効率的ではありません。おそらく、ハッシュ テーブルのようなものを検討する必要があります。

関連ドキュメント:

http://docs.plt-scheme.org/reference/define-struct.html#(form._((lib._scheme/base..ss)._define-struct))

于 2009-12-10T05:23:08.457 に答える