【问题标题】:Racket, execute arbitrary function with arbitrary number of parametersRacket,使用任意数量的参数执行任意函数
【发布时间】:2013-04-04 06:25:01
【问题描述】:

我想按照以下方式定义一个通用函数:

(define (gen-func other-func)
   (other-func))

这将执行传递给它的函数。但是,我希望能够使用other-func 传递参数。 所以如果我有:

(define (add-test a b c d)
    (+ a b c d))

(define (divide-test a b)
    (/ a b))

那我就可以了

(gen-func divide-test 3 4)

(gen-func add-test 1 2 3 4)

但它实际上会做我想要的(通过传递任意数量的参数来执行函数)。这是我学习 Racket 过程的一部分。

【问题讨论】:

    标签: macros scheme racket


    【解决方案1】:

    您正在寻找的是apply 和其他参数:

    (define (gen-func func . args)
       (apply func args))
    

    虚线参数列表func . args 导致第一个参数之后的所有参数都被收集到列表args 中。之所以这样是因为(func . args)(cons func args)是一样的,所以在调用函数时,func设置为(car arglist)args设置为(cdr arglist),也就是列表第一个之后的争论。

    【讨论】:

    • 非常感谢!顺便说一句,你知道有什么好的存储库可以找到可以做有趣事情的示例 Racket 代码吗?我知道 HTDP 和文档非常好,但我正在尝试处理宏。查看实际使用示例(宏解决实际问题)将非常有帮助
    • @NickO 不幸的是,我对 Racket 代码存储库没有任何建议。顺便说一句,说到宏:apply,你原来的问题的答案是一个普通的函数/过程。
    • @NickO Planet 上的第三方库有来源:planet.racket-lang.org。另外我想你可以尝试在 GitHub 上浏览 Racket 项目:github.com/languages/Racket
    • Rosetta Code 也可能是一个有用的存储库。 rosettacode.org/wiki/Racket
    • 伟大的建议,大家。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多