所以有兩種方法來製作程序。你有這樣的:
(define name (lambda (arg ...) body ...))
而且有平等的語法糖:
(define (name arg ...) body ...))
如果你願意,你可以做相反的過程與最後一道工序:
(define my+func
(lambda numbers
(lambda (num)
(if (null? num)
0
(+ (car num) (my+func (cdr num)))))
numbers))
當您執行(my+func 1 2 3)
時,它會創建一個採用一個參數的過程。由於該過程不是最後一個表達式,因此它被丟棄並丟棄,最後一個表達式爲numbers
。因此,您將得到(1 2 3)
。
這會工作:
(define my+func
(lambda numbers
(if (null? numbers)
0
(+ (car numbers) (apply my+func (cdr numbers))))))
可以翻譯回加糖define
:
(define (my+func . numbers)
(if (null? numbers)
0
(+ (car numbers) (apply my+func (cdr numbers)))))
通知的apply
。這是因爲你不能發送(my+func '(2 3))
作爲遞歸,但它需要是(my+func 2 3)
,這就是apply
所做的。或者你可以使用列表,而不是一個幫手:
(define (my+func . numbers)
(define (helper ns)
(if (null? ns)
0
(+ (car ns) (helper (cdr ns)))))
(helper numbers))
一般人會選擇同樣的名稱在助手的數字,但我記得我很困惑的是不一樣的陰影變量。