私は学校でLispを勉強しています。作成しなければならないプログラムの1つは、mapcanを使ってremove-if-notの機能を複製するものです。私はプログラムを作成し、正しく動作しますが、私は出力を理解していません。なぜこのプログラムは原子のリストを返しますか?
私が実行した場合具体的には、:
(findall 'numberp '(1 a 3))
出力は次のとおりです。(1 3)
プログラムは以下の通りです:
(defun findAll (fct l)
(cond
((null l) nil)
((mapcan (lambda(x) (if (funcall fct x) (list x) nil)) l))
)
)
ソリューションの私の理解があります次のようになります: "リストの要素のそれぞれについてlambda関数を呼び出します。関数の結果がフィットし、要素xがtrueを返した場合、要素su最終的に "list(x)"を連続して呼び出すと、(1 2)のようなアトムのリストが返されます。
しかし、なぜ最終結果が一緒に追加されますか?単なるリストの束ではありませんか? – edoreld
@edoreld:MAPCANはこれを行います。そのドキュメントを参照してください:http://www.lispworks.com/documentation/HyperSpec/Body/f_mapc_.htm#mapcan –