2013-03-17 81 views
7

我一直在做一些遗传编程,我一直在根据它们的功能将功能分成不同的功能集;这一切都相当复杂。查找功能的共同lisp

我想知道是否有更简单的方法来做到这一点。例如,如果有一个函数返回给定函数的arity。

提前欢呼。

+2

似乎是实现相关的。请参阅https://groups.google.com/forum/#!msg/comp.lang.lisp/0WoivuykcKM/0SnbqcFyNogJ – 2013-03-17 19:29:02

回答

8

对于解释函数,您应该可以使用function-lambda-expression

对于编译功能,唉,这个功能经常返回nil,所以你必须使用一个实现相关的功能(clocc/port/sys.lisp):

(defun arglist (fn) 
    "Return the signature of the function." 
    #+allegro (excl:arglist fn) 
    #+clisp (sys::arglist fn) 
    #+(or cmu scl) 
    (let ((f (coerce fn 'function))) 
    (typecase f 
     (STANDARD-GENERIC-FUNCTION (pcl:generic-function-lambda-list f)) 
     (EVAL:INTERPRETED-FUNCTION (eval:interpreted-function-arglist f)) 
     (FUNCTION (values (read-from-string (kernel:%function-arglist f)))))) 
    #+cormanlisp (ccl:function-lambda-list 
       (typecase fn (symbol (fdefinition fn)) (t fn))) 
    #+gcl (let ((fn (etypecase fn 
        (symbol fn) 
        (function (si:compiled-function-name fn))))) 
      (get fn 'si:debug)) 
    #+lispworks (lw:function-lambda-list fn) 
    #+lucid (lcl:arglist fn) 
    #+sbcl (sb-introspect:function-lambda-list fn) 
    #-(or allegro clisp cmu cormanlisp gcl lispworks lucid sbcl scl) 
    (error 'not-implemented :proc (list 'arglist fn))) 

编辑:注意:元数在CL实际上并不是一个数字,因为除了required之外,Lisp函数还可以接受optionalrestkeyword参数;这就是为什么上述arglist函数返回参数函数lambda list而不是数字。

如果你只在其中只接受所需的参数的功能感兴趣的话,您将需要使用像

(defun arity (fn) 
    (let ((arglist (arglist fn))) 
    (if (intersect arglist lambda-list-keywords) 
     (error "~S lambda list ~S contains keywords" fn arglist) 
     (length arglist)))) 
+0

谢谢,我刚刚发现我可以调用clisp自己的#'arglist,然后在列表中执行成员搜索它返回。 – 2013-03-17 21:11:43