2010-11-19 7 views
2

LISPはもう一度私を悩ます...リストの最後の要素の値を取得できないのはなぜですか?私はこれに似た設定のリストがあります:最後の要素のLISP車?

(setq bar '(((1 2) 3 4 5)((6 7) 8 9 10))) 

を今、私は4のリターンを得る:

(cdddar bar) 

(caddar bar) 

を用(5)のリターンがありますしかし、私は5を得ることができません:

(cadddar bar) 

これはなぜですか? d 5の価値をどうやって得るのですか?

エラー:

; Warning: This function is undefined: 
; CADDDAR 

Error in KERNEL:%COERCE-TO-FUNCTION: the function CADDDAR is undefined. 
[Condition of type UNDEFINED-FUNCTION] 

答えて

8

5つ以上のaとdの関数は定義されていません。わずか4以下です。実用的であるためには、その長さの可能な機能が多すぎます。

あなたはそれを綴るする必要があります。そのうちの32があるかもしれないので、以上の4 a秒とd sの機能が標準で定義されていない (car (cdr (cdr (cdr (cdr (car x))))))

+0

答えは:(car(cdddar lst))....今、なぜこれ!= cadddar、私は分かりません。 – toast

+2

LISP実装の奥深くのどこかに、 (defun cadr(x)...) (defun cdar(x)...) (defun caar(x)...) (defun cddr x)...) などの長さ1〜4の 'a'と 'd'のすべての組み合わせについては、仕様には長さ5のものは含まれていません。 #cdadrファミリの機能には何も特別なものはありません。それらは一意的に解釈されると解析されません。彼らはただの正常な機能です。ギャップを埋めるためにいくつかの新しいものを歓迎するよりも(defun ...) – jtdubs

2

まあ、エラーメッセージごとに、何cadddar機能はありません。 carcdrは、基本的なリスト読み取り機能です。 caddarのようなものは、carcdrの1つ以上の組み合わせで構築された便利な機能です。つまり、carとなどが存在しない場合は、cdrだけでリスト操作を行うことができます。拡張機能は、あなたの人生を少し楽にします。

これに近づく方法は、carcdrを使用して自分自身のcadddarを合成することです。これを行う方法がすぐにわからない場合は、より簡単に(たとえばcadrまたはcdarなど)開始し、cadddarになります。

1
(first (last (first '(((1 2) 3 4 5) ((6 7) 8 9 10))))) 

-> 5 
1

[およびそれそれから指数関数的に厄介になる]。 、最後のコンスセルを返すので

(car (last list)) 

はあなたに最後のリスト要素を与えるlast:リストの最後の要素を取得する

確実な方法。もちろんlist(first list)のようなものかもしれません。

関連する問題