2010-07-22 26 views
7

işlevler listesinin ilk geçerlidir:Clojure

(def lst '(+ -))

ve ben numaralarının listesi, istiyorum o listede (+) ilk başvuruda bulunmayı arzu onun

(apply (first lst) '(1 2 3 4))

ama görünüşe U yanlış olduğumu düşünüyorum? Sözdizimi hatası varsayalım. Bunu nasıl yaparım?

PS:

=>(first lst) 
+ 

=>(apply (first lst) '(1 2 3 4)) 
4 

hatasız de dönüp, onlar sadece ben birinci durumda ne beklenir dönün ve ne ben ikinci beklemek ETMEM.

cevap

13

Listenizi alıntı olduğundan:

(def lst '(+ -)) 
     ; ^- quote! 

üyelerinin iki semboller değil fonksiyonlardır. (Yani kendi argüman kendini bakar) Clojure bir sembol bir işlev olarak kullanılabilir, ancak o zaman bir anahtar kelime gibi çok davranır:

('foo {'foo 1}) 
; => 1 

doğru çözüm listesini kullanmaktır - ya da daha deyimsel bir vektör - fonksiyonların:

(def lst (list + -)) ; ok 
; or... 
(def lst `(~+ ~-)) ; very unusual in Clojure 
; or... 
(def lst [+ -])  ; the idiomatic solution 

Sonra apply örnek çalışacaktır.

user=> + 
#<core$_PLUS_ [email protected]> 
+0

ahhhhhh: Bu arada

, REPL tarafından geri basılmış bir fonksiyonu, hangi isimler o sembolü gibi görünmüyor dikkat edin. Bu şimdi çok mantıklı. Sadece ne yaptığını bilen birinden duymak zorunda kaldı. çok teşekkürler. – trh178