2015-01-17 12 views
2

我需要編寫一個遞歸輔助函數,並且不需要給它全局範圍,但我需要引用它來實現遞歸。在通用lisp中命名lambda

Emacs lisp有fset,它分配給符號的函數單元。通用lisp中的等價物是什麼?

+0

我可以lambda函數賦值給一個符號,然後'(funcall)'這個符號,但必須有一個更漂亮的方式。 – erjoalgo

+4

看看標籤:http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/Body/speope_fletcm_scm_macrolet.html – malisper

回答

2

我才發現,這是很常見是在alexandria一個idion。從亞歷山大代碼:

(defmacro named-lambda (name lambda-list &body body) 
    "Expands into a lambda-expression within whose BODY NAME denotes the corresponding function." 
    `(labels ((,name ,lambda-list ,@body)) 
#',name)) 

下面是一個使用〔實施例:

(let ((! ;; Everything can be a symbol :D 
    ;; Definition here 
    (named-lambda self (n) 
     (case n 
      (1 1) 
      (otherwise (* n 
       (self (1- n)))))))) ;; Recurse here 
    ;; How to call it 
    (funcall ! 6)) 
+0

P.S.我只是想爲拉爾斯布林霍夫的回答添加一個例子。 – fstamour

1

什麼malisper說。

或者,如果你真的需要一個名爲拉姆達:

(defmacro named-lambda (name args &body body) 
    `(labels ((,name ,args ,@body)) 
    #',name))