【问题标题】:Determining function argument list in Common Lisp在 Common Lisp 中确定函数参数列表
【发布时间】:2011-12-02 08:34:51
【问题描述】:

给定一个普通lisp中的函数对象(或函数的符号),是否可以找出函数的参数列表?

【问题讨论】:

    标签: lisp common-lisp


    【解决方案1】:

    这对于每个 CL 实现都是不同的,但是 Swank 包(提供可以在 f.e. Emacs 的 minibuffer 中显示 arglists 的 Slime)将其包装在一个函数中:

    * (defun testfn (arg1 arg2 &key (arg3 :a)) (declare (ignore arg1 arg2 arg3)))
    TESTFN
    * (swank-backend:arglist #'testfn)
    (ARG1 ARG2 &KEY (ARG3 :A))
    

    这也适用于方法:

    * (defmethod testmethod ((arg1 t) arg2 &key (arg3 :a)) (declare (ignore arg1 arg2 arg3)))
    STYLE-WARNING: Implicitly creating new generic function TESTMETHOD.
    #<STANDARD-METHOD TESTMETHOD (T T) {1005670231}>
    * (swank-backend:arglist #'testmethod)
    (ARG1 ARG2 &KEY (ARG3 :A))
    

    获取 Swank 最简单的方法是使用Quicklisp

    【讨论】:

    • Swank 作为兼容层?有趣
    【解决方案2】:

    ANSI Common Lisp 提供了函数FUNCTION-LAMBDA-EXPRESSION,如果实现支持并且已经记录了表达式,它可能会返回一个lambda 表达式。在 lambda 表达式中,第二项是参数列表 - 和往常一样。

    否则返回参数列表在 ANSI Common Lisp 标准中没有定义,并且是特定 Lisp 实现的一部分。例如,在某些“交付”的 Lisp 应用程序中,此信息可能不存在。

    通常,大多数 Common Lisp 实现都会在某些内部包中具有导出函数 ARGLIST。

    【讨论】:

      【解决方案3】:

      我不知道标准方式,但在 SBCL 中您可以使用 sb-introspect:function-lambda-list

      (defun test (a &rest rest &key (b 42)) nil)
      (sb-introspect:function-lambda-list #'test)
      => (A &REST REST &KEY (B 42))
      

      【讨论】:

        猜你喜欢
        • 2014-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-19
        相关资源
        最近更新 更多