【发布时间】:2020-01-02 05:13:10
【问题描述】:
有没有办法将函数的关键字参数指定为字典,类似于.,它允许我们为位置参数提供列表?我正在寻找类似于 python 的*args and **kwargs 的东西。
更详细的:
如果我们想在一个函数中处理任意数量的位置参数,我们可以这样定义它:
(define (my-add . args)
(apply + args))
并将其与可变数量的参数一起使用:
(define numbers '(1 2 3))
(apply my-add numbers) ;=> 6
(define numbers '(1 2 3 4 5))
(apply my-add numbers) ;=> 15
即使对于没有通过. 语法显式处理位置参数“其余部分”的函数,我们也可以使用apply 从列表中解压缩位置参数。
(apply expt '(2 3)) ;=> 8
我看到applydoes forward on keyword arguments 除了位置参数。但是,这仅在被调用的函数本身识别出它所期望的特定关键字参数时才有效。例如,在函数本身不使用关键字参数而只是打算将它们转发到某个适当的处理程序的调度情况下,以这种方式使用 apply 并不能满足我们的需要,因为函数需要知道所有被它分派到的函数所接受的所有关键字参数,更不用说在调用处理程序之前以某种方式重新打包它们。
作为说明问题的具体示例,考虑一个简单的“echo args”函数,它回显传递给它的所有参数:
(define (echo-args . args)
(printf "~a" args))
只有位置参数:
> (echo-args 1 2 5)
(1 2 5)
带关键字参数:
> (echo-args 1 2 5 #:key 'hi)
; application: procedure does not accept keyword arguments
; procedure: echo-args
; arguments...:
; 1
; 2
; 5
; #:key 'hi
; Context:
; /Applications/Racket v7.5/collects/racket/repl.rkt:11:26
有没有内置的方法来完成这种事情?如果没有,关于如何使这项工作的任何想法?
【问题讨论】:
-
尝试“hash-lambda”包
标签: racket keyword-argument argument-unpacking