2016-04-06 17 views
0

コンスセルをアソシエーションリストに挿入するコードを記述します。例えば は、連想リストLispアソシエーションリストエラー

((1 . a) (3 . c) (4 . d)) 

があり、私は短所は、このプログラムは

((1 a) (2 . b) (3 . c) (4 . d)) 

を生成(2 . b)を細胞に挿入したいが、私のコードは以下の

(car L) should be a lambda expression 

がある例外を発生させ、私のコード

(defun INSERTCELL (R L) 
    (cond ((< (car L) (car R)) cons((car L) INSERTCELL(R (cdr L)))) 
     (t cons(R L)))) 

R(2 . b)であり、L((1 . a) (3 . c) (4 . d))なので、RLに挿入する必要があります。

+2

機能は、 '(短所の引数...)' 'ない短所(引数...)'のように呼ばれています。 – jkiiski

答えて

0

関数はLispで呼び出すcons cellsです:

(cons 1 2) 
==> (1 . 2) 

あなたのコード修正した場合:

(defun insertcell (R L) 
    (cond ((< (caar L) (car R)) (cons (car L) (insertcell R (cdr L)))) 
     (t (cons R L)))) 

を、それは動作します:あなたも(caar L)を行う必要があり

(insertcell '(2 . b) '((1 . a) (3 . c) (4 . d))) 
==> ((1 . A) (2 . B) (3 . C) (4 . D)) 

注意を、 Lがaであるので(car L)ではありません。最初の鍵にアクセスするには、carを2回呼び出す必要があります。

+0

私はopが、func(arg1 arg2)構文の3つ(少なくとも)の場所に十分に滑っていることを指摘していることから利益を得ると思います。地獄、もし私が十分なJSでも私はそれを行うことができます。 :) – kennytilton

1

SDS's answerは、コード内のタイポグラフィ上の問題とその他のバグを処理します。つまり、これを行うための他の方法があるかもしれないことは注目に値すると思います。第一に、関連リストを順番に格納する必要はありません。あなたはあなたのためにする必要がない場合は、単純に先頭に新しい要素を追加するためにaconsを使用することができます。

(let ((alist '((1 . a) (3 . c) (4 . d)))) 
    (acons 2 'b alist)) 
;=> ((2 . B) (1 . A) (3 . C) (4 . D)) 

あなたはソート条件を維持する必要があります場合は、1つのオプションを使用することです上記のアプローチ、その後はsortのリスト。あなたが既に関連リストがソートされていることを知っているので、それはちょっと残念ですが、あなたは新しい要素をその場所に置くだけです。そのために、あなたはあなたの連想リストと新しい要素をマージするmerge機能が内蔵され使用することができます(リストでそれをラップすることによって、それは一つの要素の連想リストです):

(let ((alist (copy-list '((1 . a) (3 . c) (4 . d)))) 
     (new (list (cons 2 'b)))) 
    (merge 'list alist new '< :key 'car)) 
;=> ((1 . A) (2 . B) (3 . C) (4 . D)) 

または

(let ((alist '((1 . a) (3 . c) (4 . d)))) 
    (merge 'list (copy-list alist) (copy-list '((2 . b))) 
     '< :key 'car)) 
;=> ((1 . A) (2 . B) (3 . C) (4 . D)) 

mergeは破壊的です(つまり、引数を変更することができます)。そのため、新しくデータを取得するにはコピーリストをここで使用しています。あなたのケースでは、リストを段階的に構築している可能性が高いので、結果を保存するときにのようにと長いといいでしょう。例えば、

(defun insert-cell (key value alist) 
    (merge 'list alist (list (cons key value)) 
     '< :key 'car)) 
(let ((alist '())) 
    (setf alist (insert-cell 1 'a alist)) 
    (setf alist (insert-cell 4 'd alist)) 
    (setf alist (insert-cell 3 'c alist)) 
    (setf alist (insert-cell 2 'b alist)) 
    alist) 
;=> ((1 . A) (2 . B) (3 . C) (4 . D))