【发布时间】:2010-09-16 13:30:58
【问题描述】:
...就像包一样。
我使用 Emacs(也许它可以提供某种解决方案)。
例如(defun the-very-very-long-but-good-name () ...) 在后面的代码中没有用处。但是像Fn-15 这样的名称或首字母缩写也没有用。
是否可以有一个类似于包的别名,或者在尝试调用函数名称时访问文档字符串?
换句话说,函数是否有可能以某种方式混合自记录和短名称?
【问题讨论】:
...就像包一样。
我使用 Emacs(也许它可以提供某种解决方案)。
例如(defun the-very-very-long-but-good-name () ...) 在后面的代码中没有用处。但是像Fn-15 这样的名称或首字母缩写也没有用。
是否可以有一个类似于包的别名,或者在尝试调用函数名称时访问文档字符串?
换句话说,函数是否有可能以某种方式混合自记录和短名称?
【问题讨论】:
你想要defalias。 (defalias 'newname 'oldname) 将保留文档,甚至在请求文档时显示“newname 是 `oldname' 的别名”。
【讨论】:
defalias 是一个 Elisp 函数 - 鉴于上面@avp 的评论,听起来他们正在使用 common-lisp
您可以使用setf 将函数分配给另一个函数单元格,例如:
(defmacro alias (new-name prev-name)
`(setf (symbol-function ,new-name) (symbol-function ,prev-name)))
【讨论】:
(defun alias (new-name prev-name) (setf (symbol-function new-name) (symbol-function prev-name))) 也可以。
来自《On Lisp》?代码如下:
(defmacro alias (new-name prev-name)
`(defmacro ,new-name (&rest args)
`(,',prev-name ,@args)))
; use: (alias df defun)
(defun group (source n)
(if (zerop n) (error "zero length"))
(labels ((rec (source acc)
(let ((rest (nthcdr n source)))
(if (consp rest)
(rec rest (cons (subseq source 0 n) acc))
(nreverse (cons source acc))))))
(if source (rec source nil) nil)))
(defmacro aliasx (&rest names)
`(alias
,@(mapcar #'(lambda (pair)
`(alias ,@pair))
(group names 2))))
; use: (aliasx df1 defun
; df2 defun
; df3 defun)
【讨论】:
如果是所有类型导致不希望继续使用长名称,那么是的,emacs 可以提供帮助。查看abbrev-mode。在这种情况下,hippie-expand 也是经过深思熟虑的。
如果是可读性问题,那就更难了。
【讨论】:
如果您的问题是您不记得很长的函数名称,但您记得名称的一部分,这就是“apropos”的用途。在我的 Emacs 中,我将“C-h a”绑定到“hyper-apropos”。您输入要查找的符号的子字符串,它会列出所有匹配项。
【讨论】:
我不了解 Emacs,但是(定义短名称 longnamefunctionblahblah)不起作用吗?
【讨论】:
您可以简单地拥有一个只调用另一个函数的函数。
【讨论】:
您可以使用(defmacro ...) 给函数起别名
【讨论】: