# 'そして無効な関数ですか?


7

リストのすべての値が真実かどうかを確認しようとしています。何らかの理由で、次の(apply #'and lst)エラー:

無効な関数:および

これは私が試し(cl-reduce #'and lst)たときにも起こります。

ただし、(apply #'max lst)正常に動作するようです。

現在、私はを使用(eval `(and ,@lst))していますが、それは醜く感じます。


1
and関数ではなく特殊な形式です。
ダン

2
(cl-every 'identity lst)またはなど、目的の動作をする関数を使用する必要があります(-all? 'identity lst)
wasamasa

@wasamaありがとう。代わりにそれを行います。
PythonNut

回答:


5

これは実際には部分的な回答にすぎません(理由を説明することはできません。また、すでに持っているものを超える回避策を提供することはできません)。

ごとに C-h f and

「Cソースコード」の特別な形式です。

(および条件...)

それらの1つがnilを生成するまでargsを評価し、その後nilを返します。残りの引数は評価されません。argがnilを返さない場合、最後のargの値を返します。

[バック]

したがって、関数のように動作しても、それは1つではありません。のmacro代わりにa を使用すると、同じエラーが生成されandます。


7
関数のようには動作しません。引数の1つがnilになると、引数の評価を停止します。関数でない(and nil (drop 'bomb))限り安全andです。
YoungFrog

3

他の人が言ったことを追加して要約するには:

(functionp 'and) ; ===> nil

話の終わり。

Elispマニュアルから、ノードの機能とは何か

関数functionpを使用して、オブジェクトが関数かどうかをテストできます。

-関数:functionpオブジェクトこの関数はt、OBJECTが任意の種類の関数、つまりに渡すことができる場合に返されfuncallます。なお、functionpリターンt関数名であるシンボル、および特殊な形態のためのリターン「nil」のため。


(私は、マニュアルの新しい中`括弧が嫌いです。ここからマニュアルを貼り付けた後、それぞれを置き換えます。マニュアルの`...'代わりに(まともな)を使用する場合の2倍の労力が必要です‘...’。)


1

関数とは何ですか?

これが発生する理由を理解するには、関数とは何かを知る必要があります。lispフォームを評価するとき(myfunc arg1 arg2 ...)、emacsは最初に何であるかをチェックしmyfuncます。それが関数である場合、EmacsはすべてのLispフォームを評価しarg1arg2など、その関数を呼び出し、myfunc引数として結果のLispオブジェクトで。

前述のように、andは関数ではなく、特殊な形式であるため、必要に応じて引数を評価できます。以前にコメントで述べたように、フォーム(and nil (drop 'bomb))(drop 'bomb)評価されないので安全です。

一方、(apply #'and (list nil (drop 'bomb)))あるため、安全ではないapply です関数はEmacsの最初の評価させ、#'and(結果がシンボルである)、そして評価さ(list nil (drop 'bomb)):あなたは次に何が起こるかを推測して、再度、関数呼び出しで、nilその後、評価され(drop 'bomb)、評価されます。

なぜapply文句を言うのですか?

apply特殊なフォーム(またはマクロ)で使用しようとしても意味がありません。特殊なフォームは特殊な動作をすることができないため、エラーをスローします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.