我要用缩进写 ES6, 我的个人项目 CirruScript

2015-04-06 00:55:57 +08:00
 jiyinyiyong
我憋了几年的事情终于做到了, 有点小激动, 先梳理下好了
不过 V2EX 上应该有不少大牛潜水... 先写个缩水的介绍:

我定义了一套基于缩进的语法, 实现了解释器跟代码格式化工具, 项目名字叫 Cirru
以及用 Cirru 语法生成 HTML, JSON 等等, 最近终于生成了能写个人项目的 JavaScript
今天进行了重构, 后端换成了 Mozilla Parser AST, 引入了 Babel, 提高生成代码的质量
编译细节我缺乏经验没有深入, 而 Babel 会对 ES6 AST 做优化, 所以比手写更加可靠

语法上模仿 Lisp, 但是强烈要求干掉跨行的括号来保证清晰, 还有严格使用缩进
大致观感是这样的(后面语法有更新, 也差不多), 这是 Gulp 你懂的

夸张一点的代码还可以看这里, 在写 React 模块:
https://github.com/Cirru/cirru-editor/blob/master/src/components/token.cirru#L26

如果有大神觉得还可以, 给点项目前进方向的建议吧
要是只是感兴趣想看看代码或者了解一下具体的想法, 也可以看下方的链接

CirruScript 的编译过程可以被成下面几个步骤:
Cirru 代码 -> Cirru AST -> ES6 AST -> ES5 JavaScript
三个箭头对应的项目分别是 Cirru Parser, Scirpus, 还有社区最近热门的 Babel
查看 Cirru Parser 解析语法 http://repo.cirru.org/parser/
查看 Scirpus 生成的 ES6 AST http://repo.cirru.org/scirpus/
查看 Babel 生成的 JavaScript http://repo.cirru.org/script/
查看完整项目 https://github.com/Cirru/cirru-script
查看 Cirru 相关项目 http://cirru.org

CirruScript 目前只是实现了 ES6 的子集, 后边打算根据个人需要添加一些功能
另外我也搜集过 LLVM 作为编译后端的资料, 目前技能点不够只好往后拖了 >_<
但是但是终于别人设计的编程语言用了四年终于用上自己设计的语言了!
虽然只是语法层面引入好看点的波兰表达式而已, 好吧我的要求不高
如果有其他好玩的想法也可以到微博私信聊啊 http://weibo.com/jiyinyiyong
4613 次点击
所在节点    分享创造
22 条回复
jybox
2015-04-06 01:33:11 +08:00
很早就听说了这个项目,看来现在已经相当完善了,建议维护一份像 CoffeeScript 官方一样的和 JavaScript 左右对照的语法教程,不然要了解语法的话简直基本靠猜啊。
Shared
2015-04-06 01:47:45 +08:00
写个简单的入门教程吧。
话说关键字有些酷炫啊(isnt 是怎么回事,反斜杠又是什么……
总之看上去很有趣,但是现在完全没头绪
jybox
2015-04-06 01:49:18 +08:00
@Shared isnt 显然来自 Coffee 嘛,不等于的意思
Shared
2015-04-06 02:12:01 +08:00
@jybox 好吧,没用过 Coffee……
infinte
2015-04-06 03:20:31 +08:00
PatEL 原本也想用缩进,后来还是改花括弧了。

infinte
2015-04-06 03:23:43 +08:00
(上面的语法其实有点老,现在 |. 算符是给换成 :. 了)
vibbow
2015-04-06 03:23:49 +08:00
不用括号而用缩进来表示层叠关系的都是耍流氓。
jiyinyiyong
2015-04-06 10:49:18 +08:00
@Shared 是的 isnt 是 CoffeeScript, 反斜杠是来自 Haskell 的匿名函数:
\x y -> x + y
jiyinyiyong
2015-04-06 10:51:22 +08:00
@vibbow 我用了括号的呀, 只是限制了不允许括号跨行.
Lisp 里的经验教训, 一旦括号跨行, 想要再匹配起来就不容易了
jiyinyiyong
2015-04-06 11:08:29 +08:00
@infinte 终于出现了大神... 但是我还是打算永远坚持这个语法的, 我还有后招
http://www.tudou.com/programs/view/lehLxTKfc5w/
Cirru 设计之处核心是一个结构化的编辑器, 直接编辑 AST,
文本本来是对现实的折衷的, 谁知道结果比结构化编辑器效果要好
而就文本来说, 确实比我把语法树写成文本还要简单个漂亮...
>. 操作符让我想起 Elixir 的 |> http://elixir-lang.org/docs/stable/elixir/Kernel.html#|>/2

对了 Patrisika 也是嵌套数组跟字符串的话我应该也能用 Cirru 来写的吧?
jiyinyiyong
2015-04-06 11:09:19 +08:00
@infinte 忘了问为什么改成花括号啊?
infinte
2015-04-06 20:50:57 +08:00
@jiyinyiyong PatEL AST-2(就是原始 AST)有保留算子比如 [.quasiquote]、[.unquote] 和 [.sliceunquote],转到 cirru 不一定方便
jiyinyiyong
2015-04-06 22:55:52 +08:00
改 Writer 打包流程的时候找了份 JSON 尝试了一下
Cirru 顶层表达式不能是字符串所以先不写 `.begin`
里边没有 $ ( ) " 这几个特殊字符, Writer 还好不会报错
https://github.com/be5invis/PatEL/blob/master/src/essential-macros.json
http://repo.cirru.org/writer/
https://gist.github.com/jiyinyiyong/90b1c522e8487f6cf622#file-patel-cirru
jiyinyiyong
2015-04-06 22:59:13 +08:00
@infinte 生成的效果远不如代码... 不过跟手写 JSON 比的话好多了
guangwong
2015-04-08 13:04:27 +08:00
卤煮好厉害。。 快开始搞语言后端。。
jiyinyiyong
2015-04-08 20:59:41 +08:00
@guangwong LLVM IR 的计划估计也要按月按年算,, 我可是全职的前端工程师 >_<
guangwong
2015-04-08 22:09:42 +08:00
@jiyinyiyong - -web 前端开发工程师转行 PL Compiler 前端工程师 。。。 X X,我也想转行。。
jiyinyiyong
2015-04-08 23:15:42 +08:00
@guangwong 这个事情说起来我还是有点浑浑噩噩的, 现在都想不清楚
估计这几年写前端不会变了. 先做原始积累学好编程, 然后想明白去干什么..
不过写 C++ 我真心不是那块料啊
jprovim
2015-05-17 05:14:18 +08:00
@jiyinyiyong star 支持. 如果能把研發過程發出來的話, 相信是比使用Cirru 語言本身更有幫助的.
jiyinyiyong
2015-05-18 01:04:19 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/181804

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX