V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
bramblex
V2EX  ›  JavaScript

自己手撸了一个语言玩

  •  2
     
  •   bramblex · 2015-10-16 10:18:10 +08:00 · 8029 次点击
    这是一个创建于 3112 天前的主题,其中的信息可能已经有所发展或是发生改变。

    GayHub 求 start : https://github.com/bramblex/BlxScript

    在线测试地址:http://bramblex.github.io/BlxScript

    求各种指教 /w\

    第 1 条附言  ·  2015-10-16 11:20:01 +08:00
    函数式语言……支持闭包,函数柯里化……
    第 2 条附言  ·  2015-10-17 11:17:33 +08:00
    已经为自己的语言实现了 cps 变换。
    80 条回复    2016-01-09 13:11:07 +08:00
    anym0us
        1
    anym0us  
       2015-10-16 10:21:26 +08:00
    友情先支持一下
    bramblex
        2
    bramblex  
    OP
       2015-10-16 10:22:55 +08:00
    @anym0us /w\ 感谢支持
    bramblex
        3
    bramblex  
    OP
       2015-10-16 10:53:36 +08:00
    然而并没有什么人理我 TnT
    matsuijurina
        4
    matsuijurina  
       2015-10-16 11:06:56 +08:00   ❤️ 1
    挺有意思的,可以起个名字叫 goffeescript
    pubby
        5
    pubby  
       2015-10-16 11:09:25 +08:00
    @matsuijurina 缩进的, gothon 哈哈
    fyyz
        6
    fyyz  
       2015-10-16 11:11:19 +08:00
    支持尾递归优化吗?
    bramblex
        7
    bramblex  
    OP
       2015-10-16 11:13:37 +08:00
    @fyyz

    以后我自己解释的时候考虑下怎么做
    bramblex
        8
    bramblex  
    OP
       2015-10-16 11:13:50 +08:00
    @matsuijurina

    然而不喜欢 coffee
    Felldeadbird
        9
    Felldeadbird  
       2015-10-16 11:50:25 +08:00
    楼主这个语言最终是编译成 JS 么
    dsphper
        10
    dsphper  
       2015-10-16 11:55:19 +08:00
    := 哈哈
    Ouyangan
        11
    Ouyangan  
       2015-10-16 11:58:36 +08:00
    19
    oott123
        12
    oott123  
       2015-10-16 12:03:58 +08:00 via Android
    玻璃心 Script (逃
    bramblex
        13
    bramblex  
    OP
       2015-10-16 12:06:38 +08:00
    @Felldeadbird

    是啊,因为我懒(好吧,其实如果让我自己解决运行的问题的话,处理闭包和函数柯里化都比较复杂啦)……
    bramblex
        14
    bramblex  
    OP
       2015-10-16 12:07:24 +08:00
    @dsphper TnT 这是从 Io lang 抄来的
    bramblex
        15
    bramblex  
    OP
       2015-10-16 12:07:33 +08:00
    @Ouyangan thx /w\
    bramblex
        16
    bramblex  
    OP
       2015-10-16 12:08:01 +08:00
    @oott123

    对啊,楼主玻璃心,只能赞不能喷 /w\
    oott123
        18
    oott123  
       2015-10-16 12:12:43 +08:00 via Android
    @bramblex 赞赞赞
    Gonster
        19
    Gonster  
       2015-10-16 12:15:23 +08:00 via iPhone
    /w\ lz 好萌,点 star 看看
    cxshun
        20
    cxshun  
       2015-10-16 12:16:53 +08:00
    哈哈,果断 star 一下看看。
    linux40
        21
    linux40  
       2015-10-16 12:18:39 +08:00
    先友情支持一下。。。。
    ooTwToo
        22
    ooTwToo  
       2015-10-16 12:22:46 +08:00
    不明觉叼
    bramblex
        23
    bramblex  
    OP
       2015-10-16 12:24:11 +08:00
    @oott123

    thx
    bramblex
        24
    bramblex  
    OP
       2015-10-16 12:24:34 +08:00
    @Gonster
    @cxshun
    @linux40

    /w\ 感谢各种 star
    lzhtony
        25
    lzhtony  
       2015-10-16 12:33:25 +08:00
    很棒的样子.支持下.
    bramblex
        26
    bramblex  
    OP
       2015-10-16 12:45:13 +08:00
    @lzhtony
    感谢支持
    yxzblue
        27
    yxzblue  
       2015-10-16 12:54:20 +08:00
    已 start
    sun2920989
        28
    sun2920989  
       2015-10-16 12:55:34 +08:00
    这就是编译原理学完了之后不知道这门课能干啥的结果..................o(∩_∩)o 支持一下
    bramblex
        29
    bramblex  
    OP
       2015-10-16 12:59:52 +08:00
    @sun2920989

    话说,其实我都没有按照编译原理来 TnT
    firemiles
        30
    firemiles  
       2015-10-16 13:02:41 +08:00
    @bramblex 先 star 支持下,
    l := List 1 2 3 4 5 End
    print l # => [1, 2, 3, 4, 5]
    这个 list 定义好奇怪,为什么选择这么奇怪的写法
    bramblex
        31
    bramblex  
    OP
       2015-10-16 13:07:31 +08:00
    @firemiles

    因为 List 是一个函数。 List 接受一个参数以后,返回一个函数,直到接收的参数是 End 才会中止,并且返回数组。

    举个栗子
    l1 := List 1 2 3 4 5
    l2 := l1 6 7 End
    l3 := l1 8 9 End

    print l2 # => [1,2,3,4,5,6,7]
    print l3 # => [1,2,3,4,5,8,9]
    jiyinyiyong
        32
    jiyinyiyong  
       2015-10-16 13:19:43 +08:00
    模块方案和对象系统看得人够呛, 嗾使自己造的吗还是说 AMD 改的..
    parser 部分还没看明白...
    编译代码我当时做过后来干脆用 ES6 AST 直接发到 Babel 编译了, 推荐用 Babel 生成
    winkidney
        33
    winkidney  
       2015-10-16 13:22:10 +08:00   ❤️ 1
    lz 傻逼(好像 kso 的风气并不能带到 v2 哈哈哈
    bramblex
        34
    bramblex  
    OP
       2015-10-16 13:23:25 +08:00
    @jiyinyiyong

    那个 Class.js 还是不要看得好,太多黑科技了不适合观看。模块方案是 AMD 改编,不过这个也不用看啊……

    看代码只需要看 src/ 下的就行了。 dist/ 下的都是我用自己的工具包装过的,不适合观看。
    nooper
        35
    nooper  
       2015-10-16 13:24:15 +08:00 via iPad
    感觉语法很怪异
    bramblex
        36
    bramblex  
    OP
       2015-10-16 13:27:34 +08:00
    @winkidney 滚粗
    bramblex
        37
    bramblex  
    OP
       2015-10-16 13:28:31 +08:00
    @nooper

    如果你玩过 Haskell ,或者你懂 Lambda 演算。那么你会觉得我的语法很亲切
    LancerComet
        38
    LancerComet  
       2015-10-16 13:37:39 +08:00
    兹词一个,本人第一反应应该是 GoScript

    另外尝试传多个参数的时候报错,然后把例子复制过去也是报错



    难道是打开方式不对……
    bramblex
        39
    bramblex  
    OP
       2015-10-16 13:43:11 +08:00
    @LancerComet

    其实,这个语言里面没有中缀运算符……

    改成 a := add x y 就好了……
    bramblex
        40
    bramblex  
    OP
       2015-10-16 13:45:21 +08:00   ❤️ 1
    @LancerComet

    PaserError At Line 2, Char 10 刚好就是那个 + 号。 TnT
    oxyflour
        41
    oxyflour  
       2015-10-16 14:02:22 +08:00   ❤️ 1
    这个挺好玩的(已 star

    前段时间用 call/cc 玩 control flow 的时候自己也撸了个类似 lua 的函数式语言
    http://vlr.ofr.me/oxyflour/yalls
    https://github.com/oxyflour/yalls

    跟你的很像也区分了 = 和 := 呢
    不过到现在连 test 都没写完,更不要提文档了 orz (懒癌没治系列
    bramblex
        42
    bramblex  
    OP
       2015-10-16 14:11:39 +08:00
    @oxyflour

    已 star~

    我这里根本没有 test /w\……

    作为递归党来说,只要过程 pure ,那么只要一步是正确的,那么所有步肯定都是正确的 /w\。

    = 和 := 的区分我是从 Io lang 里面抄的。
    jiyinyiyong
        43
    jiyinyiyong  
       2015-10-16 14:21:32 +08:00
    @bramblex 我来凑个热闹.. http://script.cirru.org/
    Parser 部分实现完全不一样的, 代码生成直接 Babel 了
    bramblex
        44
    bramblex  
    OP
       2015-10-16 14:25:17 +08:00
    @jiyinyiyong

    /w\ 这种 lisp 式的语法好玩。
    zhantss
        45
    zhantss  
       2015-10-16 14:38:34 +08:00
    凑热闹看看
    htc502
        46
    htc502  
       2015-10-16 15:12:42 +08:00
    看着很牛逼的样子,虽然不懂。。。已 star 支持
    firemiles
        47
    firemiles  
       2015-10-16 16:52:19 +08:00
    @bramblex 都使用 lisp 的前缀语法,语法应该会很精简
    Exin
        48
    Exin  
       2015-10-16 17:11:33 +08:00
    感觉 V 站近期这样高技术水平的帖子少啊,新来的水货们都看不懂(包括我
    bramblex
        49
    bramblex  
    OP
       2015-10-16 17:20:06 +08:00
    @Exin

    嘛……我觉得我这个就是水贴而已……
    vicvinc
        50
    vicvinc  
       2015-10-16 17:27:39 +08:00
    太刁,当年编译原理挂了的,我现在只能做前端设计了
    bramblex
        51
    bramblex  
    OP
       2015-10-16 17:35:38 +08:00
    @vicvinc

    编译原理我就看了一个通宵,花了 5 个小时看书。然后过了
    yonka
        52
    yonka  
       2015-10-16 18:01:59 +08:00
    很像 py go
    bramblex
        53
    bramblex  
    OP
       2015-10-16 18:12:47 +08:00
    @yonka

    嗯……你多接触点语言以后就不会觉得像了 py go 了
    wittyfox
        54
    wittyfox  
       2015-10-16 19:21:25 +08:00 via Android
    👍
    linux40
        55
    linux40  
       2015-10-16 21:35:23 +08:00
    @bramblex 我暂时还没有账号,纯顶贴的。。。。
    dqh3000
        56
    dqh3000  
       2015-10-16 21:42:53 +08:00
    楼主做的很好,以后世界上所有语言都会被编译成 javascript 的!
    bramblex
        57
    bramblex  
    OP
       2015-10-16 22:06:05 +08:00
    @linux40 没事,好玩就好啦~
    bramblex
        58
    bramblex  
    OP
       2015-10-16 22:06:49 +08:00
    @dqh3000

    翻译成 JavaScript 是无奈之举……
    不过 JavaScript 哪里都可以用,什么特性都有,作为目标语言还是挺方便的
    dant
        59
    dant  
       2015-10-16 23:07:42 +08:00
    JJ 的思念(
    jings
        60
    jings  
       2015-10-16 23:14:20 +08:00
    求大鸡鸡神戴妃
    Exin
        61
    Exin  
       2015-10-16 23:44:34 +08:00
    @bramblex 是吗,我还是继续去撸自己的编译器好了
    Actrace
        62
    Actrace  
       2015-10-17 00:10:21 +08:00
    最适合编程的语言就是人类的语言。
    ototsuyume
        63
    ototsuyume  
       2015-10-17 00:12:55 +08:00
    想起来自己 2 年前也做过一个玩具语言
    https://github.com/ototsuyume/tinyscript
    虽然不像楼主那样支持那么多特性(当时还不知道 cury 是什么东西。。。),但是直接把代码编译然后用虚拟机执行的,可以跑过 8 皇后快排等代码,可是后面实在太忙没时间搞完。现在再看发现代码风格实在太差而且生成二进制代码的方法有问题,以后看来得重新开个坑来完善才行。。
    bramblex
        64
    bramblex  
    OP
       2015-10-17 00:45:26 +08:00
    @ototsuyume

    我已经可以给自己的语言做 cps 变换了 /w\
    bramblex
        65
    bramblex  
    OP
       2015-10-17 00:45:45 +08:00
    @Actrace

    最不适合编程的才是人类语言……
    bramblex
        66
    bramblex  
    OP
       2015-10-17 00:46:17 +08:00
    @Exin /w\ 加油
    bramblex
        67
    bramblex  
    OP
       2015-10-17 00:46:48 +08:00
    @dant /w\ 死基佬,看我肛你
    lizhuoli
        68
    lizhuoli  
       2015-10-17 11:05:01 +08:00 via iPhone
    @ototsuyume 已关注
    bramblex
        69
    bramblex  
    OP
       2015-10-17 11:35:43 +08:00 via iPad
    @jings 带你妹
    shakespaces
        70
    shakespaces  
       2015-10-17 13:18:34 +08:00
    已 star ,膜拜大神
    banxi1988
        71
    banxi1988  
       2015-10-17 15:56:06 +08:00
    List 的声明怎么比 JavaScript 现在的还到退了啊?

    l := List 1 2 3 4 5 End

    vs

    var l = [ 1,2,3,4,5]

    我宁愿下面一种。

    PS : 我就是因为 Java 对于字面量数组、字典支持不好而不喜欢的。
    bramblex
        72
    bramblex  
    OP
       2015-10-17 18:17:43 +08:00 via iPad
    @banxi1988

    List 是一个函数…能理解什么是函数么…
    bramblex
        73
    bramblex  
    OP
       2015-10-17 18:26:04 +08:00 via iPad
    @banxi1988

    况且把 List End 换成…[ ] 就几分钟的事而已……
    bramblex
        74
    bramblex  
    OP
       2015-10-17 18:42:03 +08:00 via iPad
    @banxi1988 顺便给你举个好玩的栗子

    l := List

    n := 0
    while not (compare 10 n)
    l = l n
    n = add n 1

    print (l End)
    keroro520
        75
    keroro520  
       2015-10-18 13:18:22 +08:00
    QAQ 原谅我孤陋寡闻,原来 js 能写这种东西啊,我一直以为 js 就是写 web 前端的。
    bramblex
        76
    bramblex  
    OP
       2015-10-18 13:42:34 +08:00 via iPad
    @keroro520 然而我这个编译器也能在网页前端上面跑

    不在于什么语言,而在于怎么用这门语言
    jings
        77
    jings  
       2015-10-20 22:46:04 +08:00
    没地方水,来着水。
    啦啦啦啦
    bramblex
        78
    bramblex  
    OP
       2015-10-21 15:43:32 +08:00
    @jings /w\ 干嘛来这里水
    icymorn
        79
    icymorn  
       2015-10-21 18:19:35 +08:00
    后排支持,等我整理完代码也来发
    adubi
        80
    adubi  
       2016-01-09 13:11:07 +08:00 via Android
    不明觉叼,可否加个 QQ
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5296 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 63ms · UTC 09:24 · PVG 17:24 · LAX 02:24 · JFK 05:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.