代码之家  ›  专栏  ›  技术社区  ›  avp

Lisp中的函数名可以有别名吗?

  •  16
  • avp  · 技术社区  · 16 年前

    …就像包裹一样。

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

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

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

    8 回复  |  直到 13 年前
        1
  •  41
  •   Sébastien Le Callonnec    12 年前

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

        2
  •  5
  •   Thayne    11 年前

    你可以使用 setf 将该功能分配给另一个功能单元,例如:

    (defmacro alias (new-name prev-name)
      `(setf (symbol-function ,new-name) (symbol-function ,prev-name))) 
    
        3
  •  5
  •   muyinliu    6 年前

    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)
    
        4
  •  4
  •   Alex Coventry    16 年前

    如果所有的打字都让持续使用长名称变得不可取,那么是的,emacs可以提供帮助。查看 abbrev-mode 。在这方面也考虑得很好的是 hippie-expand .

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

        5
  •  0
  •   David M. Karr    16 年前

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

        6
  •  0
  •   leppie    16 年前

    我不懂Emacs,但(定义简称longnamefunctionblahblah)不管用吗?

        7
  •  -1
  •   Marcin    16 年前

    你可以简单地让一个函数调用另一个函数。

        8
  •  -1
  •   dsm    16 年前

    您可以使用 (defmacro ...) 为函数添加别名