2011-10-21 8 views
4

私は学校のスキームの割り当てに取り組んでいます。レコード "タイプ"(リストとして実装されています)(音楽レコードを表す)を定義する質問があります。スキーム:レコードのリストへの追加

私は問題を抱えていますが、これらのレコードのリストを作成するプロシージャを作成してから、このリストにレコードを追加するように求められます。これはかなりシンプルですが、何か間違っているような気がします。

リスト(つまり、この例ではレコードシェルフ)に要素を追加する方法はわかりましたが、このadd関数の呼び出しでこのリストを適切に維持する方法がわかりません。ここに私が持っているものがあります:

(define (add-record record lst) 
    (append lst (list record))) 

これは私が期待しているように動作しますが、私の問題はこの手順を呼び出すときです。

(define record-self '()) 

は私の最初の試みでしたが、もちろん、私はそれだけで定義されたrecord-shelfリストを渡し、add-record手順でレコードを追加するたびに、よく、私の追加機能、すなわちコピー(ブランドの新しいリストを返し、追加されたレコードで)。これは理にかなっていますが、それが私の望むものかどうかはわかりません。だから、

私はそうのようなリストにレコードの束を追加したい場合:

(add-record highway61 record-shelf) 
(add-record sgtPepper record-shelf) 

もちろんrecord-shelfが更新されませんので、それは、私が欲しいものにはなりません。そして私は、この時点ではset!または割り当てを使用するはずだとは思わない。

毎回、返されたリスト(add-record)のコピーを取得して、その呼び出したリストを次の呼び出しで使用するだけでよいですか?

+0

関数型プログラミングでは、グローバル変数を避ける必要があります。あなたの最終的な質問への答えは「はい」です。 '(追加レコードsgtPepper(レコード追加ハイウェイ61レコードシェルフ))' – Enrique

+0

ところで、非常によく表現された質問です。 – JasonFruit

答えて

3

ステートフルな動作を望みます。エンリケが言っているように、あなたの最後の質問に対する答えははいです。

新しいレコードをリストの先頭に挿入するだけの理由はありますか?それはLispのリストに項目を追加する慣用的な方法です。あるいは、単独でリンクされたリストを使用する任意の関数言語で記述することができます。

(define (add-record record lst) 
    (cons record lst)) 

(define newshelf (add-record 36chambers oldshelf)) 

あなたが何らかの形でset!を使用せずにadd-recordを起動した後record-shelfは新しい項目が含まれているようにする方法はありません。

関連する問題