3

私はLISPに不慣れです、そしてここに私がそのグローバル変数に関して持っている質問があります。

私がやろうとしているのは、キーと値のペアを構造に格納できる「アリスト」を作成することです。これが私のサンプルコードです:

(setq *x* '())

(acons 'apple 'fruit *x*)

*x*

(first *x*)

(apple.fruit)ペアを追加した後の出力は次のようになりxますが、これが(上記のコードのロード((apple.fruit))時に)得られたものです:

CL-USER> 
NIL
((APPLE . FRUIT))
NIL  <--- this is still nil?
NIL

変数に値を追加できない理由がわからないので、誰かがこれを手伝ってくれませんかx

また、アリストに関して別の質問
があります。リスト内の要素をキーで検索する方法はありますか?
たとえば、上記のリストの場合、キーを使用しappleて対応する値を見つけるにはどうすればよいfruitですか?

ありがとうございました

4

2 に答える 2

4

関数aconsには副作用がありません。つまり、変更しません*x*

に固執するsetqの結果を取得するには、結果を取得する必要があります。acons*x*

(setq *x* (acons 'apple 'fruit *x*))
于 2012-10-22T03:12:27.430 に答える
1

関数型プログラミングを行いたい場合、変更可能なグローバル変数は絶対に適していません。

関数型プログラミングは、ほとんどの場合、引数を指定して関数を呼び出すことによる計算に関係しています。

多くの場合、ソリューションは再帰的です。

たとえば、果物とその価格のリストがあり、果物の各カテゴリの合計価格が必要だとします。を使用して再帰的なソリューションを試してみましょうACONS

(defun note-category-price (type price sums)
  (let ((pair (assoc type sums)))
    (if pair
        (progn (incf (cdr pair) price) sums)
      (acons type price sums))))

上記の関数では、関数が を呼び出した結果を直接返すことがわかりますACONS。保存されません。

(defun compute-price-sums (data sums)
  (if (null data)
      sums
    (compute-price-sums (rest (rest data))
                        (note-category-price (first data)
                                             (second data)
                                             sums))))

上記の関数では、再帰呼び出しで拡張データ構造が使用されます。

例:

CL-USER 22 > (compute-price-sums
              '(apple 10 orange 20 banana 10 apple 20
                grape 5 orange 75 apple 30 peach 30
                orange 90 apple 20)
              nil)

((PEACH . 30) (GRAPE . 5) (BANANA . 10) (ORANGE . 185) (APPLE . 80))
于 2012-10-22T14:37:11.603 に答える