1

我正在学习如何在 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) symbol-function(nameOfFunction) (let ((fDefAsString ...)) (message "%s" fDefAsString) (switch-to-buffer-other-frame " Messages " )) 消息函数定义(向下滚动) eval((消息函数定义(引用向下滚动))) eval-last-sexp-1(nil) eval-last-sexp(nil) 交互式调用( eval-last-sexp nil nil) recursive-edit() 字节码("\306 @\307=\203!

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

4

1 回答 1

1

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

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

一些提示:

  1. 您的代码没有正确缩进。如果您选择区域并使用 重新缩进tab,它将更易于阅读。

  2. 您应该花几个小时阅读“Emacs Lisp Intro”,您将对 Emacs-lisp 中的工作原理有一个更好的了解,而不是通过在 StackOverflow 上一次问一个问题来弄清楚这一切。

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

    尝试这个:

    (find-function-other-window 'scroll-down)
    
于 2012-08-18T22:35:20.140 回答