方案函数的位置独立参数

发布于 2024-07-25 00:53:36 字数 26 浏览 2 评论 0原文

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

How do I pass position-independent parameters to scheme functions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

你怎么这么可爱啊 2024-08-01 00:53:36

在 PLT 方案中,您可以使用:

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

(area 3 #:width 10)

或者

(area #:width 10 3)

两者都会返回 30。

In PLT Scheme you can use:

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

(area 3 #:width 10)

or

(area #:width 10 3)

both would return 30.

一念一轮回 2024-08-01 00:53:36

方案中没有对此的标准支持,但请查看 this

There's no standard support for this in scheme but have a look at this

吻风 2024-08-01 00:53:36

我不是方案专家,但我认为参数需要是一对而不是原子,然后您从对中创建一个参数列表,并使用 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。

I am not a scheme guru, but I'm thinking that parameters need to be a pair rather than an atom, then you make a parameter list from your pairs and use a let block to bind the values to actual parameters. And, for the love of all that is beautiful, call a helper function to do the actual work with the parameters in the right order since calling get-param in recursion is going to get expensive.

(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)))))

Someone who is really clever would make a factory function that would take an arbitrary lambda expression and build an equivalent position independent lambda from it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文