Spec-Zone.ru › Elisp

Макрос setf

Макрос setf — это наиболее базовый способ работы с обобщенными переменными. Форма setf похожа на setq, за исключением того, что она принимает произвольные формы места слева, а не только символы. Например, (setf (car a) b) устанавливает голову списка a в значение b, выполняя ту же операцию, что и (setcar a b), но без необходимости использования двух отдельных функций для установки и доступа к этому типу места.

Макрос: setf [форма места]…

Этот макрос вычисляет form и сохраняет его в place, который должен быть допустимой формой обобщенной переменной. Если есть несколько пар place и form, назначения выполняются последовательно, как и в случае с setq. setf возвращает значение последней form.

Следующие формы Lisp являются формами в Emacs, которые будут работать как обобщенные переменные и, следовательно, могут появляться в аргументе place макроса setf:

  • Символ. Другими словами, (setf x y) точно эквивалентно (setq x y), а setq само по себе строго говоря избыточно, учитывая, что setf существует. Большинство программистов по-прежнему будут предпочитать setq для установки простых переменных, однако, по стилистическим и историческим причинам. Макрос (setf x y) фактически расширяется до (setq x y), поэтому нет штрафа за производительность при использовании в скомпилированном коде.
  • Вызов любой из следующих стандартных функций Lisp:
    aref      cddr      symbol-function
    car       elt       symbol-plist
    caar      get       symbol-value
    cadr      gethash
    cdr       nth
    cdar      nthcdr
    
  • Вызов любой из следующих функций, специфичных для Emacs:
    alist-get                     process-get
    frame-parameter               process-sentinel
    terminal-parameter            window-buffer
    keymap-parent                 window-display-table
    match-data                    window-dedicated-p
    overlay-get                   window-hscroll
    overlay-start                 window-parameter
    overlay-end                   window-point
    process-buffer                window-start
    process-filter                default-value
    

setf сигнализирует об ошибке, если вы передаете форму place, с которой он не знает, как работать.

Обратите внимание, что для nthcdr, аргумент списка функции сам должен быть допустимой формой place. Например, (setf (nthcdr 0 foo) 7) установит foo само по себе в 7.

Макросы push (см. Переменные списков) и pop (см. Элементы списков) могут манипулировать обобщенными переменными, а не только списками. (pop place) удаляет и возвращает первый элемент списка, хранящегося в place. Он аналогичен (prog1 (car place) (setf place (cdr place))), за исключением того, что он заботится о вычислении всех подформ только один раз. (push x place) вставляет x в начало списка, хранящегося в place. Он аналогичен (setf place (cons x place)), за исключением вычисления подформ. Обратите внимание, что push и pop для места nthcdr могут использоваться для вставки или удаления в любой позиции в списке.

Библиотека cl-lib определяет различные расширения для обобщенных переменных, включая дополнительные места setf. См. Обобщенные переменные в Расширения Common 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/Setting-Generalized-Variables.html

Spec-Zone.ru

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