自己手撸了一个语言玩 - V2EX
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 8673 次点击
    这是一个创建于 3652 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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
       
    @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     Solana     955 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 19:03 PVG 03:03 LAX 12:03 JFK 15:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86