Clojure China

用缩进语法写 Clojure 的子集

#1

作为彻底的缩进党, 我对于 Clojure 的括号语法很不以为然… 反正就是各种歪脑筋
经过折腾以后, 终于找到办法, 就是把我的 Cirru 语法通过 Macro 生成 Clojure
Parser 的代码是早先完成的 Cirru Parser in Clojure:


具体生成代码的代码看这个仓库, 是很简单的 Macro 转换:

另外写了一个 watch plugin, 用来自动编译代码:

最终的效果可以看这个文件当中的例子, 我已经能用来写东西了:
https://github.com/Cirru/minifier.clj/blob/master/cirru-src/cirru/minifier/parse.cirru

其中字符串语法 |a 或者 "|a blank b" 确实比较奇葩, 属于 Cirru 影响的
两个分别编译是 “a” 以及 “a blank b”, 引号是针对空格出现的
| 完全是因为 Clojure 把其他的键盘按键都用掉了, 只剩下这个按键…

目前我使用的语法并不完善, 只覆盖了简单常用的语法
其他的语法按照 symbol 类型能自动转化的应该还好,
特殊的语法, 比如 `~@ 之类的, 不能用缩进表示, 目前完全没招

看看有没有看感兴趣?

1赞
#2

个人很讨厌缩进语法的语言, 尤其有时需要自动缩进的时候。

#3

可以说具体一点吗? 虽然跟个人的习惯关联很大, 但是反应在具体每个操作上能找到不方便的原因对吧.

#4

优化了一遍编译的结果, 现在看起来轻松多了

#5

我自己用 clojure 是因為他是用 S-表達式。要用縮進表達式的話我就會直接用 python 了~
Lisp 就是要滿滿的括號啊 XD

#6

这可不一样, Clojure 关键的好处是不可变数据, 一切皆是表达式, JVM 性能. 这个 Python 怎么比. 如果只是为了语法, 用 Racket 那样的方言括号反而更纯正一些.

#7

我猜我誤會樓主的意思了?
樓主想要的是縮進式的語言,但是有 Clojure 的不可變性,而 Cirru 這個專案其實和 http://clochure.org/ 有點像?

#8

是的, 我工作当中是 CoffeeScript + React + immutable-js , 这套组合在 ClojureScript 面前太山寨了. immutable-js 虽然提供了丰富的 API, 但是 React 在运行当中大部分时候还是基于原始的 JavaScript 对象在运行, 做得并不细致.

Cirru 是套纯缩进的方案, 而且考虑条件成熟以后用图形化编辑器来写代码, IDE 对代码自动进行布局, 比如 http://v2ex.com/t/225631 方括号的话我还是排斥的, 太不直观.

1赞
#9

代码的文本结构是给解析器看的,代码的视觉效果是为了方便人阅读理解。

sexp表达式本质上是一棵树,左括号和右括号分别标识着子叉的开始和结束,

有些人对lisp的括号感到恐惧,但其实经过缩进的lisp代码有一种简洁一致的美感,如同字帖一般规范。

如果看erlang的代码,经过几层嵌套后,几乎让人丧失了阅读的欲望,不够直观,也缺乏视觉上的美感。

有些语法糖是好的东西,比如C的数组引用c[10],非常直观,视觉效果要比cl中的(nth c 10)要明了得多。

回到Cirru语法上面,增加的语法糖,在阅读时是需要大脑解析的,见到一个$、|还要自动脑补含义,如果Cirru是一门流行语言的语法,到了找工作非学不可的地步,我想我会扔键盘的。

干嘛要给lisp画上几条腿呢。

#10

我写了好多年的 CoffeeScript, 我阅读缩进的代码从一开始就比匹配括号来得快. 我只有扫一眼缩进层级就知道代码结构怎样了, 这是我设计 Cirru 的初衷之一.

另外 Cirru 的真是形态其实是这样的, 更难适应, 缩进层级也更加明确:

#11

我一直在关注Cirru,Cirru相对于sexp并不存在缩进优势啊,sexp就不能缩进成这样了吗

#12

单纯对于阅读来说也可以. 但是写的时候回更累, 而且删除的之类的. 我用自己的编辑工具就很方便.