18

ドキュメントでこれを見つけるのを手伝ってくれるかもしれません。実行前に未評価の関数名を渡すことができるように、ポンド引用符を使用しています。例えば:

(#'cons 1 ())
;(1)

(defn funcrunner [func a b]
  (func a b))

(funcrunner cons 'a ())
;(a)

(funcrunner 'cons 'a ())
'()

(funcrunner #'cons 'a ())
;(a)

#'cons
;#'clojure.core/cons

(resolve (symbol 'cons))
;#'clojure.core/cons

私の推測では、これはリーダー マクロです。

私の質問は (a) ポンド クォート (#') の略記は何ですか? (b) それが何をしているのか説明できますか? (c) ドキュメントで見つけられますか? (d) 実際には for resolve および symbol 関数の短縮形ですか?

PS - 米国以外の場合 - # は「ハッシュ」または「クロスハッシュ」とも呼ばれます。

PPS - 私の例では、これが多少冗長になる必要があることは承知しています。これが完全に冗長なのか、特定のユースケースがあるのか​​ を知りたいです。

4

2 に答える 2

31

#'に展開されるリーダーマクロです(var foo)。ここで行っているのは、未評価の関数を渡すことではなく、関数を含む変数を渡すことです。これがそのように機能する理由は、varsが含まれている値を検索し、それを呼び出す関数であるためです。

user=> (defn foo [x] (+ x 10))
#'user/foo
user=> (#'foo 10)
20
user=> ((var foo) 10)
20

関数を定義すると、varが返されることに注意してください。あなたがやっていることのように見えます!:)

于 2012-06-08T08:22:15.637 に答える
5

#'のリーダーマクロですvarhttp://clojure.org/special_forms#varおよびhttp://clojure.org/varsを参照してください

(var foo)シンボルで指定された変数を返しますfoo。これは、関数を含むあらゆる種類の値を保持できます。

于 2012-06-08T08:20:47.443 に答える