2009-03-26 7 views
15

私は優れたClojureチュートリアルhereを見ています。それは次の行に沿ってClojureのコードを持っている例の一つでは:なぜ "(def aowou?(set" aeiou "))"は動作しますか?

(def vowel? (set "aeiou")) 

これは母音は母音のために真と子音のためにfalseを返します:

(vowel? (first "abc")) ; => true 
(vowel? (first "cba")) ; => false 

これはなぜでしょうか?変数名の背後にある疑問符と何か関係があると仮定しています。編集

...チュートリアルですぐに


を何かを見つけることができませんでした私はちょうどvowel?が真か偽ではなく、要素自体またはnilを返しません実現。私自身の答えを見てください。

答えて

16

これはマップ(Clojureの最も自然なオブジェクト)の仕組みと全く同じです。マップは関数として呼び出されたときに、それがマッピングとして動作します。

user=> (def ob {:foo "bar", :bar :baz, :qwerty 42}) 
#'user/ob 
user=> (ob :foo) 
"bar" 

だから、Clojureのセットは関数として呼び出すことができるという意味になり、会員のテストとして動作します。あなたはマッピングのキーとしてキーワード(コロンで始まるそれらのもの)を使用する場合はセットで

user=> (:bar ob) 
:baz 

も同じことを行うことができますのでところで、彼らはまた、同様の機能を働きますキーワード:

user=> (def vowel-keywords (set [:a :e :i :o :u])) 
#'user/vowel-keywords 
user=> (:a vowel-keywords) 
:a 
user=> (:b vowel-keywords) 
nil 

しかし、再び、この後者のトリックはキーワードだけではなく、あなたはセットでのマッピングやメンバーのキーとして使用する場合があります何か他のもので動作します。

7

Aha!私はそれを自分で見つけることになった。実際にはtrueまたはfalseを返すのではなく、セット内の最初のオカレンスを返します。発生しない場合はnilを返します。

これを条件として使用することができます(nilはfalse、nil以外はtrue)。これは、文字列に文字が含まれているかどうかをチェックするためのちょっとしたハックとして機能します。

(vowel? (first "abc")) ; => "a" 
(vowel? (first "cba")) ; => nil 

(if (vowel? (first "abc")) 
     (println "yay") 
     (println "oops")) ; => "yay" 
+0

私に聞こえる音。疑問符は、テストとして使用できることを示します。副作用のある関数については、しばしば感嘆符が表示されます。彼らは言語の一部ではなく、彼らはリスプの伝統です(あなたは "危険な"ものから安全な機能を知っています)。 – MBCook

+2

これを明確にするには?そして! aやbのような文字だけで、名前のシンボル(\、/、*、 - 、+など)に使用できます。 Lispには特定のシンボルの名前を付ける伝統がありますが、方言には小さな違いがあります。 – Svante

+0

ああ、ありがとう@Svante!私は "魔法のようなものがあると思った?" :) – Epaga

関連する問題