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)
2的命名空間,一個用於VAR的像f和一個用於如g函數。一旦它被傳入地圖 – jozefg
,你就不得不''funcall''g'是的,Scheme在這種情況下是一致的。 – GoZoner
GoZoner:聲稱thnat計劃是一致的是宗教,因爲它意味着其他任何不一致。 Lisp在分離函數和值名稱空間方面是一致的,它們以一致的方式擴展到更多的名稱空間。例如,「(defclass foo ..)」的存在並不妨礙你有一個名爲'foo'的函數或一個名爲'foo'的詞法或動態變量。 – Kaz