私は新しい言語としてLispを手に入れようとしています。関数の一部を渡されたリストの各要素に作用させる方法を検討しています。defunを引数としてリスト
リストの要素の1つは0です(代わりに、単に0を返す)ときは、この問題を回避する方法を学習する目的のために、私は分裂のかなり基本的な形を記述しようとしていますがcroakしていません
(defun divtest (elements)
(dolist (x elements)
(if (zerop x) 0())
(/ elements)))))
得どちら
(divtest '(20 2 5))
:として
は、私はこれを実行しよう
*** - /: (20 2 5) is not a number
失敗のポイントは、関数に渡す前にリスト内の要素を "抽出"していないという事実に根ざしているようです(この場合、xは決して0に評価されないので、/ dolistは意図したとおりに動作しません)。 もし私が正しければ、誰かがこの「抽出」を実行する方法を教えてもらえますか?
注:この質問はone that I've asked earlierに関連しているが、私は前の回答のどの部分について不明確だとして、私は基本的に、さらに行くことにした。この特定の問題を意図したように、実際にそれが動作することができ
APPLYの代わりにREDUCEを使用 –
好奇心が強い:それの有用性は何ですか? – Hugh
この方法で、CALL-ARGUMENT-LIMIT(標準CL定数)の最大長だけでなく、任意の長いリストを処理することができます。 Common Lispには実装に依存する引数の最大数があります。この数は50以上でなければなりません。つまり、インプリメンテーションは50個以上の引数をサポートする必要があります。したがって、上記の関数は、数値のリストが関数/を呼び出す引数の数よりも長い実装では失敗する可能性があります。 –