Это просто, если у вас есть:
(next '(1))
=> nil
Итак, next
смотрит на следующую вещь, и если строка пуста, она возвращает nil
вместо пустой последовательности. Это означает, что ему нужно смотреть в будущее (к первому элементу, который он должен вернуть), что делает его не полностью ленивым (может быть, вам не нужно следующее значение, но next
тратит время на вычисления, чтобы заглянуть в будущее).
(rest '(1))
=> ()
rest
не смотрит в будущее и просто возвращает оставшуюся часть последовательности.
Может быть, вы думаете, зачем вообще использовать две разные вещи здесь? Причина в том, что вы обычно хотите знать, не осталось ли ничего в seq, и просто возвращаете nil
, но в некоторых случаях, когда производительность очень важна, и оценка еще одного элемента может означать огромные усилия, которые вы можете использовать rest
.