【问题标题】:Packing keyword arguments in Racket?在球拍中包装关键字参数?
【发布时间】: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


【解决方案1】:

您正在寻找的是make-keyword-procedure。这会生成一个接受所有关键字参数的过程,并且可以从字典中访问。以文档中的示例为例:

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

【讨论】:

  • 这看起来很方便。为了完整起见,这是我正在寻找的一半,因为它允许我们定义将关键字参数作为散列的函数。另一半将这些 kwargs 作为散列提供给可能尚未以这种方式定义的普通函数。为此,看起来我们可以使用apply/kw-hash。如果能以某种方式消除这种二元性就好了(例如,python 中提到的行为)......但也许没那么容易。
  • 是的,apply/kw-hash 是我见过的最好的。虽然内置在球拍中有keyword-apply。这是与make-keyword-procedure 的决斗。也许我应该更新答案以包含它?
  • 当然,那太好了。另一个注意事项 ftr:apply/kw-hash / keyword-apply 可与任何函数一起使用,无论是普通函数还是通过 make-keyword-procedure 定义的函数。
  • 最近遇到了arguments 包,作为另一种选择。
猜你喜欢
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
相关资源
最近更新 更多