Печать фактически делала одно и то же в обоих случаях, она печатала только номер.Дополнительный .
был напечатан кодом внутри списка, он произошел одновременно с печатью 4
, и поэтому он оказался рядом с ним на экране.
дополнительная точка - побочный эффект ленивой последовательности, создаваемой на лету .Я бы предложил более подробный пример, чтобы прояснить это:
начать с двух одинаковых списков, оба полностью ленивые:
esc.core=> (def a (iterate #(do (print "making new element") (inc %)) 1))
#'esc.core/a
esc.core=> (def b (iterate #(do (print "making new element") (inc %)) 1))
#'esc.core/b
, а затем составить еще два идентичных списка, которые начинаются с четвертого элементаa
и b
соответственно
esc.core=> (def a-partially-realized (-> a rest rest rest))
making new elementmaking new element#'esc.core/a-partially-realised
esc.core=> (def b-more-fully-realized (-> b next next next))
making new elementmaking new elementmaking new element#'esc.core/b-more-fully-realised
esc.core=>
первые три элемента a-partially-realized
были предварительно вычислены
, в то время как первые четыре элементаb-more-fully-realized
были предварительно вычислены.
, когда мы читаем первый элемент (четвертый в исходном списке) из a-partially-realized
, он еще не был вычислен, поэтому мы увидим, что он вычисляется.
esc.core=> (print (first a-partially-realized))
making new element4nil
когда мы сделаем то же самое с b-more-fully-realised
, оно уже будет кэшировано, поэтому мы сразу получим результат.
esc.core=> (print (first b-more-fully-realized))
4nil