Spec-Zone.ru › Elisp

Неправильное время

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

(defmacro my-set-buffer-multibyte (arg)
  (if (fboundp 'set-buffer-multibyte)
      (set-buffer-multibyte arg)))

При таком ошибочном определении макроса программа работала нормально при интерпретации, но давала сбой при компиляции. Это определение макроса вызывало set-buffer-multibyte во время компиляции, что было неправильно, и затем ничего не делало, когда скомпилированный пакет запускался. Определение, которое программист на самом деле хотел, было таким:

(defmacro my-set-buffer-multibyte (arg)
  (if (fboundp 'set-buffer-multibyte)
      `(set-buffer-multibyte ,arg)))

Этот макрос, при необходимости, разворачивается в вызов set-buffer-multibyte, который будет выполнен, когда скомпилированная программа будет фактически запущена.

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/Wrong-Time.html

Spec-Zone.ru

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