Я видел следующий пример в видео Рича о последовательностях http://blip.tv/file/734409 примерно 33-36 минут:
(first "abcd") => \a
Теперь он говорит, что это расширяется до (вроде):
(first "abcd") => (first (seq "abcd")) => (first '(\a \b \c \d))
Итак, это похоже на операцию O (N)
, потому что полная копия строка делается. Прежде всего, если String
неизменяема, то почему она копируется? (Изменить: судя по ответу, вероятно, нет; просто так выглядело при печати.) Во-вторых, предположим, что сначала
работал с чем-то еще изменяемым в Java, скажем, со связанным списком целых чисел. Следует ли first
действовать лениво (например, сначала создать постоянную последовательность)? Разве не имеет смысла сразу оценить и сохранить? Это был бы своего рода хакер, который сломал бы красивую абстракцию, но, я думаю, справился бы быстро. Когда вы вызываете (seq "abcd")
, вы не знаете, как он будет использоваться. Когда вы сначала вызываете
на seq
, вы знаете, что делать. Но когда вы сначала вызываете
на «abcd»
, я думаю, что выполнение хакерского и быстрого «захватить и сохранить», подход лучше, чем захват последовательности, а затем вызов первый
.
Я что-то упускаю? Рич Хики пропустил несколько шагов?
Дайте мне знать, если у меня возникнут вопросы. Спасибо!