我一直在做一些遗传编程,我一直在根据它们的功能将功能分成不同的功能集;这一切都相当复杂。查找功能的共同lisp
我想知道是否有更简单的方法来做到这一点。例如,如果有一个函数返回给定函数的arity。
提前欢呼。
我一直在做一些遗传编程,我一直在根据它们的功能将功能分成不同的功能集;这一切都相当复杂。查找功能的共同lisp
我想知道是否有更简单的方法来做到这一点。例如,如果有一个函数返回给定函数的arity。
提前欢呼。
对于解释函数,您应该可以使用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函数还可以接受optional,rest和keyword参数;这就是为什么上述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))))
谢谢,我刚刚发现我可以调用clisp自己的#'arglist,然后在列表中执行成员搜索它返回。 – 2013-03-17 21:11:43
似乎是实现相关的。请参阅https://groups.google.com/forum/#!msg/comp.lang.lisp/0WoivuykcKM/0SnbqcFyNogJ – 2013-03-17 19:29:02