2011-07-16 31 views
1

沒有對flet因爲有let*let,我可以在Emacs中找到口齒不清的flet* - 所以任何這四種備選方案的更地道,用於通過flet定義一個函數定義一個函數多次使用?在這個例子中,add1是我想在add1twice內重複使用的功能,但不在其外部使用。flet相當於let *?

選項1

(defun add2 (x) 
    (flet ((add1 (x) (1+ x))) 
    (flet ((add1twice (x) 
       (add1 (add1 x)))) 
     (add1twice x)))) 

選項2

(defun add2 (x) 
    (flet ((add1twice (x) 
      (flet ((add1 (x) (1+ x))) 
       (add1 (add1 x))))) 
    (add1twice x))) 

選項3

(defun add2 (x) 
    (flet ((add1twice (x) 
      (let (add1) 
       (fset 'add1 (lambda (x) (1+ x))) 
       (add1 (add1 x))))) 
     (add1twice x))) 

選項4

(labels ((add1 (x) (1+ x))) 
    (defun add2 (x) 
    (flet ((add1twice (x) 
       (add1 (add1 x)))) 
     (add1twice x)))) 

(所有這些都產生相同的結果)

回答

1

雖然不是太清楚在the documentation for flet,其宏擴展表明,它容忍順序裝訂:

(defun add2 (x) 
    (flet ((add1 (x) (1+ x)) 
     (add1twice (x) 
      (add1 (add1 x)))) 
    (add1twice x))) 

說明文檔中提到建立「let風格綁定」 — 不是let* —但上面的定義仍然有效。

+0

OOPS!猜猜我應該先嚐試一下。 :) – hatmatrix

1

你也有labels這是flet,就像let*是爲let