2012-04-02 12 views
2

私はSchemeで配列のようなデータ構造を作ろうとしています。それを参照する必要があるので(しばしば変更してください)、それに名前を付けたいと思います。しかし、私が様々なチュートリアルのサイトで読んだことから、後で参照できるようにリストに名前を付ける唯一の方法は、defineです。それはdefineでリストを初期化したように見えることを除いては問題ありませんが、それは前記リストに変更または追加することがより複雑になります。たとえば、私はちょうど(append wordlist (element))をやり遂げることができないようだ、私はいくつかの方法が必要だろう!バンSchemeのリストに名前をつける

基本的に私の質問は以下のとおりです。defineはリストの名前を付ける唯一の希望ですか?もしそうなら、私はその要素を変えることによって跳躍を続けていますか?ありがとう。

答えて

0

(append wordlist (element))は新しいリストを作成しています。あなたは、set!を使って参照を新しいリストにリダイレクトするか、defineを同じシンボルの名前を使って新しいリストへの参照にすることができます。

2

はい、defineです。 Schemeで名前を付ける方法です。 Schemeの通常のリストでは、機能的なデータ構造で作業するときに習得しなければならないことの1つで、不変なので、要素を変更することはできません。もちろん、それに要素を追加したり、要素を削除したりすることはできますが、これらの操作では新しいリストが生成されますが、要素をインプレースで変更することはできません。

もう一つの選択肢は、通常のリストの代わりに変更可能なリストを使うことですが、Schemeを使うことを学んでいるのであれば、まず不変のリストに固執し、不変のデータ。

+0

私の知る限り、スキームリストは不変ではありません。要素を変更するための命令がいくつかあります。 – Vincent

+0

申し訳ありませんが、助けてくれてありがとうございます。背中の代わりに新しい要素を追加すると、もっと簡単に作業できるようになると思います。 – AmberWolfe

+0

@AmberWolfeはそうです!単一リンクリストの先頭は、要素を追加する最も簡単な場所であり、最も効率的なものです。前に追加するのに 'cons'を使い、新しいリストを作成し、元のリストを変更せず、再度保存する必要があることを忘れないでください。 –

1

はい、defineはSchemeの "割り当て"(実際に名前を付ける)方法です。あなたが何らかのパッケージを書いているのであれば、関数全体をラップし、letを使って参照するものを定義することを検討するかもしれません。

もちろん、 "パッケージ"内の関数をアンラップするためには、ある種の抽象化が必要です。一般的な操作と

参照SICP 2.5ビルシステム

http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-18.html#%_sec_2.5

関連する問題