我一直在做一些遺傳編程,我一直在根據它們的功能將功能分成不同的功能集;這一切都相當複雜。查找功能的共同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