При выполнении функции Clojure `first`

Я видел следующий пример в видео Рича о последовательностях 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» , я думаю, что выполнение хакерского и быстрого «захватить и сохранить», подход лучше, чем захват последовательности, а затем вызов первый .

Я что-то упускаю? Рич Хики пропустил несколько шагов?

Дайте мне знать, если у меня возникнут вопросы. Спасибо!

7
задан Wim Coenen 28 March 2011 в 20:33
поделиться