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 中更容易识别(更显眼)?也许一些推荐的代码格式或最佳实践?