Позвольте: создать временную переменную в Common Lisp - PullRequest
1 голос
/ 09 сентября 2010

С учетом функции:

(defun foo (bar)
 (let ((baz bar))
    (setf baz (+ baz 1)))

Мне дано понять (возможно, неправильно?), Что baz становится своего рода ссылкой на bar, а не является истинной копией bar.

Что я хотел бы сделать, так это создать настоящую временную переменную, чтобы я мог гарантировать, что я могу использовать все переданные переменные без каких-либо побочных эффектов.

Ответы [ 2 ]

5 голосов
/ 09 сентября 2010

Я думаю, что лучше сказать "baz становится ссылкой на то же, что bar является ссылкой". Но вы правы, что let не копирует.

Если вы хотите сделать копию bar, вы, безусловно, можете, хотя то, как вы это сделаете, зависит от того, что такое bar: список, вектор и т. Д.

Для любопытных Кент Питман написал замечательную статью на тему «Почему нет общей функции COPY?».

1 голос
/ 09 сентября 2010

Как правило, вы можете без проблем обращаться с несколькими ссылками на одну «вещь», если вы не используете никакие мутирующие функции (средства доступа к слотам, операции с дескриптивным списком и тому подобное).

В случае, если вы скопировали, вы используете числа, и они «всегда» безопасны (если вы делаете арифметику с новой копией, будет сгенерирована новая копия).

К сожалению, нетуниверсальная функция «Сделать копию», отчасти потому, что не очевидно, что означает «делать копию» во всех случаях, а отчасти потому, что копирование циклических структур данных не обязательно тривиально (что-то, что должна была бы выполнять универсальная функция копирования).

...