gpt4 book ai didi

Clojure 关键字和可选参数问题

转载 作者:行者123 更新时间:2023-12-04 01:53:03 25 4
gpt4 key购买 nike

我想创建一个函数,它接受一个必需的参数 x,一个可选参数 opt1 或一个关键字参数 opt2。

现在我有

(defn foo x & [opt1 {:keys [opt2]}]
...

但是当 x 和 opt1 都存在时,上面的签名只让我传入关键字参数 opt2
(foo 'x 'opt1 {:opt2 'opt2})

不是这样
(foo 'x {:opt2 'opt2})

请帮我创建一个函数,它接受一个必需的参数 X 和 opt1 或 opt2,其中 opt2 是关键字参数。

谢谢你。

编辑:我也想对其他宏做同样的事情。所以我仍然需要使用defmacro。

最佳答案

问题是模棱两可。考虑一个函数 (fn foo [x y & args])它接受两个可选参数,然后是任意数量的关键字参数。如果你把它叫做 (foo :bar :baz) ,你的程序是怎么处理的? x => :bar , y => :baz ?或 xy未提供,带单个 :bar => :baz关键字参数?

根据至少 one popular book 的说法,即使在 Common Lisp 中,它在解析函数参数方面可以说比 Clojure 更灵活,也不建议混合可选参数和关键字参数。 .

最好的办法是将所有参数更改为位置参数,或将所有参数更改为关键字参数。如果使用关键字参数,则可以使用哈希映射解构来为“可选”关键字参数提供默认值。

user> (defn foo [& {:keys [x y bar] 
:or {x 1 y 2 bar 3}}]
(prn [x y bar]))
#'user/foo
user> (foo)
[1 2 3]
nil
user> (foo :bar :baz)
[1 2 :baz]
nil

关于Clojure 关键字和可选参数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4287900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com