V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
jiyinyiyong
V2EX  ›  分享创造

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

  •  1
     
  •   jiyinyiyong ·
    jiyinyiyong · 2015-04-06 00:55:57 +08:00 · 4617 次点击
    这是一个创建于 3520 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我憋了几年的事情终于做到了, 有点小激动, 先梳理下好了
    不过 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
    22 条回复    2015-07-27 19:41:34 +08:00
    jybox
        1
    jybox  
       2015-04-06 01:33:11 +08:00
    很早就听说了这个项目,看来现在已经相当完善了,建议维护一份像 CoffeeScript 官方一样的和 JavaScript 左右对照的语法教程,不然要了解语法的话简直基本靠猜啊。
    Shared
        2
    Shared  
       2015-04-06 01:47:45 +08:00
    写个简单的入门教程吧。
    话说关键字有些酷炫啊(isnt 是怎么回事,反斜杠又是什么……
    总之看上去很有趣,但是现在完全没头绪
    jybox
        3
    jybox  
       2015-04-06 01:49:18 +08:00
    @Shared isnt 显然来自 Coffee 嘛,不等于的意思
    Shared
        4
    Shared  
       2015-04-06 02:12:01 +08:00
    @jybox 好吧,没用过 Coffee……
    infinte
        5
    infinte  
       2015-04-06 03:20:31 +08:00
    PatEL 原本也想用缩进,后来还是改花括弧了。

    infinte
        6
    infinte  
       2015-04-06 03:23:43 +08:00
    (上面的语法其实有点老,现在 |. 算符是给换成 :. 了)
    vibbow
        7
    vibbow  
       2015-04-06 03:23:49 +08:00 via Android
    不用括号而用缩进来表示层叠关系的都是耍流氓。
    jiyinyiyong
        8
    jiyinyiyong  
    OP
       2015-04-06 10:49:18 +08:00
    @Shared 是的 isnt 是 CoffeeScript, 反斜杠是来自 Haskell 的匿名函数:
    \x y -> x + y
    jiyinyiyong
        9
    jiyinyiyong  
    OP
       2015-04-06 10:51:22 +08:00
    @vibbow 我用了括号的呀, 只是限制了不允许括号跨行.
    Lisp 里的经验教训, 一旦括号跨行, 想要再匹配起来就不容易了
    jiyinyiyong
        10
    jiyinyiyong  
    OP
       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
        11
    jiyinyiyong  
    OP
       2015-04-06 11:09:19 +08:00
    @infinte 忘了问为什么改成花括号啊?
    infinte
        12
    infinte  
       2015-04-06 20:50:57 +08:00
    @jiyinyiyong PatEL AST-2(就是原始 AST)有保留算子比如 [.quasiquote]、[.unquote] 和 [.sliceunquote],转到 cirru 不一定方便
    jiyinyiyong
        13
    jiyinyiyong  
    OP
       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
        14
    jiyinyiyong  
    OP
       2015-04-06 22:59:13 +08:00
    @infinte 生成的效果远不如代码... 不过跟手写 JSON 比的话好多了
    guangwong
        15
    guangwong  
       2015-04-08 13:04:27 +08:00
    卤煮好厉害。。 快开始搞语言后端。。
    jiyinyiyong
        16
    jiyinyiyong  
    OP
       2015-04-08 20:59:41 +08:00
    @guangwong LLVM IR 的计划估计也要按月按年算,, 我可是全职的前端工程师 >_<
    guangwong
        17
    guangwong  
       2015-04-08 22:09:42 +08:00
    @jiyinyiyong - -web 前端开发工程师转行 PL Compiler 前端工程师 。。。 X X,我也想转行。。
    jiyinyiyong
        18
    jiyinyiyong  
    OP
       2015-04-08 23:15:42 +08:00
    @guangwong 这个事情说起来我还是有点浑浑噩噩的, 现在都想不清楚
    估计这几年写前端不会变了. 先做原始积累学好编程, 然后想明白去干什么..
    不过写 C++ 我真心不是那块料啊
    jprovim
        19
    jprovim  
       2015-05-17 05:14:18 +08:00
    @jiyinyiyong star 支持. 如果能把研發過程發出來的話, 相信是比使用Cirru 語言本身更有幫助的.
    jiyinyiyong
        20
    jiyinyiyong  
    OP
       2015-05-18 01:04:19 +08:00
    holulu
        21
    holulu  
       2015-07-25 17:30:55 +08:00
    对于这个项目挺感兴趣的,不过感觉用缩进不爽,弄得像 elixir 那样的语法编译出 js 就爽了。毕竟 js 的语法非常原始,只能算得上是浏览器上的汇编语言,现在的 Web UI 即使是用 coffeescript 表达能力也很低。简单的 UI 功能都得写一堆。
    jiyinyiyong
        22
    jiyinyiyong  
    OP
       2015-07-27 19:41:34 +08:00
    @holulu ElixirScript 可以上!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1096 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:53 · PVG 02:53 · LAX 10:53 · JFK 13:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.