【问题标题】:Is it possible to have an alias for the function name in Lisp?是否可以在 Lisp 中为函数名设置别名?
【发布时间】:2010-09-16 13:30:58
【问题描述】:

...就像包一样。

我使用 Emacs(也许它可以提供某种解决方案)。

例如(defun the-very-very-long-but-good-name () ...) 在后面的代码中没有用处。但是像Fn-15 这样的名称或首字母缩写也没有用。 是否可以有一个类似于包的别名,或者在尝试调用函数名称时访问文档字符串?

换句话说,函数是否有可能以某种方式混合自记录和短名称?

【问题讨论】:

    标签: emacs lisp


    【解决方案1】:

    你想要defalias(defalias 'newname 'oldname) 将保留文档,甚至在请求文档时显示“newname 是 `oldname' 的别名”。

    【讨论】:

    • Ctrl-H f defalias 很好,你需要去。
    • 上面应该是 (defalias 'newname 'oldname) 。
    • defalias 是一个 Elisp 函数 - 鉴于上面@avp 的评论,听起来他们正在使用 common-lisp
    • verdammelt,你完全正确,我混淆了环境。但那是很久以前的事了......实际上,尽管这个答案是完全正确的并且我接受它,但如果我不关心代码的大小,使用 hippie-expand 会更容易。
    【解决方案2】:

    您可以使用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))) 也可以。
    【解决方案3】:

    来自《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)
    

    【讨论】:

    • 感谢 muyinliu 的输入,但 Allen 已经回答了这个问题。 OTOH,这个解决方案要求我记住我希望避免的不必要的细节。
    【解决方案4】:

    如果是所有类型导致不希望继续使用长名称,那么是的,emacs 可以提供帮助。查看abbrev-mode。在这种情况下,hippie-expand 也是经过深思熟虑的。

    如果是可读性问题,那就更难了。

    【讨论】:

      【解决方案5】:

      如果您的问题是您不记得很长的函数名称,但您记得名称的一部分,这就是“apropos”的用途。在我的 Emacs 中,我将“C-h a”绑定到“hyper-apropos”。您输入要查找的符号的子字符串,它会列出所有匹配项。

      【讨论】:

      • 我想我的问题是我想要短名称和描述。
      【解决方案6】:

      我不了解 Emacs,但是(定义短名称 longnamefunctionblahblah)不起作用吗?

      【讨论】:

      • 嗯...首先,它不是自动的。其次,我需要自己关心它。第三,它很笨重... :(
      【解决方案7】:

      您可以简单地拥有一个只调用另一个函数的函数。

      【讨论】:

      • 你会丢失文档。
      【解决方案8】:

      您可以使用(defmacro ...) 给函数起别名

      【讨论】:

      • 我会重复我对 leppie 说过的话。只是……我不知道……看起来很丑。我的意思是,它需要付出努力,但只提供可读性。 Abbrev-mode 和 hippie-expand 可以毫不费力地完成类似的工作......但无论如何,感谢您的意见!
      猜你喜欢
      • 2014-02-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      相关资源
      最近更新 更多