2013-06-02 38 views
1

我們有兩種方法來定義函數:defun和lambda,我們可以使用setf來標記lambda函數。defun和lambda在lisp

(defun g (x) (* x x)) 
(setf f (lambda (x) (+ x x))) 

該函數可以是列表中的第一個元素。

(g 3) 
9 

或者它可以是另一個函數的參數。

(mapcar #'g '(1 2 3)) 
(1 4 9)  

但是,使用lambda時,用法是不同的。

(funcall f 3) 
6 

(mapcar f '(1 2 3)) 
(2 4 6) 

我很好奇差異背後的邏輯是什麼?

與計劃相當一致的用例相比,它更令人困惑。

> (define (g x) (+ x x)) 
> (g 3) 
6 
> (map g '(1 3 4)) 
(2 6 8) 

> (define f (lambda (x) (* x x))) 
> (f 2) 
4 
> (map f '(1 2 3)) 
(1 4 9) 
+3

2的命名空間,一個用於VAR的像f和一個用於如g函數。一旦它被傳入地圖 – jozefg

+0

,你就不得不''funcall''g'是的,Scheme在這種情況下是一致的。 – GoZoner

+0

GoZoner:聲稱thnat計劃是一致的是宗教,因爲它意味着其他任何不一致。 Lisp在分離函數和值名稱空間方面是一致的,它們以一致的方式擴展到更多的名稱空間。例如,「(defclass foo ..)」的存在並不妨礙你有一個名爲'foo'的函數或一個名爲'foo'的詞法或動態變量。 – Kaz

回答