2012-11-19 101 views
3

我一直在爲計劃中的想法奮鬥了幾天。我經常寫代碼的計劃默認值函數

(define fib_h (lambda (n a b) <body ...>)) 
(define fib (lambda (n) (fib_h n 0 1))) 

的風格,我認爲這將是對自己引入宏的好方法。不幸的是,它似乎超出了我如何宏觀化。我覺得我在一個點上親近與

(define-syntax dvf 
    (syntax-rules() 
    ((_ f (args ...) (name value) ... body) 
     <stuff that didn't work>))) 

這將定義一個函數「f」那要麼採取「ARGS ...」或「ARGS ......名字......」然後,如果只需要「參數...」它將「值...」應用於「名稱...」參數。 我可以想到兩個好辦法。第一個需要Y組合器,我真的不想和他們合作。另一種方式需要我以某種方式獲得「name ...」和「args ...」中的變量數量。如果有人能夠幫助我解決這個問題,我會很感激。

回答

1

您可能正在尋找case-lambda語法在SRFI-16中描述。這裏給出了這裏的實現:

(define-syntax case-lambda 
    (syntax-rules() 
    ((case-lambda) 
    (lambda args 
     (error "CASE-LAMBDA without any clauses."))) 
    ((case-lambda 
     (?a1 ?e1 ...) 
     ?clause1 ...) 
    (lambda args 
     (let ((l (length args))) 
     (case-lambda "CLAUSE" args l 
      (?a1 ?e1 ...) 
      ?clause1 ...)))) 
    ((case-lambda "CLAUSE" ?args ?l 
     ((?a1 ...) ?e1 ...) 
     ?clause1 ...) 
    (if (= ?l (length '(?a1 ...))) 
     (apply (lambda (?a1 ...) ?e1 ...) ?args) 
     (case-lambda "CLAUSE" ?args ?l 
      ?clause1 ...))) 
    ((case-lambda "CLAUSE" ?args ?l 
     ((?a1 . ?ar) ?e1 ...) 
     ?clause1 ...) 
    (case-lambda "IMPROPER" ?args ?l 1 (?a1 . ?ar) (?ar ?e1 ...) 
     ?clause1 ...)) 
    ((case-lambda "CLAUSE" ?args ?l 
     (?a1 ?e1 ...) 
     ?clause1 ...) 
    (let ((?a1 ?args)) 
     ?e1 ...)) 
    ((case-lambda "CLAUSE" ?args ?l) 
    (error "Wrong number of arguments to CASE-LAMBDA.")) 
    ((case-lambda "IMPROPER" ?args ?l ?k ?al ((?a1 . ?ar) ?e1 ...) 
     ?clause1 ...) 
    (case-lambda "IMPROPER" ?args ?l (+ ?k 1) ?al (?ar ?e1 ...) 
     ?clause1 ...)) 
    ((case-lambda "IMPROPER" ?args ?l ?k ?al (?ar ?e1 ...) 
     ?clause1 ...) 
    (if (>= ?l ?k) 
     (apply (lambda ?al ?e1 ...) ?args) 
     (case-lambda "CLAUSE" ?args ?l 
      ?clause1 ...))))) 
+0

謝謝!這很有幫助。 – Triclops200

+0

就像一個小小的附加評論:'case-lambda'旨在在[R7RS]中得到標準化(http://trac.sacrideo.us/wg/raw-attachment/wiki/WikiStart/r7rs-draft-7.pdf )。 – 2012-11-20 20:14:58

1

我可能會錯過了點,但不是這個酷似方案內置的默認參數工作:

(define f1 
    (lambda (n (a 0) (b 1)) 
    (printf "n:~a b:~a b:~a\n" n a b))) 

(f1 10) 
(f1 10 0 1) 
(f1 10 8 3) 

產量

n:10 b:0 b:1 
n:10 b:0 b:1 
n:10 b:8 b:3 
+1

標準方案沒有任何內置默認參數的語法。 – sepp2k

+1

方案中沒有默認值,使用默認語法。 – Triclops200

+0

根據RnRS你是對的,對不起。但我從來沒有使用過缺乏默認值的Scheme實現。 – uselpa