2012-06-08 8 views
13

おそらく、これはドキュメントで見つけるのを助けることができます。実行前に評価されていない関数名を渡すことができるようにするためにpound-quoteを使用しています。例:解決とシンボル機能を実行するClojureのpound-quote(ハッシュクォート、# ')ですか?

(#'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)実際には解決とシンボルの機能のために簡略化されていますか?

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

PPS - 私の例ではこれがやや冗長である必要があることを認識しています。私はこれが完全に冗長か、特定のユースケースがあるかどうかを知りたいと思っています。

+0

参照:http://stackoverflow.com/questions/9113387/explanation-about-symbols-and-vars-and-their-differences-in-clojure –

答えて

26

#'は、(var foo)に展開される読者マクロです。あなたがここでやっているのは、評価されていない関数を渡すのではなく、関数を含む変数を渡しているということです。私は、関数を定義したとき、varが返されたことを

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

お知らせ:VARSは彼ら含まれている値を検索し、それを呼び出す関数があるので、これはそれがないように動作する理由があります。あなたがやっているもののように見えます! :)

+2

Anthony Grimes!私はあなたがClojureコミュニティでしてきたことを愛しています。この質問をあなたに答えさせていただきありがとうございます。 – hawkeye

+2

Aw shucks。あなたは大歓迎です。 :) – Rayne

関連する問題