2013-03-17 36 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