2011-03-26 12 views
7

sadece hızlı soru Değerleri:Clojure dize İade şu REPL Oturumu Verilen</p> <p>....

Clojure 1.2.0 
user=> "bar" 
"bar" 
user=> (print "bar") 
barnil 
user=> (defn foo [] ("bar")) 
#'user/foo 
user=> (foo) 
java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn (NO_SOURCE_FILE:0) 
user=> (print foo) 
#<user$foo [email protected]>nil 
user=> (print (foo)) 
java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn(NO_SOURCE_FILE:0) 

neden yazdırma işlevi tarafından gösterilen dize "bar" değil ? Okuyucu, foo'nun (String gibi görünen) dönüş değerini bir işlev olarak çözmeyi deniyor gibi görünüyor mu? Baskı, dizgiyi komut satırına yazacak şekilde nasıl tanımlanmalıdır? Clojure son statment denilen baskı fonksiyonu gösteren bir argüman liste ile çağrıldığında fonksiyon ismi gibi herhangi listenin ilk elemanını "çözmek" çalışması nedeniyle

cevap

16

yapmaz çünkü Clojure'da diğer Lisp-beğenilerine kıyasla biraz zayıfım, ama bu doğru değil, değil mi?

(defn foo [] "bar") 

aksi takdirde hata ile tutarlı bir fonksiyonu olarak dize "bar" aramaya çalıştığında bir işlev tanımladığınız olmalı.

mress:10004 Z$ clj 
Clojure 1.2.0 
user=> (defn foo [] "bar") 
#'user/foo 
user=> (foo) 
"bar" 
+0

:-) ben kökünde bir * cwd * yöntemi tanımlayan ile sorunları vardı :-) 18 dakika önce 2 doğru cevap benim projesi. '(Str cwd "src/foo.txt") çağrılması, "[email protected]/foo.txt" 'i döndürerek birinci sınıf bir işlev nesnesi olarak yanlış bir şekilde * cwd *. '(Str (cwd) "src/foo.txt") olarak değiştirilmesi beklendiği gibi çalışır. Şimdi anlıyorum ki, zorunlu bir dilde (Python), bu “len” ifadesi ile len() operasyonu arasındaki farktır. – Droogans

6

(foo) whish işlevine çağrısı olarak yorumlanır foo. çok uzak çok iyi.

ancak ok..it izin verilmez "çubuk" fonksiyonuna çağrı gibi yorumlanır değildir fonksiyonu foo döner listesi ("çubuğu") ..

FAN gibi (eğer defn foo [] "bar"), yazdırma işlemi ("bar") değil, yalnızca "bar" ( ) almaz ve yazdırma işlemini

+0

mmh, başka biraz daha Betimsel olduğunu düşünüyorum, ama yine de 1 – echox