парочка вопросов (original) (raw)
From: _(Anonymous)_2012-04-07 01:12 pm (UTC) | (Link) |
---|
Деструктивные функции могут делать с передаваемыми списками что угодно, так что вызывая их, вы говорите: «Мне нужно эффективно сделать операцию, а то, что я передаю в аргументах, мне больше не нужно, делай, с ним что хочешь, только побыстрее». Подчеркну, что это функции, а не процедуры, поэтому вызывать их надо ради возвращемого результата, а не того, что они делают с аргументами. Хотите более переносимого эффекта — используйте union вместо nunion.
Что касается gcl, то разве он не мёртв?
Это был я, почему-то отправилось от анонима.
Что касается gcl, то разве он не мёртв?
Сложно сказать. Траффик на почтовой рассылке там поживее, чем у многих живых проектов.
вызывать их надо ради возвращемого результата, а не того, что они делают с аргументами
Понятно...
Что касается gcl, то разве он не мёртв?
До сих пор есть в Debian, но версия ещё 2005 года, но и CL не нов :)
GCL мёртв, тухл, и глючен.
SBCL - каноническая, можно сказать, реализация CL. Поведение SBCL обычно наиболее соответствует стандарту.
nunion - деструктивная функция, как сказали. Смысл деструктивных функций в том, что они с аргументами могут делать что угодно, т.е. последние становятся как бы невалидными, после использования. Смысл существования деструктивных функций в экономии памяти и процессорного времени(например nreverse просто переназначает ссылки в cons-ячейках, и работает за линейное время и без расхода дополнительной памяти, в отличие от просто reverse). Но, да, это по-прежнему функции, т.е. их используют ради возвращаемого значения.
Еще такой момент - в деструктивные функции нежелательно передавать объекты-литералы, особенно встроенных типов(cons-ячейки те же). Константы, записанные в разных местах компилятор может сворачивать в одну. А это чревато нежелательными побочными эффектами, как понятно.
Ну, про объекты литералы еще - из вышесказанного понятно, естественно, что их нежелательно менять каким-либо образом(в случае с cons - соответственно нежелательно использовать (setf car), (setf cdr) и т.п.).
А (setf (nth n *list*) (do-something-with (nth n *list*)) можно?
зависит от того что такое *list*
короче, если объекты - константы/литераты(из кода или из load-time-value например) - их модифицировать нельзя.