如何获取一个变量来表示“symbol-function()”的函数名
Posted
技术标签:
【中文标题】如何获取一个变量来表示“symbol-function()”的函数名【英文标题】:how to get a variable to represent a function name for "symbol-function()" 【发布时间】:2012-08-18 21:43:18 【问题描述】:我正在学习如何在 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 ...)) (message "%s" fDefAsString) (switch-to-buffer-other-frame "Messages")) 消息功能定义(向下滚动) eval((message-function-definition (quote scroll-down))) eval-last-sexp-1(nil) eval-last-sexp(nil) 交互式调用(eval-last-sexp nil nil) 递归编辑() 字节码("\306 @\307=\203!
我尝试过引用、取消引用,并尝试使用“nameOfFunction”,但无法使其正常工作。我做错了什么?
【问题讨论】:
【参考方案1】:您是否尝试取消引用?这对我有用:
(defun message-function-definition (nameOfFunction)
(let ((fDefAsString (symbol-function nameOfFunction)))
(message "%s" fDefAsString)
(switch-to-buffer-other-frame "*Messages*")))
一些提示:
您的代码没有正确缩进。如果您选择区域并使用 tab 重新缩进,它会更容易阅读。
您应该花几个小时完成“Emacs Lisp 介绍”, 您将对 Emacs-lisp 中的工作方式有更好的了解,而不是 而不是通过在 *** 上一次问一个问题来解决所有问题。
symbol-function
并非旨在显示人类可读的定义
功能。在大多数情况下,您不会真正看到任何有用的东西。
试试这个:
(find-function-other-window 'scroll-down)
【讨论】:
如果我将 (find-function-other-window 'scroll-down) 放入一个空缓冲区并运行 eval-buffer 我得到:“调试器进入 - Lisp 错误:(错误“变量绑定深度超过 max-specpdl-size")" 我没有。我正在使用 Emacs 24.1。使用emacs -Q
启动 emacs。 scroll-down
不是一个很好的例子,因为它是在 C 中定义的。但我仍然可以看到源代码。
现在我得到“C 源文件 window.c 不可用”
奇怪的是,在一个空白的新缓冲区中,我这样做:(symbol-function 'scroll-down) 然后 C-x C-e 我得到的只是:#以上是关于如何获取一个变量来表示“symbol-function()”的函数名的主要内容,如果未能解决你的问题,请参考以下文章