什么是执行的关键字,可选的标志给函数的最佳方式? 我想使函数调用,例如:

(myfunction 5)
(myfunction 6 :do-this)
(myfunction 3 :go-here)
(myfunction 2 :do-this :do-that)

使用DEFN,我可以定义一个函数,例如:

(defn myfunction [value & flags] ... )

flags变为列表。我可以写我自己的函数来搜索列表,但不包括在核心库这样的功能,所以我认为它不是地道的。

我现在使用什么:

(defn flag-set? [list flag] (not (empty? (filter #(= flag %) list))))
(defn flag-add [list flag] (cons flag list))
(defn flag-remove [list flag] (filter #(not= flag %) list))
有帮助吗?

解决方案

列表(以及载体和地图)不是数据结构的对基于值的查找一个很好的选择(将是线性的时间),这就是为什么clojure.core不具有这样的功能。

设定做提供快速的基于价值的查找经“载?”,所以怎么样

(defn foo [value & flags]
  (let [flags (set flags)]
    (if (contains? flags :add-one)
      (inc value)
      value)))

如果都不会有超过一个标志,你可以用解构这样的:

(defn foo [value & [flag]] …)

其他提示

clojure.contrib.def包括defnk宏,这使得定义函数以关键字参数更容易。

这是严格来说不是写这个的最有效的方法,但很显然

(defn myfunction [value & flags] 
  (cond (contains? (set flags) :a) 1
        (contains? (set flags) :b) 2)

它可能是更有效的因子(组标志)向上。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top