如何获取变量来表示“symbol-function()”的函数名称

时间:2012-08-18 21:43:19

标签: emacs

我正在学习如何在emacs lisp中编程。我以为我会编写一个简单的函数,将函数定义打印到消息缓冲区。这很好用:

(let (
(fDefAsString (symbol-function 'scroll-down)) 
)
(message "%s" fDefAsString)
(switch-to-buffer-other-frame "*Messages*"))

但我希望这是一个可以接受参数的函数,该参数是我希望看到的函数的名称。所以我尝试了这个:

(defun message-function-definition (nameOfFunction)
(let (
(fDefAsString (symbol-function 'nameOfFunction)) 
)
(message "%s" fDefAsString)
(switch-to-buffer-other-frame "*Messages*")))

然后我写了这个:

(message-function-definition 'scroll-down)

然后我跑了“eval-buffer”。

我一直收到这个错误:

调试器输入 - Lisp错误:(void-function nameOfFunction)   符号函数(nameOfFunction)   (let((fDefAsString ...))(消息“%s”fDefAsString)(切换到缓冲区 - 其他帧“消息”))   消息功能清晰度(向下滚动)   eval((message-function-definition(quote scroll-down)))   EVAL-最后SEXP-1(无)   EVAL-最后SEXP(无)   交互式呼叫(eval-last-sexp nil nil)   递归编辑()   字节码(“\ 306 @ \ 307 = \ 203!

我试过引用,取消引用,我尝试使用“nameOfFunction”,但我无法让它工作。我做错了什么?

1 个答案:

答案 0 :(得分:1)

你试过不引用吗?这对我有用:

(defun message-function-definition (nameOfFunction)
  (let ((fDefAsString (symbol-function nameOfFunction)))
    (message "%s" fDefAsString)
    (switch-to-buffer-other-frame "*Messages*")))

一些提示:

  1. 您的代码未正确缩进。如果您选择区域并使用标签重新缩进,则会更容易阅读。

  2. 你应该花几个小时来完成“Emacs Lisp Intro”, 您将更好地了解Emacs-lisp中的工作原理 而不是通过在StackOverflow上一次询问一个问题来解决所有问题。

  3. symbol-function并非旨在显示人类可读的定义 功能。在大多数情况下,你不会真正看到任何有用的东西。

    试试这个:

    (find-function-other-window 'scroll-down)