2009-02-05 4 views
7

Şimdi bunu bir anlığına anlamaya çalışıyorum.Clojure 'if' üçüncü argümanını hiç değerlendirmiyorsa

(defn is-decimal [astr] 
    (if (. astr (indexOf (int \.))) 
    (Double/parseDouble astr) 
    (Integer/parseInt astr))) 

Bu, yazdığım işlevdir. is-decimal ya "2.5" veya "5" gibi bir şeyden geçmiştir ya da türden bir şeydir, ancak her zaman üçüncü olarak if'un ikinci bağımsız değişkenini kullanır. REPL'de (. astr (indexOf (int \.)))'u test ettim ve iyi çalışıyor gibi görünüyor, başarısız olduğunda -1 döndürüyor ve olmadığı zaman 1 döndürüyor. Bu sorunun olabileceğine inanıyorum. -1 Clojure'de yanlış anlamında değildir. Bunu düzeltmenin bir yolu var mı?

Şimdiden teşekkürler.

DÜZENLEME: Yardımınız için teşekkürler. Bunu yazdıktan hemen sonra bir fikrim vardı. 1 ve -1 için kontrol eden bir yüklem işlevi yazdım. Tam ihtiyacım olan şey. o

cevap

10

(re-find #"\." astr) 

Veya:

bir dize bir karakter içerip içermediğini test etmek istiyorsanız, bir normal ifadeler kullanabilirsiniz

Veya:

(contains? (into #{} astr) \.) 

Yada sen de bunu yapar clojure.contrib.seq-utils den includes? kullanabilirsiniz.

Clojure, ints ve double'ları nasıl ayırt edeceğini bilen bir okuyucunun zaten var, bu yüzden dizginizde yalnızca sayıların bulunduğundan eminseniz, onu kullanabilirsiniz. (Bu, potansiyel tehlikelidir. Bu bir şey değil, sadece sayıları okur Ancak dikkatli olun. Bu kullanmayın dize bir sayı dışında bir şey olan herhangi ihtimali varsa.)

Not Clojure de davayı ele alır nerede bir Tam sayı, taşma olmadan doğal bir int'a sığmayacak kadar büyük. Tam sayıları ayrıştırmak isterseniz, parseInt yerine bigint işlevine bakmak isteyebilirsiniz. Fonksiyonun bir yüklem ise

user> (class (read-string "2.5")) 
java.lang.Double 
user> (class (read-string "2")) 
java.lang.Integer 
user> (class (read-string "2000000000000")) 
java.math.BigInteger 

, bu o decimal? yerine is-decimal isim Clojure yaygındır. Fonksiyonunuz aslında bir sayı ayrıştırıcıdan daha fazladır, bu yüzden kişisel olarak parse-number veya string-to-number olarak adlandırıyorum.

+0

Clojure hakkında nefret ettiğim tek şey, aradığım işlevi bilmemin hiçbir yolu yok: \ – Rayne

+0

Evet, dokümanlar oldukça seyrek. Hemen hemen tüm API'yi otur ve okumak zorundasın. 'bul-doc' da yardımcı olur. Ayrıca http://github.com/mmcgrana/clj-doc/tree/master adresini ziyaret edin –

+2

Clojure hile sayfası da çok faydalı: http://clojure.org/cheatsheet – ollb

2

\ -1 ve return false: Ben uyandıktan sonra doğrudan kod olmamalıdır

(if (> 0 (. astr (indexOf (int \.)))) 
6

Untested ise geri dönmek durumunda o zaman kontrol başarısız olursa -1 iyi

+0

Cevabınız yaptığım şeye en yakın olanıydı, ben de aldım. – Rayne