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