0

私はネット上を見回しましたが、私の質問に対する答えが見つかりません。この投稿の評価を下げることなく、誰かが良い答えを提供してくれたら本当にありがたいです。

Lisp ではcar、私にとって意味のあるcdrようなデータモードで使用されます。'(whatever here)

現在、本Land of Lispで、著者はテキスト エンジンの構築方法を説明していて、突然、次の記述を使用して関数を作成しています。

(defun describe-location (location nodes)
  (cadr (assoc location nodes)))

なぜ彼がリストに対して cadr を実行しているのか、なぜそれがエラーではなく応答を提供するのか尋ねてもよろしいですか? データモード、つまり開始ブラケットの前に引用符を付けるべきではありません'(whatever here)か?

また、なぜ彼は assoc を in(assoc location nodes)と notのように使用しているのですか?(assoc 'garden *nodes*)

2番目の正しい使用方法ではありませんassocか? 全体像を見逃している可能性があるため、これらの重要なポイントを説明してくれる人に本当に感謝します.

どうもありがとう!

4

2 に答える 2

3

ASSOC関数です。Lisp はすべての引数を評価し、これらの値でそれを呼び出します。これが、Lisp での関数評価の仕組みです。

(assoc 'garden *nodes*)
  • Lisp はそれassocが関数であることを認識します。これで、引数が評価されます。
  • Lisp'gardenはシンボル に評価されますgarden
  • Lisp*nodes*は variable の値を評価します*nodes*
  • これらの値でLisp を呼び出しassocます。

今:

(assoc location *nodes*)
  • Lisp はそれassocが関数であることを認識します。これで、引数が評価されます。
  • Lisplocationは variable の値を評価しますlocation
  • Lisp*nodes*は variable の値を評価します*nodes*
  • これらの値でLisp を呼び出しassocます。

たとえば、変数の値がlocationシンボルgardenの場合、上記のassoc式は同じ結果を返します。

于 2014-05-31T07:17:29.987 に答える