在球拍中打包关键字参数?

问题描述 投票:0回答:1

是否有一种方法可以将函数的关键字参数指定为字典,类似于.允许我们提供位置参数列表?我正在寻找类似于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

是否有内置的方法来完成这种事情?如果没有,关于如何进行这项工作的任何想法?

racket keyword-argument argument-unpacking
1个回答
3
投票

您正在寻找的是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。

© www.soinside.com 2019 - 2024. All rights reserved.