LISP - деструктивные и недеструктивные конструкции

Каково правильное определение деструктивных и недеструктивных конструкций в LISP (или вообще). Я попытался найти фактическое значение, но я нашел только много случаев использования этих терминов без фактического их объяснения.

Я так понял, что под деструктивной функцией подразумевается функция, которая меняет значение конструкции (или переменной) - поэтому, когда я передаю список в качестве параметра функции, которая его меняет , это называется деструктивной операцией, поскольку она изменяет первоначальный список и возвращает совершенно новый. Так ли это или есть исключения?

Так, например, установить деструктивную функцию (потому что она изменяет значение x)? Я думаю, что нет, но я не знаю, как бы я это обосновал.

(set 'x 1)

Извините за, вероятно, очень простой вопрос.... Спасибо за любые ответы!


person Smajl    schedule 11.06.2013    source источник
comment
Также см. этот вопрос: pushnew без поддержки места. Считается ли это деструктивным макросом?. В некоторых ответах обсуждаются концепции деструктивных и недеструктивных конструкций.   -  person Joshua Taylor    schedule 11.06.2013


Ответы (2)


Я бы не стал слишком толковать слово «разрушительный».

При обработке списка деструктивная операция — это операция, которая потенциально изменяет один или несколько входных списков в качестве видимого побочного эффекта.

Теперь вы можете расширить значение операций над массивами, структурами, объектами CLOS и т. д. Вы также можете называть присваивание переменных «разрушающим» и т. д.

В Common Lisp имеет смысл говорить о деструктивных операциях над последовательностями (которые являются списками, строками и векторами в целом) и многомерными массивами.

person Rainer Joswig    schedule 11.06.2013

Практический Common Lisp различает два типа деструктивных операций: операции для побочного эффекта и операции переработки.

set является деструктивным и побочным эффектом: он всегда изменяет свой первый аргумент. Имейте в виду, что он изменяет привязку символа, но не то, что в данный момент привязано к этому символу. setf может изменять либо привязки, либо объекты на месте.

В отличие от этого, nreverse перерабатывается: ему разрешено изменять его список аргументов, хотя нет гарантии, что он будет, поэтому его следует использовать точно так же, как reverse (возьмите возвращаемое значение), за исключением того, что входной аргумент может быть «уничтожен» и больше не должен использоваться. [Программисты схем могут называть это функцией «линейного обновления».]

person Fred Foo    schedule 11.06.2013