2012-01-04 3 views
1

Helo. В попытке изучить clojure я поинтересовался функциями clojure.core, которые действуют на последовательности. В последнее время я заметил некоторое странное поведение, и хотел бы получить объяснения разницы между феллингом выражениями:хранение clojure против использования последовательности в выражении

То, что я пытаюсь сделать это:

user=> (reduce + (take-while (partial > 1000) (iterate inc 1))) 
499500 

Однако, когда я храню (iterate inc 1) с def в получаю сообщение об ошибке:

user=> (def a (iterate inc 1)) 
#'user/a 
user=> (reduce + (take-while (partial > 1000) (a))) 
java.lang.ClassCastException: clojure.lang.Cons cannot be cast to clojure.lang.IFn (NO_SOURCE_FILE:0) 

Может кто-то пожалуйста объяснить, что разница между хранением iterate inc 1 и использовать его непосредственно в выражении? Я знаю, что a - это ленивая последовательность, но мне что-то не хватает ...

Большое спасибо за ваше время.

ответ

3

Вы должны делать

(reduce + (take-while (partial > 1000) a)) 

(a) попытки вызова a, но это не функция.

+1

ahh да, это объясняет сообщение об ошибке, касающееся clojure.lang.cons, передаваемых в clojure.lang.IFn. – wespiserA