2009-06-25 15 views

回答

2

在PLT的計劃,你可以使用:

(define area 
    (lambda (x #:width y) 
    (* x y))) 

(area 3 #:width 10) 

(area #:width 10 3) 

都將返回30

+0

有沒有辦法改變它?我知道我的命名參數與正在使用的參數相同。 (foo#:a 1#:b 0#:c 10) (foo#:a 1#:b 0#:c c) (+ a c) – unj2 2009-06-25 18:03:02

0

我不是一個計劃大師,但我在想參數需要是一對而不是一個原子,然後你從你的對中創建一個參數列表並使用一個let塊將這些值綁定到實際參數。而且,對於所有美麗的愛情來說,調用一個輔助函數以正確的順序完成實際的參數工作,因爲在遞歸中調用get-param會變得昂貴。

(define get-param (lambda (name pair-list) 
    (cond ((null? pair-list) nil) 
      ((eq? name (caar pair-list)) (cadr (car pair-list))) 
      (t (get-param name (cdr pair-list)))))) 

; position independent subtract always subtracts y from x 
; usage (f '(x 7) '(y 9)) => -2 
;  (f '(y 9) '(x 7)) => -2 
(define f (lambda (x-pair y-pair) 
    (let ((pl (list x-pair y-pair)) 
     (let ((x (get-param 'x pl)) (y (get-param 'y pl)) 
      (- x y))))) 

有人誰是真正的聰明會使這將需要一個任意lambda表達式,並從它建立一個相當於位置無關的拉姆達一個工廠函數。

1

有沒有在計劃這個沒有標準的支持,但看看this