Answers:
好的lambda可以像其他函数定义一样具有常规的文档字符串:
(lambda ()
"I'm a docstring!"
(+ foo bar))
因此,您可以使用:
(let ((foo 1)
(bar 2))
`(lambda ()
,(format "Function which sums foo=%s and bar=%s" foo bar)
(+ foo bar)))
为什么要在匿名函数上使用文档字符串是另一个问题,这可能会影响您采用的方法。
例如,如果您打算将其绑定到键上并希望C-h k
显示该帮助,则可以使用这种方法,但是该帮助仍会显示功能对象本身(包括文档字符串),但并非如此。大; 不过你可以做到这一点,你会(也)看到很好的格式化的版本:
(global-set-key
(kbd "C-c a")
(let ((foo 1)
(bar 2))
`(lambda ()
,(format "Function which sums foo=%s and bar=%s" foo bar)
(interactive)
(+ foo bar))))
但是,您可能更喜欢使用符号。您可以将匿名函数与未插入的符号配对,而不必担心它会与任何其他同名符号冲突。这将使帮助变得更干净,因为它将显示符号名称而不是功能对象。在这种情况下,我们可以选择将docstring传递给,defalias
而不是将其嵌入lambda形式。
(global-set-key
(kbd "C-c a")
(let ((foo 1)
(bar 2))
(defalias (make-symbol "a-foo-bar-function")
(lambda ()
(interactive)
(+ foo bar))
(format "Function which sums foo=%s and bar=%s" foo bar))))
或(这几乎是同一件事),您可以捕获原始的符号,并按照原始代码直接设置symbol属性:
(global-set-key
(kbd "C-c a")
(let ((foo 1)
(bar 2)
(sym (make-symbol "a-foo-bar-function")))
(put sym 'function-documentation
(format "Function which sums foo=%s and bar=%s" foo bar))
(defalias sym
(lambda ()
(interactive)
(+ foo bar)))))
作为一个侧面说明,要知道,这个功能只将被用于相加松懈约束值foo
和bar
如果您使用的lexical-binding: t
是你的库。如果foo和bar动态绑定,则我生成的文档字符串很可能在运行时不准确。不过,我们实际上可以使用动态文档字符串来满足这种情况。信息节点(elisp) Accessing Documentation
说documentation-property
:
如果属性值不是'nil',不是字符串,并且不引用文件中的文本,则将其作为Lisp表达式求值以获得字符串。
因此,使用任何基于符号的方法,我们都可以引用文档表格,以便在调用时对其进行评估:
(defalias (make-symbol "a-foo-bar-function")
(lambda ()
(interactive)
(+ foo bar))
'(format "Function which sums foo=%s and bar=%s" foo bar))