是否有一种方法可以将函数的关键字参数指定为字典,类似于.
允许我们提供位置参数列表?我正在寻找类似于python的*args and **kwargs。
更详细:
如果要在函数中处理任意数量的positional参数,我们可以这样定义它:
(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
除了位置参数外,我还看到apply
does forward on keyword argument。但是,这仅在被调用函数本身识别出期望的特定关键字参数时才有效。例如,在分派情况下,该函数本身并不使用关键字参数,而只是打算将其转发给某个适当的处理程序,因此以这种方式使用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
是否有内置的方法来完成这种事情?如果没有,关于如何进行这项工作的任何想法?
您正在寻找的是make-keyword-procedure
。这将生成一个接受所有关键字参数的过程,并且可以从字典中进行访问。请从docs中获取示例:
> (define show
(make-keyword-procedure (lambda (kws kw-args . rest)
(list kws kw-args rest))))
> (show #:blue 3 4)
'((#:blue) (3) (4))
当然,实现为两个列表的字典可能有点烦人。因此Alex Knauth制作了一个小程序包hash-lambda,它为您提供了更直接的哈希映射,例如API。