6

#'fooCommon Lisp のソースをブラウズしていると、人々はどこで'foo十分かを使用することが最も多いことに気付きました。つまり、関数指示子が受け入れられる場所であればどこでも、関数を渡すことを選択します。

もちろんvia などで が定義されている#'foo場合は必要です。私はその仕組みをすべて理解しています。私の質問はスタイルの 1 つです。人々がvsについて考えたくないという理由だけで、前者は時々うまくいかないので、後者を使用しますか? そうだとしても、 becauseの使い方は説明しませfooflet'foo#'foo#'(lambda ...)#'

CL は のせいで醜いと言われることもありますが#'、ほとんどの初心者は (あえて言いますが) ほとんどの場合、CL が不要であることを認識していません。私は新参者ではありませんが、たまたま好き'fooです。なぜ私は珍しいのですか?と に記号を与えるコードを公開するfuncallapply、嘲笑されたり屈辱を与えられたりするでしょうか? 私は、私の地域で関数指定子匿名の章を開始することを検討しています。関数指定子を使いたいと思っている人もいると思いますが、仲間からの圧力のために、それについて「カミングアウト」することを恐れています。

4

3 に答える 3

6

を使用する方が概念的に単純です。無名関数、 を呼び出すことによって取得される関数、または で参照される関数のいずれ#'を扱う場合でも、常に関数オブジェクトを参照しています。これを考えると、シンボルをorに渡すことは、関数オブジェクトを渡すほど直感的ではない奇妙な特殊なケースです。compile#'mapfuncall

:testただし、への引数の場合など、概念的にはシンボルの方が間違いなく適切な場合がありますmake-hash-table。この場合、キー比較関数の名前で指定された 4 つの異なる種類のハッシュ テーブルから 1 つを選択しています。関数オブジェクトを使用して、ある種類のハッシュ テーブルと別の種類のハッシュ テーブルを区別しても意味がないため、この場合はシンボルを好みます。(また、任意の等価述語を に渡すことができると信じ込ませる傾向があるため、誤解を招くこともありますmake-hash-table。)

于 2011-10-10T19:21:13.070 に答える
3

それらは同じではありません。 'fooは、たまたまfoo関数のグローバル定義への参照であり、スコープが非常に混乱していた昔からの名残りです。

CL-USER(1): (defun foo (x) 1)
FOO
CL-USER(2): (flet ((foo (x) 2)) (mapcar #'foo '(1 2 3)))
(2 2 2)
CL-USER(3): (flet ((foo (x) 2)) (mapcar 'foo '(1 2 3)))
(1 1 1)
于 2011-10-09T20:37:55.060 に答える
1

これらは 2 つの個別のスタイルの決定であり、誰もが自分で行う必要があります。4 つの組み合わせのいずれについても、批判は見たことがありません。

個人的には、関数をより見やすくするため、#'の代わりに使用することを好みます。'私は、これはまったく見苦しくないと思います — 逆に、私はこのより明示的な構文が好きです。とはいえ、Clojure でプログラミングしているので、それを見逃すことはめったにありません。

それでも、私はlambda鋭い引用なしで使用します。これに関する良い議論はLet over Lambdaにあります。そして、元の議論は#'(lambda...ケント・ピットマンに行くと私は信じています.

于 2011-10-09T20:14:53.977 に答える