2

LISPは私を再び困惑させます...なぜリストの最後の要素の値を取得できないのですか?私はこれに似たリストを設定しています:

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

今、私は4のリターンを受け取ります:

(caddar bar)

次の場合、(5)のリターンがあります。

(cdddar bar)

しかし、私は5を取得できません:

(cadddar bar)

これはなぜですか?また、5の値を取得するにはどうすればよいですか?

エラー:

; Warning: This function is undefined:
;   CADDDAR

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

4 に答える 4

9

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

あなたはそれを綴る必要があります: (car (cdr (cdr (cdr (cdr (car x))))))

于 2010-11-19T04:57:35.300 に答える
2

さて、エラーメッセージによると、cadddar機能はありません。carcdrは基本的なリスト読み取り関数であることに注意してください。他のようなcaddarものは、1つ以上carとの組み合わせから構築された便利な関数ですcdr。つまり、リストの操作はでうまく実行できcar、 etcが存在しないcdr場合caddarは、拡張機能によって作業が少し楽になります。

cadddarしたがって、これにアプローチする方法は、とを使用しcarて独自のを合成することcdrです。これを行う方法がすぐにわからない場合は、より単純なものから始めて(たとえば、cadrまたはcdar)、まで構築しcadddarます。

于 2010-11-19T04:56:58.593 に答える
1
(first (last (first '(((1 2) 3 4 5) ((6 7) 8 9 10)))))

-> 5
于 2010-11-19T08:35:25.193 に答える
1

a4秒以上の関数dは標準で定義されていません。おそらく32個あるためです[そしてそれ以降は指数関数的に乱雑になります]。

リストの最後の要素を取得する確実な方法:last最後のconsセルを返すので、

(car (last list))

最後のリスト要素を提供します。もちろん、のlistようなものである可能性があります(first list)

于 2012-03-26T10:57:43.453 に答える