Название интерактивной функции Elisp - PullRequest
1 голос
/ 21 марта 2011

Я пытаюсь использовать функцию названия интерактивной функции. В руководстве по emacs lisp написано:

«а» Имя функции (т.е. символ, удовлетворяющий fboundp). Существующий, Завершение, Подсказка.

Итак, я попробовал это с небольшим тестовым кодом:

(defun testfun1 ()
  (message "hello, world!"))

(defun test (abcd)
  (interactive "aTheme name: ")
  (abcd))

Emacs выдает ошибку, говоря:

test: определение функции символа недействительно: abcd

Я пытался проверить abcd с помощью fboundp, он возвращает t. Поэтому я не совсем понимаю, как использовать интерактивную опцию «а». Любое тело может дать некоторые подсказки?

Ответы [ 2 ]

5 голосов
/ 21 марта 2011

Ваша функция test получает аргумент abcd в виде функции, но вы не можете просто вызвать функцию, поместив символ, ссылающийся на нее, в первой позиции списка, который будет оценен.Поскольку Emacs Lisp является Lisp-2 , ссылка на функцию, предоставленную для интерактивного запроса, хранится в символьном слоте abcd значения , а не в его функциональном слоте.Правила оценки для списка, подобного

(abcd)

, предполагают поиск в слоте функции первого объекта первого объекта, если этот объект является символом, как в вашем случае.Если вместо этого вы хотите вызвать функцию, указанную в слоте значения символа , вам понадобится функция funcall :

(funcall abcd)

, которая говорит: «Возьми abcd, извлеките значение из его слота значения и, при условии, что это функция, вызовите ее здесь, так же, как если бы эта функция была указана в первой позиции списка либо в символе слот функции или путем прямой ссылки на объект функции. "

Вот ответ на аналогичный вопрос со ссылками, полезными для дальнейшего изучения.

0 голосов
/ 21 марта 2011

Это должно сделать этот трюк:

(defun test (abcd)
  (interactive "aTheme name: ")
  (call-interactively abcd))
...