clojure - 使用 clojure 关键字处理符号

标签 clojure keyword symbols

我对 clojure 比较陌生,我想知道什么是解决以下问题的好方法。

我有两组符号,例如:

v1:

q w e r

v2:

a s d f

它们被用来构建第三组

答:

qa qs qd qf
wa ws wd wf
ea es ed ef
ra rs rd rf

A 的所有元素都是新符号,但我必须能够检索单个符号。我想对 A 进行各种操作,例如,构建 A 元素的所有组合的另一组或测试是否相等。

我想出了这两个解决方案:

解决方案 1:

(def A  {:qa [:q :a] :qs [:q :s] :qd [:q :d] :qf [:q :f]
         :wa [:w :a] :ws [:w :s] :wd [:w :d] :wf [:w :f]
         :ea [:e :a] :es [:e :s] :ed [:e :d] :ef [:e :f]
         :ra [:r :a] :rs [:r :s] :rd [:r :d] :rf [:r :f]})

(defn get-v1 [key] (first (key A)))

(defn get-v2 [key] (last (key A)))

=>(get-v1 :qa)
:q

解决方案2:

(def A [:qa :qs :qd :qf
        :wa :ws :wd :wf
        :ea :es :ed :ef
        :ra :rs :rd :rf])

(defn get-v1 [key] (keyword (str (first (name key)))))

(defn get-v2 [key] (keyword (str (last (name key)))))

=>(get-v2 :ws)
:s

事实上,解决方案 1 是不完整的,因为 A 元素的顺序也很重要。因此需要解2中A的定义。但我还没有找到在解决方案 1 中创建排序映射依据的明智方法。

问题:

1. 关键词是正确的选择吗?

2. 如果是这样,我的解决方案之一是一个好方法还是有更方便的方法?我倾向于解决方案 2。

最佳答案

从键中派生值是更通用的解决方案。这意味着您可以给它任何键,它都会返回“正确”的值。也就是说,您可以将 :xy 赋予第二个算法,即使它不包含在 A 中,它也会尝试使用它。如果这是一个问题,那么您的第一个解决方案似乎更好。

至于为第二个解决方案创建排序映射,我可能会采用 A 的定义并从中生成排序映射。这减少了手动重复,同时允许您以更自然的方式提供数据集。 (另外,它很容易测试!)

(def A [:qa :qs :qd :qf
        :wa :ws :wd :wf
        :ea :es :ed :ef
        :ra :rs :rd :rf])

(defn assoc-v
  [m k]
  (let [[a b] (seq (name e))]
    (assoc m k [(keyword a) (keyword b)])))

(defn make-a
  [elements]
  (reduce assoc-v (sorted-map) elements))

关于clojure - 使用 clojure 关键字处理符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17501365/

相关文章:

python - 使用 python 和 pandas 按数据框分组

Gnuplot:如何在 pdf 终端中获得更好的符号 alpha

java - 从 Jenkins 执行 clojure 测试

clojure - 对于更新世界 "state"的函数,我想返回发生的事件字符串的向量

clojure - Clojure 中的多行 shebang?

julia - 符号的比较运算符

clojure - 部署后在 ring/compjure 应用程序启动时执行函数

c++ - "static"关键字与变量、函数和类对象等有什么用?

search - 禁止搜索词