当前位置:  开发笔记 > 编程语言 > 正文

Clojure关键字参数

如何解决《Clojure关键字参数》经验,为你挑选了3个好方法。

在Common Lisp中你可以这样做:

(defun foo (bar &key baz quux)
  (list bar baz quux))

(foo 1 :quux 3 :baz 2) ; => (1 2 3)

Clojure没有关键字参数.一种选择是:

(defn foo [bar {:keys [baz quux]}] 
  (list bar baz quux))

(foo 1 {:quux 3 :baz 2}) ; => (1 2 3)

这是太多的嵌套括号,必须一直打字和阅读.它还需要将显式散列映射作为参数而不是平面列表传递.

什么是最惯用的Clojure相当于关键字参数,看起来没有人引发标点炸弹?



1> Alex Stoddar..:

要更新Clojure 1.2的这个答案,现在有完整的关键字arg支持,默认值由destruct绑定的地图形式提供:

user> (defn foo [bar &{ :keys [baz quux] 
                        :or {baz "baz_default" quux "quux_default"}}]
         (list bar baz quux))
#'user/foo

user> (foo 1 :quux 3)
(1 "baz_default" 3)


我认为这应该被提升为答案吗?

2> rincewind..:

在clojure中模拟关键字args的一种简单方法是在rest参数上使用hash-map,如下所示:

> (defn kwtest [x & e] (:foo (apply hash-map e)))
#'user/kwtest
> (kwtest 12 :bar "ignored" :foo "returned")
"returned"

Rich Hickey在来自clojure google组的此消息中提供了一个宏,为您提供关键字参数.在相应的线程包含有关为什么关键字参数不被支持的Clojure的信息.基本上是为了避免运行时开销.Rich在本消息中解释了我在上面显示的方法



3> pmf..:

最近添加的clojure.contrib.defdefnk宏,它允许使用关键字参数定义函数(参见此处).

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有