位置无关参数与方案函数

时间:2009-06-25 17:05:42

标签: functional-programming lisp scheme

如何将与位置无关的参数传递给方案函数?

3 个答案:

答案 0 :(得分:2)

在PLT计划中,您可以使用:

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

(area 3 #:width 10)

(area #:width 10 3)

两者都会返回30。

答案 1 :(得分:1)

计划中没有标准支持,但请查看this

答案 2 :(得分: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表达式并从中构建一个等效的位置无关的lambda。