1. ホーム
  2. function

[解決済み] 匿名関数の略記

2023-06-07 02:40:40

質問

無名関数が#(...)という短い記法を使うことについて、理解できないことがあります。

以下は動作します。

REPL>  ((fn [s] s) "Eh")
"Eh"

しかし、これでは

REPL>  (#(%) "Eh")

これは動作します。

REPL> (#(str %) "Eh")
"Eh"

私が理解できないのは、なぜ (#(%) "え")なのかです。 が機能しないこと、そして同時に、私は str ((fn [s] s) "え")。

これらは両方とも無名関数で、ここではパラメータを1つ取ります。 なぜ省略記法は関数を必要とし、他の記法は必要としないのでしょうか?

どのように解決するのですか?

#(...)

の略記です。

(fn [arg1 arg2 ...] (...))

(と書くことができます(ここで、argNの数は本文中の%Nの数に依存します)。だから、書くときは

#(%)

に変換される。

(fn [arg1] (arg1))

のように、最初の無名関数と違うことに注意してください。

(fn [arg1] arg1)

あなたのバージョンはarg1を値として返しますが、短縮形を展開したバージョンはそれを関数として呼び出そうとします。文字列は有効な関数ではないので、エラーが発生します。

省略記法は本文を囲む括弧のセットを提供するので、単一の関数呼び出しまたは特別なフォームを実行するためにのみ使用できます。