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

[今天生日]造了个编译到 JavaScript 的语言取名叫做 Smooth

  •  4
     
  •   bramblex · 2016-05-24 23:04:50 +08:00 · 6086 次点击
    这是一个创建于 3107 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Github 传送门:https://github.com/bramblex/Smooth

    线上试用:http://bramblex.github.io/Smooth/

    特点:

    利用 do..with 语法糖轻松解决异步问题。

    # 异步的 delay 函数
    delay = `(ms)=>(f)=>setTimeout(()=>f(ms),ms)`
    
    # 将一个普通的函数封装成异步函数
    mkasync = `(job)=>(f)=>{job();f()}`
    
    # 将多个异步函数串联到一起
    async f g = f g
    
    # 以同步的方式写异步,每隔一秒依次输出 "hello" "world" "smooth"
    asyncJob = with async do
         delay 1000
         mkasync \_-> print $ "hello"
         delay 2000
         mkasync \_-> print "world"  
         n <- delay 3000 # 还可以取得异步函数的数据
         mkasync \_-> print $ "smooth " + n 
         
    main _ = asyncJob \_ -> print "done"
    

    可以自定义运算符

    # 定义 `+` 符号
    infixl 4 + add
    add = `(x)=>(y)=>x+y`
    
    # 定义 `<` 符号
    infixl 6 < lt
    lt = `(x)=>(y)=>x<y`
    
    # 定义 `$` 符号,用来消除括号
    infixr 0 $ app
    app f x = f x
    

    函数式和指令式混用

    # 定义 `+` 符号
    infixl 4 + add
    add = `(x)=>(y)=>x+y`
    
    # 定义 `<` 符号
    infixl 6 < lt
    lt = `(x)=>(y)=>x<y`
    
    impFunc n =
        let result = 0
        let i = 0
        while i < n
        	result = result + i
            i = i + 1
        	
    decFunc n = if n < 0 then 0 else n + decFunc n
    
    72 条回复    2016-05-26 12:06:36 +08:00
    southwolf
        1
    southwolf  
       2016-05-24 23:09:09 +08:00
    生日快乐!
    bramblex
        2
    bramblex  
    OP
       2016-05-24 23:10:30 +08:00
    @southwolf 谢谢 /w\
    Slienc7
        3
    Slienc7  
       2016-05-24 23:18:54 +08:00
    🎉生日快乐🎉
    lichun
        4
    lichun  
       2016-05-24 23:24:47 +08:00
    happy birthday
    shyling
        5
    shyling  
       2016-05-24 23:28:35 +08:00 via iPad
    `我不是 js`
    bramblex
        6
    bramblex  
    OP
       2016-05-24 23:33:44 +08:00
    @shyling

    主要方便和 js 之间互操作 /w\
    bramblex
        7
    bramblex  
    OP
       2016-05-24 23:34:09 +08:00
    @Slienc7
    @lichun

    谢谢 ~ OwO ~
    ctsed
        8
    ctsed  
       2016-05-24 23:46:59 +08:00 via iPhone
    明年就可以一起过生日了
    mactaew
        9
    mactaew  
       2016-05-24 23:50:04 +08:00 via iPhone
    黑皮波斯忒
    zzNucker
        10
    zzNucker  
       2016-05-25 00:10:25 +08:00
    迟到的生快~!
    aprikyblue
        11
    aprikyblue  
       2016-05-25 00:26:50 +08:00 via Android
    快生
    upczww
        12
    upczww  
       2016-05-25 00:29:36 +08:00 via Smartisan T1
    膜拜大神,生日快乐,好像晚了
    justjavac
        13
    justjavac  
       2016-05-25 00:52:17 +08:00 via Android
    生日快乐\^O^/
    4679kun
        14
    4679kun  
       2016-05-25 00:55:07 +08:00 via Android
    迟到的生快(=゚ω゚)=
    msg7086
        15
    msg7086  
       2016-05-25 01:25:41 +08:00
    这位姐姐生快~
    hewigovens
        16
    hewigovens  
       2016-05-25 07:20:13 +08:00
    github 上的 readme 发现一处错别字,“其本质就是一个简单的 CPS 变幻” 应为 “变换”?
    xiamx
        17
    xiamx  
       2016-05-25 07:26:24 +08:00
    生日快乐!
    linux40
        18
    linux40  
       2016-05-25 07:52:22 +08:00 via Android
    完成之后马上弃坑么。。。
    bramblex
        19
    bramblex  
    OP
       2016-05-25 08:22:50 +08:00 via Android
    @hewigovens 对… cps 变换,输入法的锅
    bramblex
        20
    bramblex  
    OP
       2016-05-25 08:23:56 +08:00 via Android
    @linux40 不准备弃坑…我是准备拿这东西实用的…模块系统和类型系统还没加上去
    bramblex
        21
    bramblex  
    OP
       2016-05-25 08:28:09 +08:00 via Android
    bramblex
        22
    bramblex  
    OP
       2016-05-25 08:29:30 +08:00
    @aprikyblue
    @upczww
    @justjavac
    @4679kun
    @msg7086

    上一条手误了,谢谢大家~
    xcodebuild
        23
    xcodebuild  
       2016-05-25 08:37:41 +08:00 via Android
    生日快乐🎉🎉
    chunqiuyiyu
        24
    chunqiuyiyu  
       2016-05-25 09:10:03 +08:00
    虽然看不懂,但是并不妨碍我说一句“生日快乐”
    iphantom
        25
    iphantom  
       2016-05-25 09:12:35 +08:00
    生快
    yuankui
        26
    yuankui  
       2016-05-25 09:16:55 +08:00
    需要哪些准备才能造一门语言?
    silvernoo
        27
    silvernoo  
       2016-05-25 09:19:40 +08:00
    生快
    w466397352
        28
    w466397352  
       2016-05-25 09:34:38 +08:00
    生日快乐\^O^/
    虽然我也看不懂
    scarlex
        29
    scarlex  
       2016-05-25 09:38:49 +08:00
    生日快乐 ~
    baocaixiong
        30
    baocaixiong  
       2016-05-25 09:51:39 +08:00
    生日快乐
    pyufftj
        31
    pyufftj  
       2016-05-25 10:40:39 +08:00
    @yuankui 编译原理看一下
    bramblex
        32
    bramblex  
    OP
       2016-05-25 11:15:52 +08:00
    @codefalling

    赶紧抱紧大腿,膜拜之~
    bramblex
        33
    bramblex  
    OP
       2016-05-25 11:16:31 +08:00
    guizer
        34
    guizer  
       2016-05-25 11:21:14 +08:00
    生快 代码什么的看不懂...
    bramblex
        35
    bramblex  
    OP
       2016-05-25 11:22:18 +08:00
    @pyufftj
    @yuankui

    我在造第一个版本,也就是 Smooth 的前身 BlxScript 的时候还没有看过编译原理……

    其实很多东西并没有想象得那么复杂,我建议是不看书,先用自己的方式尝试实现,等实现完了再去看书看理论。如果一开始就看书,可以说你完全不知道书里讲得啥;明白书里讲啥了还是不明白为啥要真么做;明白为啥这么做了又不知道这东西该用在那里;明白该用在那里了又不知道该怎么用……而先自己尝试用自己的想法去实现一个模型,再回去翻书,上面的一系列坑就都没有了。
    donghouhe
        36
    donghouhe  
       2016-05-25 11:24:48 +08:00
    服服服服服
    sinalvee
        37
    sinalvee  
       2016-05-25 11:26:07 +08:00
    虽然我也看不懂,但是生快!
    bramblex
        38
    bramblex  
    OP
       2016-05-25 11:53:11 +08:00
    @sinalvee 谢谢~
    gimp
        39
    gimp  
       2016-05-25 12:19:51 +08:00
    JJ 生日快乐~
    bramblex
        40
    bramblex  
    OP
       2016-05-25 12:53:30 +08:00
    @gimp 谢谢
    sdenvi
        41
    sdenvi  
       2016-05-25 13:40:24 +08:00 via iPhone
    生日快乐
    timhal
        42
    timhal  
       2016-05-25 13:48:52 +08:00
    啊 我明天呢╮( ̄⊿ ̄")╭被你抢先一步
    Lothar
        43
    Lothar  
       2016-05-25 13:52:27 +08:00
    没写过 haskell 的表示看起来真要命 😂 (生快
    superxzr
        44
    superxzr  
       2016-05-25 13:55:48 +08:00
    大触生快
    gamexg
        45
    gamexg  
       2016-05-25 14:15:14 +08:00
    生日快乐
    timeship
        46
    timeship  
       2016-05-25 14:20:25 +08:00
    生日快乐么么哒,感觉认识好久了
    bramblex
        47
    bramblex  
    OP
       2016-05-25 14:36:36 +08:00
    @timhal 那预祝明天生日快乐哈~ OwO~
    bramblex
        48
    bramblex  
    OP
       2016-05-25 14:37:04 +08:00
    @Lothar 只是语法像 haskell 因为我懒~
    bramblex
        49
    bramblex  
    OP
       2016-05-25 14:37:28 +08:00
    @superxzr 谢谢~
    wsph123
        50
    wsph123  
       2016-05-25 14:39:08 +08:00
    生日快乐!
    bramblex
        51
    bramblex  
    OP
       2016-05-25 14:39:20 +08:00
    @timeship /w\ 哈哈哈~
    narrowei
        52
    narrowei  
       2016-05-25 14:40:13 +08:00
    ╮(╯▽╰)╭生日快乐🎂
    SCaffrey
        53
    SCaffrey  
       2016-05-25 16:29:26 +08:00   ❤️ 1
    生日快乐\^O^/
    Exin
        54
    Exin  
       2016-05-25 16:34:41 +08:00   ❤️ 1
    又是个做编译器的大神
    timeback
        55
    timeback  
       2016-05-25 16:49:01 +08:00   ❤️ 1
    好吧,不认识,一样恭祝:生日快乐!!!🎂🎂🎂
    ProfFan
        56
    ProfFan  
       2016-05-25 16:54:54 +08:00
    @Exin purescript
    jamesarch
        57
    jamesarch  
       2016-05-25 16:58:12 +08:00
    生日快乐
    zqhong
        58
    zqhong  
       2016-05-25 17:55:47 +08:00
    生日快乐🎉🎉🎉! Star 一个先! ヽ(́◕◞౪◟◕‵)ノ
    bramblex
        59
    bramblex  
    OP
       2016-05-25 18:30:04 +08:00
    @narrowei
    @timeback
    @zqhong

    谢谢大家~
    bramblex
        60
    bramblex  
    OP
       2016-05-25 18:30:43 +08:00
    @ProfFan

    哎呦 /w\
    居然有人认识 PureScript ~
    hhkbp2
        61
    hhkbp2  
       2016-05-25 22:56:45 +08:00
    路过并支持
    自制语言其中的苦乐是一种很特别的经历
    ProfFan
        62
    ProfFan  
       2016-05-25 23:12:06 +08:00
    @bramblex CPS 变换给点赞~
    abcdabcd987
        63
    abcdabcd987  
       2016-05-25 23:37:54 +08:00
    哇塞, CPS 变换,比我前不久写的渣渣编译器厉害多了( http://v2ex.com/t/279656#reply2)
    guyskk
        64
    guyskk  
       2016-05-26 00:45:57 +08:00
    生日快乐!

    mkasync 要是改成 await ,当作关键字,就跟 python3.5, es6, c# 的异步差不多了
    bramblex
        65
    bramblex  
    OP
       2016-05-26 08:47:26 +08:00
    @ProfFan

    CPS 大法确实挺好的 /w\
    bramblex
        66
    bramblex  
    OP
       2016-05-26 08:47:52 +08:00
    @abcdabcd987

    你的比我厉害多了 /w\ 我的还没有后端呢~
    bramblex
        67
    bramblex  
    OP
       2016-05-26 08:51:42 +08:00
    @guyskk

    当然差很多……
    说句不好听的 pthon3.5 / es6 的 await 全是垃圾,把原本非常简单的问题搞得那么复杂。 c # 不会,所以不喷
    bramblex
        68
    bramblex  
    OP
       2016-05-26 08:58:20 +08:00
    @guyskk

    /w\ 其实说实话,我就是因为不想写 JavaScript ,并且觉得 Coffee 不够好, PureScript 不够方便我才自己造的~

    啦啦啦~
    cholerae
        69
    cholerae  
       2016-05-26 09:03:23 +08:00
    为什么用 purescript 写,这语言有什么优越之处?
    bramblex
        70
    bramblex  
    OP
       2016-05-26 10:26:42 +08:00
    @cholerae 显示优越感,光一个简单的 Monad 就能把绝大多数码农挡灾墙外
    Aidea
        71
    Aidea  
       2016-05-26 10:51:55 +08:00
    好屌,虽然看不懂,但还是生日快乐~
    dant
        72
    dant  
       2016-05-26 12:06:36 +08:00 via Android
    JJ 的思念生日快乐(
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2772 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 15:16 · PVG 23:16 · LAX 07:16 · JFK 10:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.