2012-01-19 4 views
23

だから私は指数^を計算する関数に名前を付けるのは良い考えだと思ったが、'^を評価するときにClojure REPLがエラーを生成するので、実際に何か特別なことをするようだ。グーグルがほとんど私にthisを与えたので、私はClojureのキャレットの実際の使用が何であるか疑問に思っていました。Clojureキャレットをシンボルとして使用しますか?

(すべての機能^に名前を付けた後も、それは可能でしょうか?)

答えて

32

^は、それが次のシンボルにメタデータとして^で始まるシンボルを追加するthe readerを告げる「メタ文字は」(それを提供していますあなたは、インスタンスの機能のために、Clojureのは物事のmetaを見て、フードの下でどのように機能するかについて多くのことを学ぶことができIMetasを実装して何か)

user=> (def x ^:IamMeta [1 2 3]) 
#'user/x 
user=> x 
[1 2 3] 
user=> (meta x) 
{:tag :IamMeta} 
user=> 

です:

user=> (meta foo)       
{:ns #<Namespace user>, 
:name foo, :file "NO_SOURCE_PATH", 
:line 5, :arglists ([s])} 

は、これは非常に多くの場合、反射の警告をオンに(set! *warn-on-reflection* true)して、警告が消えるまで、タイプヒントを追加するために、一般的には良いアイデアですtype hints

(defn foo [^String s] (.charAt s 1)) 

のために使用されています。これらのClojureを使用しないと、実行時に関数のオペランドの型が検索されるため、わずかなコストで型を扱う手間が省けます。

PS:これはClojureの1.3.xの VS Clojureの1.2.xの中で異なっている:私の次の好きな読者の文字は、それが次の:)

PPSそれについて学ぶ価値がある、「派遣」の文字#ですClojureのは、あなたがメタ文字を使用する場合、メタデータを構成していません1.2.1:

user=> (def foo ^:foo ^:bar [1 2 3]) 
#'user/foo 
user=> (meta foo) 
{:tag :foo} 

と1.3でそれが「正しいことを行う」ともキーワードは、代わりに「タグ」のオプションは次のとおりです。

user=> (def foo ^:foo ^:bar [1 2 3]) 
#'user/foo 
user=> (meta foo) 
{:foo true, :bar true} 
+0

正確には「シンボルを追加する」ではありません。シンボルはint型のショートカットです。しかし、これは文字列でも機能します。 '^" B ["'。キーワードはオプションに翻訳されます。 '^:foo'は' {:foo true} 'に変わります。最後に、地図自体を指定することができます。 '^ {:タグ文字列:foo true:bar:baz}'。 – kotarak

+0

私は、メタデータが異なるバージョンのclojureで異なって構成されていることにも触れておきたいと思います。1.3では、チェーンメタデータの複製が開始されると思います。^:foo ^:bar [1 3 4] ' –

0

あなたの質問に対する答えは、残念ながら、私のようではありません。 Clojureでは、関数名を^とすることはできません。

私はREPLで、次を試してみました:

user=> (println \^) 
^ 
nil 

これは、バックスラッシュでカラット(^)を逃れることができることを意味するようです。私は名前として\^を使用して関数を宣言しようとした場合しかし、その後、私は、エラーメッセージが表示されます:

user=> (defn \^ [n e] (cond (= e 0) 1 :else (* n (\^ n (- e 1))))) 
IllegalArgumentException First argument to defn must be a symbol 
clojure.core/defn (core.clj:277) 

同じコードは、通常のテキスト名で動作します:

user=> (defn exp [n e] (cond (= e 0) 1 :else (* n (exp n (- e 1))))) 
#'user/exp 
user=> (exp 3 3) 
27 

私があれば喜んだろう私よりもClojure-fuが良い人は私を間違っていると証明することができます! :)

関連する問題