парочка вопросов (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 например) - их модифицировать нельзя.