【问题标题】:How do I avoid nested `for` functions in Clojure?如何避免 Clojure 中嵌套的“for”函数?
【发布时间】:2021-04-02 00:42:22
【问题描述】:

在我不断努力在 Clojure 中复制命令式编程的过程中,我似乎仍在嵌套 for 函数。

例如,如果我想开始:

[[{:a 1 :b 2 :c 3} {:a 1 :b 2 :c 3}] [{:a 2 :b 2 :c 3} {:a 2 :b 2 :c 3}]]

然后得到:

[[:table [:tr [:td {:class "a-1" "b-2" "c-3"}] [:td {:class "a-2" "b-2" "c-3"}]]

如果没有我熟悉的其他语言中的经典嵌套 for 语句,我该怎么做?

我意识到我应该在这里粘贴我的尝试,但它太糟糕了。

更新:请参阅下面的点,我在 :class 值中使用了不正确的打嗝。

【问题讨论】:

    标签: clojure clojurescript


    【解决方案1】:

    我的建议是查看数据的结构(您已经拥有)并尝试根据您提供的数据分解问题。

    您有一个类似于行和单元格的结构,所以这是一种方法。您格式化行,这是格式化单个单元格的结果,然后每个单元格都需要具有作为哈希映射传递的 CSS 类。

    考虑到这一点:

    (defn cell-classes [cell]
      (->> (map (fn [[k v]] (str (name k) "-" v)) cell)
           (interpose " ")
           (reduce str)))
    
    (defn format-cell [cell]
      (let [classes (cell-classes cell)]
        [:td {:class classes}]))
    
    (defn format-row [cells]
      (->> (map format-cell cells)
           (into [:tr])))
    
    (defn format-rows [rows]
      (->> (map format-row rows)
           (into [:table])))
    

    如果我们用您的样本数据对其进行测试:

    (clojure.pprint/pprint (format-rows [[{:a 1 :b 2 :c 3} {:a 1 :b 2 :c 3}] [{:a 2 :b 2 :c 3} {:a 2 :b 2 :c 3}]]))
    

    打印出来

    [:table
     [:tr [:td {:class "a-1 b-2 c-3"}] [:td {:class "a-1 b-2 c-3"}]]
     [:tr [:td {:class "a-2 b-2 c-3"}] [:td {:class "a-2 b-2 c-3"}]]]
    

    PS:你想要的输出中有一个小问题,那就是{:class "a-1" "b-2" "c-3"} 不是打嗝的理想输出,这就是为什么我在cell-classes 上加入了带有空格的类名。

    【讨论】:

    • 哇!这很有帮助。我真的很喜欢使用这样的函数的想法,分解的结果,因为它比我进入的(有点不工作的)嵌套意大利面条代码更具可读性。我意识到使用具有这样名称的函数在精神上更方便。它们可能也更可用于其他项目。
    • 我应该提到,虽然我的标题提到了for 函数,但我也迷失在循环和重复尝试中。
    • 我也非常喜欢您的示例如何处理映射中的各种键值对,而无需提前在函数中指定它们。
    • 当你解决这个问题时,你的想法是什么?您是否或多或少地按照列出的顺序弄清楚了这些功能?也就是从内到外解决问题?
    • 在这个例子中,我从 format-rows 开始,编写了我需要的函数(format-rows,然后是 format-row,然后是带有内联函数的 format-cell,然后我提取它到细胞类)。在某些情况下,自下而上感觉更自然,但我想你会培养一些直觉,并根据你的想法采取一种或另一种方式。我倾向于大量使用箭头宏,但有些人更喜欢在“转换管道”的每个阶段尽可能使用 let 块和有意义的名称,这也没关系。
    猜你喜欢
    • 2017-09-20
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多