2012-12-27 22 views
16

Witam uczę Clojure i chcę, aby zrozumieć, co się dzieje, gdy wpisujędlaczego mapa clojure zachowuje się w ten sposób z println?

(map println '(1 2 3 4)) 

spodziewałem się czegoś jak

1 
2 
3 
4 

ale mam

(1 
2 
nil 3 
nil 4 
nil nil) 

Jest tylko przykład, który wymyśliłem. Chcę tylko zrozumieć, co się dzieje. Może ma coś wspólnego z leniwością?

+4

Zalecenia ogólne: Nie używaj funkcji efektem ubocznym dla operacji mapie – Ankur

Odpowiedz

29

wynik działania (map println ...) jest zbiorem wyniku działania println, który jest zerowy. Rezultatem jest kolekcja (nil nil nil nil), którą drukuje REPL. podczas drukowania tego wywołania println również wydrukują tam dane wyjściowe do REPL, aby zobaczyć dwie mieszane razem.

jeśli zdefiniujesz to bez drukowania:

user=> (def result (map println [1 2 3 4])) 
#'user/result 

początkowo nic się nie dzieje, ponieważ wynik jest leniwy. Jeśli zdajemy sobie sprawę, bez drukowania za pomocą dorun

user=> (dorun result) 
1 
2 
3 
4 
nil 

widzimy skutki uboczne każdego println a następnie wartość zwracaną dorun która jest zerowa. Możemy spojrzeć na zawartość wyniku oceniając go

user=> result 
(nil nil nil nil) 

i zobaczyć, że zwraca pęczek nil s

Powiązane problemy