2011-02-16 20 views
9

在流程可以定義以下程序正確的語法:的lambda表達式其獲得任意數量的參數方案

(define (proc . vars) 
     (display (length vars))) 

這將讓你成參數的任何款項發送給PROC。但是,當我嘗試做這種方式:

(define proc (lambda (. vars) 
     (display (length vars)))) 

我得到以下錯誤:

read: illegal use of "."

我似乎無法找到一個lambda表達式其獲得任意數量的參數的正確語法。想法?

(我使用DrScheme,版本209,與語言設置爲PLT(圖形))

謝謝!

+0

與您的問題無關,我強烈建議您升級到最新版本的DrScheme,現在稱爲DrRacket。你可以在這裏下載: http://racket-lang.org/ – 2011-02-21 14:44:15

+0

@SamTH我使用的DrScheme版本是由我的大學支配的,但是,無論如何感謝 - 我可以在我的空閒時間閱讀SICP並使用此版本相反... – Hila 2011-02-21 17:14:58

回答

14

lambda第一個參數是參數列表:

(define proc (lambda vars 
    (display (length vars)))) 

(proc 1 2 4) ; 3 
(proc) ; 0 
+0

Lambda是一種特殊的形式,將lambda表單中的第二個事件稱爲「第一個參數」是一個錯誤。對不起,隊長在這裏迂腐。 – 2011-02-18 04:13:16

1

你應該忽略拉姆達的參數列表中的括號來表示一個可變數量的參數:

(define proc (lambda vars 
    (display (length vars)))) 
6

的關鍵洞察力瞭解(lambda args ...)語法(其他海報已經有幫助張貼)是一個孤立的非列表項(在這種情況下,args)是一個退化的不當列表。例如:

(define a '(arg1 arg2 . rest)) 
a     ; => (arg1 arg2 . rest) (improper list of length 2) 
(cdr a)    ; => (arg2 . rest)  (improper list of length 1) 
(cdr (cdr a))  ; => rest    (improper list of length 0)