作为Lisp方言,Clojure继承了Lisp的同像性。同像性使元编程更容易,因为代码可以被视为数据:语言中的反射(在运行时检查程序实体)依赖于单一、均匀的结构,并且不必处理出现在复杂语法中的几种不同结构[1]。
更加均匀的语言结构的缺点是语言构造(例如循环、嵌套if语句、函数调用或switch语句等)彼此更加相似。
在Clojure中:
两种结构之间的区别只在一个单词上。在非同像语言中:
有没有办法在Clojure中使这些程序结构更容易识别(更加显眼)?也许有一些推荐的代码格式或最佳实践吗?
更加均匀的语言结构的缺点是语言构造(例如循环、嵌套if语句、函数调用或switch语句等)彼此更加相似。
在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中使这些程序结构更容易识别(更加显眼)?也许有一些推荐的代码格式或最佳实践吗?
(repaint
后面加上一个换行符,或者像你的"C"示例中那样缩进。在一个合适的编辑器中使用paredit、彩虹括号、吞吐等功能,你很快就会用不同(非花括号语言)的眼光看待这个问题。 - cfrick