gpt4 book ai didi

clojure - 如何使 clojure 程序结构更容易识别?

转载 作者:行者123 更新时间:2023-12-01 11:18:07 24 4
gpt4 key购买 nike

Clojure 作为 Lisp 方言,继承了 Lisp 的同音性。同质性使元编程更容易,因为代码可以被视为数据:语言中的反射(在运行时检查程序的实体)依赖于单一的同质结构,并且它不必处理可能出现在复杂语法中的多个不同结构[1] .

更同质的语言结构的缺点是语言结构(例如循环、嵌套 if、函数调用或开关等)彼此更相似。

在 Clojure 中:

   ;; if:
(if (chunked-seq? s)
(chunk-cons (chunk-first s) (concat (chunk-rest s) y))
(cons (first s) (concat (rest s) y)))

;; function call:
(repaint (chunked-seq? s)
(chunk-cons (chunk-first s) (concat (chunk-rest s) y))
(cons (first s) (concat (rest s) y)))

两种构造之间的区别只是一个词。在非谐音语言中:

// if:
if (chunked-seq?(s))
chunk-cons(chunk-first(s), concat(chunk-rest(s), y));
else
cons(first(s), concat(rest(s), y));

// function call:
repaint(chunked-seq?(s),
chunk-cons(chunk-first(s), concat(chunk-rest(s), y)),
cons(first(s), concat(rest(s), y));

有没有办法让这些程序结构在 Clojure 中更容易识别(更显眼)?也许一些推荐的代码格式或最佳实践?

最佳答案

除了使用支持针对不同情况突出显示语法的 IDE 之外,不,实际上没有办法在代码本身中区分它们。

您可以尝试使用格式化来区分函数调用和宏:

(for [a b]
[a a])

(some-func [a b] [a a])

但这会阻止您使用 for 来使用单行列表理解;有时它们可​​以整齐地放在一条线上。这也可以防止您将大型函数调用分成几行。除非减少函数是预定义的,否则我对 reduce 的大部分调用都采用以下形式:

(reduce (fn [a b] ...)
starting-acc
coll)

有太多场景可以尝试限制调用的格式。像 cond 这样更复杂的宏呢?

我认为要理解的一个关键点是窗体的操作完全取决于窗体中的第一个符号。与其依靠特殊的语法来区分它们,不如训练你的眼睛捕捉到表格中的第一个符号,并在脑海中快速“查找”。

实际上,只有少数情况需要考虑:

  • 特殊形式,如 iflet(实际上是 let*)。这些是语言的基本结构,因此您将不断接触到它们。

    • 我认为这些应该不会成为问题。当您看到 if 时,您的大脑应该会立即知道发生了什么。 There are so few special forms简单的内存是最好的途径。
  • 具有“异常”行为的宏,如线程宏和 cond。仍然有一些情况我会查看某人的代码,因为他们使用的是我不太熟悉的宏,所以我需要一秒钟来弄清楚代码的流程.

    • 不过只要练习一下宏就可以解决这个问题。无论如何,学习一个新的宏可以扩展您编写 Clojure 时的能力,因此应该始终考虑这一点。与特殊形式一样,确实没有那么多令人费解的宏,因此记住主要的宏(基本线程宏和条件宏)很简单。
  • 函数。如果不是上述任何一种,则它必须是一个函数并遵循典型的函数调用语法。

关于clojure - 如何使 clojure 程序结构更容易识别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47956775/

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