2009-03-26 18 views
15

Mükemmel Clojure eğitimine here bir göz atıyorum. Aşağıdaki satırlar boyunca Clojure kodu vardır örneklerden birinde:neden "(def vowel? (Set" aeiou "))" çalışıyor?

(def vowel? (set "aeiou")) 

Bu sesli harf ünsüzler için ünlüler için doğru ve return false yapar: Neden bu

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

mı? Değişken ismin arkasındaki soru işareti ile bir ilgisi olduğunu varsayıyorum. ... hemen öğretici bir şey bulunamadı


Düzenleme Sadece vowel? doğru veya yanlış dönmez fark ziyade eleman kendisi veya sıfır. Kendi cevabımı gör.

cevap

16

Bu, haritaların (Clojure'daki en doğal nesnelerin) nasıl çalıştığına mükemmel şekilde benzemektedir.

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

yüzden bir Clojure seti bir fonksiyonu olarak çağrılabilir ve üyelik testi olarak çalışacaktır mantıklı: Haritanın bir fonksiyonu olarak çağrıldığında, bu bir eşleme olarak çalışmaktadır. Bir eşleştirme tuşları olarak anahtar kelimeleri (iki nokta üst üste ile başlayan bu şeyler) kullanmak arada, eğer, onlar da benzer işlevleri çalışmak, böylece

user=> (:bar ob) 
:baz 

ve setleri ile bile aynı şeyi yapabilir anahtar kelimeler:

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

Ama yine bu sonuncu hüner yalnızca anahtar kelimelere değil, bir sette haritalama anahtar veya üye olarak kullanabilir başka bir şey ile çalışır.

7

Aha! Kendimi bulmayı bitirdim. Aslında true veya false, daha doğrusu buna oluşmaz ise ilk sette geçtiği veya nil döndürür döndürmez. (true olarak yanlış ve olmayan nil olarak işlenen nil) bir koşul olarak kullanabiliriz çünkü

Ve bu bir dize bir mektup içerip içermediğini kontrol için güzel bir hack olarak çalışmaktadır.

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

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

Bana doğru geliyor. Soru işareti, bir test olarak kullanılabileceğini gösterir. Genellikle yan etkileri olan işlevler hakkında bir ünlem işareti görürsünüz. Onlar dilin bir parçası değiller, lisp gelenekleri (bu yüzden "tehlikeli" olanlardan güvenli fonksiyonları biliyorsunuz). – MBCook

+2

Netleştirmek için? ve ! a ve b gibi karakterlerdir ve bunları sembollerin isimlendirilmesinde kullanabilirsiniz (olduğu gibi \, /, *, -, + ...). Lisp'de belli sembollerin isimlendirilmesi için gelenekler vardır, ancak lehçeler arasında küçük farklılıklar vardır. – Svante

+0

ah, teşekkürler @svante! "?" hakkında büyülü bir şey olduğunu düşündüm. :) – Epaga

İlgili konular