gpt4 book ai didi

macros - 如何将可选关键字参数与 & 其余内容混合使用?

转载 作者:行者123 更新时间:2023-12-04 10:45:18 26 4
gpt4 key购买 nike

我有一个需要 body 的宏:

(defmacro blah [& body] (dostuffwithbody))

但我也想给它添加一个可选的关键字参数,所以当它被调用时,它可能看起来像以下任何一个:
(blah :specialthingy 0 body morebody lotsofbody)
(blah body morebody lotsofboy)

我怎样才能做到这一点?请注意,我使用的是 Clojure 1.2,因此我还使用了新的可选关键字参数解构 Material 。我天真地尝试这样做:
(defmacro blah [& {specialthingy :specialthingy} & body])

但显然这并不奏效。我怎样才能完成这个或类似的事情?

最佳答案

可能类似于以下内容(另请参阅 defnclojure.core 中的其他一些宏是如何定义的):

(defmacro blah [& maybe-option-and-body]
(let [has-option (= :specialthingy (first maybe-option-and-body))
option-val (if has-option (second maybe-option-and-body)) ; nil otherwise
body (if has-option (nnext maybe-option-and-body) maybe-option-and-body)]
...))

或者你可以更老练;如果您认为在某些时候可能需要多种可能的选择,这可能是值得的:
(defn foo [& args]
(let [aps (partition-all 2 args)
[opts-and-vals ps] (split-with #(keyword? (first %)) aps)
options (into {} (map vec opts-and-vals))
positionals (reduce into [] ps)]
[options positionals]))

(foo :a 1 :b 2 3 4 5)
; => [{:a 1, :b 2} [3 4 5]]

关于macros - 如何将可选关键字参数与 & 其余内容混合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2753937/

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