Spec-Zone.ru › Elisp

Изменяемость

Некоторые объекты Lisp никогда не должны изменяться. Например, выражение Lisp "aaa" возвращает строку, но её содержимое менять нельзя. И некоторые объекты изменить нельзя; например, хотя вы можете создать новое число, вычислив его, Lisp не предоставляет операции для изменения значения существующего числа.

Другие объекты Lisp являются изменяемыми: безопасно изменять их значения с помощью деструктивных операций, которые влияют на побочные эффекты. Например, существующую метку можно изменить, переместив её в другое место.

Хотя числа никогда не изменяются, а все метки изменяемы, некоторые типы имеют члены, некоторые из которых изменяемы, а другие — нет. К таким типам относятся консы, векторы и строки. Например, хотя "cons" и (symbol-name 'cons) оба возвращают строки, которые не следует изменять, (copy-sequence "cons") и (make-string 3 ?a) оба возвращают изменяемые строки, которые можно изменить с помощью последующих вызовов aset.

Изменяемый объект перестаёт быть изменяемым, если он является частью выражения, которое вычисляется. Например:

(let* ((x (list 0.5))
       (y (eval (list 'quote x))))
  (setcar x 1.5) ;; The program should not do this.
  y)

Хотя список (0.5) был изменяемым при его создании, его не следует было изменять с помощью setcar, потому что он был передан eval. Обратное не происходит: объект, который не должен изменяться, никогда не становится изменяемым после этого.

Если программа пытается изменить объекты, которые не должны изменяться, поведение результата не определено: интерпретатор Lisp может выдать ошибку, или он может аварийно завершиться или вести себя непредсказуемо другими способами.2

Когда похожие константы встречаются в качестве частей программы, интерпретатор Lisp может сэкономить время или память, повторно используя существующие константы или их компоненты. Например, (eq "abc" "abc") возвращает t, если интерпретатор создаёт только один экземпляр строковой литералы "abc", и возвращает nil, если он создаёт два экземпляра. Программы Lisp должны быть написаны так, чтобы они работали независимо от того, используется ли эта оптимизация.

Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Mutability.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API