2013-04-13 3 views
2

Я читаю объяснения на rest vs следующий в clojure. Как я понимаю, он разбивается на next, оценивая/реализуя хвост последовательности, , чтобы знать, что он должен возвращать nil или нет, а rest всегда возвращает последовательность, поэтому она более ленивая.следующий и отдых в clojure

Однако я не понимаю, что это: обе функции должны знать, что есть что-то в хвосте. Один вернет nil, если ничего не останется, другой вернет ().

В общем, им нужно проверить/оценить, что осталось. Причина, даже rest, чтобы вернуть (), необходимо знать, что она не вернется, например, (2).

Так что даже rest необходимо выполнить оценку.

Но объяснения говорят об обратном. это только next. Эта оценка, но rest не делает, поэтому лже.

Может ли кто-нибудь объяснить?

ответ

7
user> (def test-seq (lazy-cat [1] [(do (print "Hi!") 2)])) 
#'user/test-seq 
user> (def rest-test (rest test-seq)) 
#'user/rest-test 
user> (def next-test (next test-seq)) 
Hi! 
#'user/next-test 

Если rest необходимо оценить элемент, вы бы видели «Привет!» напечатайте после того, как я позвонил (rest test-seq). Очевидно, что rest не нуждается в оценке, чтобы работать.

Причина в том, что rest не возвращает() или (2) или что-то в этом роде; он возвращает неоценимую ленивую последовательность каждый раз, когда она вызывается, и вопрос о том, есть ли что-либо, чтобы вернуться, отвечает только тогда, когда эта последовательность оценивается позже.

+0

Я думаю, что получил. Clojure на самом деле удивительно просто. –

Смежные вопросы