V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Kulics
V2EX  ›  程序员

自荐一个编程语言: Lite

  •  1
     
  •   Kulics ·
    kulics · 2019-07-21 09:08:10 +08:00 · 11252 次点击
    这是一个创建于 1712 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 项目地址: https://github.com/kulics/lite

    • 类别:编程语言

    • 项目后续更新计划: 语法设计已经稳定( 1.0-alpha ),后续主要精力将放在编译器实现改进迭代,扩展到更多场景。

    • 项目描述: Lite 是一个专注于工程化的开源通用编程语言。

      这门语言的设计目标是简单性、可读性、可理解性。

      通过去除关键字,减少语法特性,统一表达规范,这门语言可以有效降低读写负担,让使用者能够把真正的注意力放在解决问题上。

      目前支持输出到 C#/Go/TypeScript,借助它们的资源,已经可以在非常广泛的场景下使用这门语言。

    • 推荐理由:精心设计的语法,易于编写和阅读。可能是目前世界上语法最精简的静态编程语言。

    • 示例代码:

    Main(->) {
        print("Hello, world!")
        greetings = get_greetings("love lite!")
        greetings @ [index]value {
            ? index == 0 {
                print(value)
            } index == 1 {
                print(value + ", 世界!")
            } _ {
                print(value + ", world!")
            }
        }
    }
    
    get_greetings(first str -> result []str) {
        <- first + {"你好", "Hola", "Bonjour",
                    "Ciao", "こんにちは", "안녕하세요",
                    "Cześć", "Olá", "Здравствуйте",
                    "Chào bạn"}
    }
    
    第 1 条附言  ·  2019-07-22 07:42:02 +08:00
    112 条回复    2019-07-29 20:07:07 +08:00
    1  2  
    anonymous256
        1
    anonymous256  
       2019-07-21 09:39:00 +08:00 via Android   ❤️ 10
    欣赏不来这种优雅
    gavindexu
        2
    gavindexu  
       2019-07-21 09:41:48 +08:00 via iPhone
    Ciao ……次奥🤣我出戏了
    NewDraw
        3
    NewDraw  
       2019-07-21 09:59:55 +08:00 via Android
    还不错,缺点是没有关键字就无法高亮了,代码结构会不太明显。
    tabris17
        4
    tabris17  
       2019-07-21 10:05:13 +08:00   ❤️ 5
    不要用符号来代替英文语句,不直观。

    我宁愿写成 if then else
    也不要 ? _
    SuperMild
        5
    SuperMild  
       2019-07-21 10:06:59 +08:00   ❤️ 3
    与 Go 相比,看不出来有什么优势啊。
    zeroDev
        6
    zeroDev  
       2019-07-21 10:11:41 +08:00 via Android
    以上观点中,开发者所需解决的主要问题是,代码高亮,代码提示等生态问题
    Abbeyok
        7
    Abbeyok  
       2019-07-21 10:12:16 +08:00 via Android
    写惯 Python 表示无法接收那么多<>
    whoami9894
        8
    whoami9894  
       2019-07-21 10:15:30 +08:00
    ```
    greetings @ [index]value {
    ? index == 0 {
    print(value)
    } index == 1 {
    print(value + ", 世界!")
    } _ {
    print(value + ", world!")
    }
    }
    ```

    不太能欣赏这样的语法
    nvioue
        9
    nvioue  
       2019-07-21 10:16:11 +08:00   ❤️ 1
    这是哪门子的易于阅读....

    哪天能直接用人类语言 中 /日 /英 直接写文章=编程 才是低门槛了 不再需要专门训练程序员
    VDimos
        10
    VDimos  
       2019-07-21 10:16:53 +08:00 via Android
    哪儿有可读性了。。。
    lxrmido
        11
    lxrmido  
       2019-07-21 10:17:17 +08:00
    挺好的,就是 shift 摁得有点多……
    jamesliu96
        12
    jamesliu96  
       2019-07-21 10:27:43 +08:00 via Android
    没必要,真没必要
    way2create
        13
    way2create  
       2019-07-21 10:33:24 +08:00
    看的头大
    Kulics
        14
    Kulics  
    OP
       2019-07-21 10:45:48 +08:00
    @NewDraw 其实操作符充当了关键字的位置,我已经写了一个语法高亮的 vscode 插件,代码结构看起来很舒服。
    Kulics
        15
    Kulics  
    OP
       2019-07-21 10:47:05 +08:00
    @zeroDev 已经写了一个 vscode 高亮插件,代码提示这个得慢慢来了,持续做下去。
    Kulics
        16
    Kulics  
    OP
       2019-07-21 10:53:55 +08:00
    @SuperMild 如果 Go 25 个关键字对于其它语言算是优势的话,Lite 语法更短也是优势。当然了,不抬杠,我也是个 Go 开发者,Lite 实际上也是我从 Go 的语法基础演变出来的,很多地方保留了 Go 的设计思想,仔细看看文档就会发现。
    surewen
        17
    surewen  
       2019-07-21 10:56:55 +08:00   ❤️ 1
    1. 敲 return 的速度肯定比<-快
    2. 关键词不是越少越好,运算符的理解成本远高于关键词
    3. 没看到任何工程化的特性。工程化的定义是整个提效项目开发周期如 脚手架、静态检查、灰度、发布体系等。
    Kulics
        18
    Kulics  
    OP
       2019-07-21 10:57:08 +08:00
    @nvioue 能写文章=编程就不需要关注这些旧时代编程语言了,我也期待有那么一天。但 Lite 的设计目标不是低门槛,实际上学习成本还是挺高的,我只做了优化语法设计的工作。
    murmur
        19
    murmur  
       2019-07-21 10:58:24 +08:00
    这种滥用拉姆达表达式的简化的除了 geek 谁会喜欢
    janxin
        20
    janxin  
       2019-07-21 11:01:13 +08:00
    欣赏不来。。。
    chinvo
        21
    chinvo  
       2019-07-21 11:02:02 +08:00 via iPhone
    真这么喜欢 lambda 表达式,可以试试 lisp 和 haskell
    lscho
        22
    lscho  
       2019-07-21 11:02:10 +08:00 via Android   ❤️ 1
    神烦各种符号。看上去代码精简了很多,但是输入中太慢太影响节奏,比如 php 的$和->。结果你这个比 php 的符号还多。
    cnxobo
        23
    cnxobo  
       2019-07-21 11:04:41 +08:00
    这个算是一种 DSL
    Kulics
        24
    Kulics  
    OP
       2019-07-21 11:10:32 +08:00
    @surewen
    1. 没有追求过敲键盘的速度,编程追求这个价值很低吧。
    2. 能表达清楚逻辑的前提下,关键词应该是越少越好,不然每个编程语言加新功能都可以玩命加关键词了。Lite 设计目标不面向低门槛,肯定得学过文档才能理解语法,学过之后的理解成本会低很多。
    3. 项目的工程化和编程语言的工程化不完全等同,脚手架之类的慢慢做都可以做出来,得依赖社区力量。
    surewen
        25
    surewen  
       2019-07-21 11:24:59 +08:00
    @Kulics
    1. 对于写代码的人来说,typing 的效率很关键,不然为什么有所有软件都有 shortcuts 和 vim ?
    2. 首先关键词不是越少越好 不等于 越多越好。其实现代编程语言的关键词集合都差不多,在这个基础上如果盲目减少,只会徒增复杂性。再次,“学过之后的理解成本会低很多” 哪个语言不这样?
    3. 参考 2,这个语言引入了众多不必要的复杂性,还是没明白到底工程化在哪儿
    mamahaha
        26
    mamahaha  
       2019-07-21 11:28:49 +08:00
    受中美贸易战影响,从战略意义上值得推广,不过渠道要把握好,亲美喷子和大厂水军的力量不容小觑,很多舆论导向都能被他们带动,希望你能挺住。
    vscode
        27
    vscode  
       2019-07-21 11:42:13 +08:00
    说真的,用各种符号来代表关键逻辑,这种真的是代码简单的代表吗?
    所谓可读性好,当我读到某些英文词汇的时候,就知道啥意思,但是读到符号,我脑子内部还需要再转换一下,说真的,不觉得.要是真的符号就代表简洁的话,那我们日常交流以后岂不是也会进化成为:,./;'[';.]..-=[!@#$#^&*...]啥意思呢?
    mokeyjay
        28
    mokeyjay  
       2019-07-21 12:01:04 +08:00   ❤️ 2
    能开发自己的语言很了不起,但不认同这种偏激的精简
    yvanst
        29
    yvanst  
       2019-07-21 12:05:49 +08:00 via Android
    patern match ? 感觉不如 scala 的设计好看
    Vegetable
        30
    Vegetable  
       2019-07-21 12:19:12 +08:00
    我个人理解没有一个关键词,应该也没有对应的功能才对。比如没有 if,这语言就不支持 if 判断,而不是用?去代替关键词吧。
    loading
        31
    loading  
       2019-07-21 12:23:52 +08:00 via Android
    箭头……输入是真的麻烦
    ihciah
        32
    ihciah  
       2019-07-21 12:24:19 +08:00 via iPhone
    比较好奇怎么做的。。
    编译器只有 binary 吗? source code 有没有公开的计划?
    way2create
        33
    way2create  
       2019-07-21 12:33:39 +08:00
    @lscho $输入很随意 ->是有点烦 有些 ide 补全还行
    pisc
        34
    pisc  
       2019-07-21 12:37:01 +08:00 via Android
    > 推荐理由:精心设计的语法,易于编写和阅读。可能是目前世界上语法最精简的静态编程语言。

    Haskell: hmmmmm....

    代码也没开源,这是要干啥。。。
    secondwtq
        35
    secondwtq  
       2019-07-21 12:40:06 +08:00 via iPad
    这个好像没比那撮搞中文编程的高到哪里去…
    luozic
        36
    luozic  
       2019-07-21 12:40:52 +08:00 via iPhone
    haskell lisp 变种有话说。
    liuxey
        37
    liuxey  
       2019-07-21 12:46:18 +08:00
    右手小拇指和你有仇吗?
    qdwang
        38
    qdwang  
       2019-07-21 12:51:37 +08:00 via iPhone   ❤️ 1
    别怪我太直白,只在语法上最创新的语言,就是垃圾
    mengzhuo
        39
    mengzhuo  
       2019-07-21 12:53:12 +08:00 via iPhone
    没有 spec 么...
    Justin13
        40
    Justin13  
       2019-07-21 12:55:32 +08:00 via Android
    这。。。Go 语言就足够丑陋了,你这丑上天啊
    no1xsyzy
        41
    no1xsyzy  
       2019-07-21 13:08:27 +08:00
    问题是关键词没少啊,如果你能明白 pascal.h 就知道为什么说关键词没变少了
    #define begin {
    #define end }
    #define if if(
    #define then )
    ……

    私以为,简洁的核心是 “匹配”,就像 erlang / elixir 做的那样。
    那一段循环,我觉得设计成这样更好:
    foreach(greetings) {
    0:value {
    print(value)
    }
    1:value {
    print(value + ", 世界!")
    }
    _:value {
    print(value + ", world!")
    }
    }
    secondwtq
        42
    secondwtq  
       2019-07-21 13:11:20 +08:00 via iPad
    @no1xsyzy 为什么 foreach 要带 pattern matching 的功能? do one thing and do it well 就不是简洁了?
    chenjau
        43
    chenjau  
       2019-07-21 13:20:39 +08:00
    关键词多寡从来不是真正的痛点. 且关键词比符号更易读, 直观. 使用符号代替关键词是南辕北辙.
    减少语言表达力的后果是代码繁琐, 增加读写负担. 极端的例子是 brainfuck.
    no1xsyzy
        44
    no1xsyzy  
       2019-07-21 13:23:14 +08:00
    @ihciah 我觉得你说反了,编译器没有 bin 只有 src。
    三个 releases 链接都是 “ There aren ’ t any releases here ”
    @pisc 同上,只有源代码。
    go 还可以 go run 一站式解决问题,姑且算问题不大
    C# 还得自己开编译器编译后再使用
    typescript 竟然还需要 Java 环境并 curl 一个 jar 包
    no1xsyzy
        45
    no1xsyzy  
       2019-07-21 13:36:29 +08:00
    @secondwtq 不如说 foreach 只有 pattern match,整个语言基本围绕 pattern match 发挥,连赋值都实质是 pattern match 的特形,函数调用也是 pattern match (函数定义是那个 pattern )。
    new_dict = {**dict, 'add_key': new_value}
    {**newer_dict, 'remove_key': extracted_value} = new_dict
    {**newest_dict, 'remove_key': extracted_value} = newer_dict // throws
    func({'what_i_need':the_value, **other_params_that_can_passthrough}){doSomething(the_value, other_params_that_can_passthrough)}
    这样反而不违背 do one thing,不是吗?

    不过 pattern match 的一个重要核心是有 atom 或者 symbol,不存在的话只能用字符串脏一下。
    secondwtq
        46
    secondwtq  
       2019-07-21 13:41:29 +08:00 via iPad
    @no1xsyzy 这个比楼主现在的东西有意思多了

    我觉得 symbol 还是要加的
    dandycheung
        47
    dandycheung  
       2019-07-21 13:41:46 +08:00 via iPhone
    我觉得挺好,不算难看,不用管别人,自己喜欢就好,不好再改
    hwdef
        48
    hwdef  
       2019-07-21 13:43:13 +08:00
    @pisc 开源了。。。。
    no1xsyzy
        49
    no1xsyzy  
       2019-07-21 13:46:46 +08:00
    另外,看 spec 的结论是和 go 一样强制 “{” 在前一行行尾不得新行
    还有,你说这是静态语言?为什么会有判断类型的语法?
    https://github.com/kulics/lite/blob/master/book-zh/document.md#%E6%A8%A1%E5%BC%8F%E5%8C%B9%E9%85%8D
    no1xsyzy
        50
    no1xsyzy  
       2019-07-21 14:06:55 +08:00
    @secondwtq 其实如果区分左值和右值的话最新 ES 就已经基本符合了,甚至 'a':a 可以被糖成 a。
    不区分左右就必然是函数式或者类函数式,不然的话 a,b,c = b,c,a 有歧义。
    区分的话不能 {'type':'addValue', 'content':value_to_add, 'received':true} = msg 这样做双向传递了
    if(msg['type']=='addValue'){value_to_add=msg['content'];msg['received']=true}
    不过可以
    [{'type':'addValue', 'content':value_to_add}|msgq] = msgq // 如果第一个消息类型是 addValue 就会被提取并移除。
    各有好坏吧。
    pisc
        51
    pisc  
       2019-07-21 14:07:33 +08:00 via Android
    @no1xsyzy 核心不是 coc 么,pattern match 不过就是个 eliminator 而已,而且跟 Atom, 和 symbol 有啥关系。
    @hwdef LZ 给的 repo 没有,是放其他地方了么。。。
    Kulics
        52
    Kulics  
    OP
       2019-07-21 14:35:51 +08:00
    @surewen
    1. 我没有特意追求 typing 效率,这不是 Lite 的目标,追求的人可以不用。
    2.3. 得完整看完文档之后才能真的理解是不是增加了复杂性,只看我贴出来的样板代码内容太有限。
    Kulics
        53
    Kulics  
    OP
       2019-07-21 14:37:00 +08:00
    @cnxobo 不太算是 dsl
    Kulics
        54
    Kulics  
    OP
       2019-07-21 14:38:59 +08:00
    @Vegetable 关键词跟功能没有意义上的相等,看怎么理解,有人觉得是操作符,有人觉得是关键字,我只想精简,怎么定义都行。
    Kulics
        55
    Kulics  
    OP
       2019-07-21 14:40:23 +08:00
    @vscode
    不是因为符号=>简单,是因为语法设计,就算把符号换成关键字,它也依然很精简。
    Kulics
        56
    Kulics  
    OP
       2019-07-21 14:41:47 +08:00
    @ihciah 文档里有提到开源仓库,反而我还没提供 binary。
    Kulics
        57
    Kulics  
    OP
       2019-07-21 14:42:58 +08:00
    @liuxey 有仇的,因为我们的姿势不一样
    Kulics
        58
    Kulics  
    OP
       2019-07-21 14:47:32 +08:00
    @no1xsyzy
    关键词被操作符替代了,数量上的确是没变少,我也没说过它门槛低,还是需要学习的,没有降低编程难度。
    那一段其实可以写的更短,但是没那么做,判断语法那里有提到另一种写法。
    hwdef
        59
    hwdef  
       2019-07-21 14:49:16 +08:00
    @pisc 因为支持输出到 C#/Go/TypeScript,无法放在一个仓库里,所以分开放在其他仓库了,在文档里有说明,有兴趣可以了解一下
    Kulics
        60
    Kulics  
    OP
       2019-07-21 14:51:44 +08:00
    @chenjau
    去掉关键字不是设计目标,目标是精简,Lite 跟 c# 基本无缝互操作,表达力没少多少。
    no1xsyzy
        61
    no1xsyzy  
       2019-07-21 14:52:12 +08:00
    @pisc “核心体验” 而不是 “实现核心” 或者 “核心思想”
    Kulics
        62
    Kulics  
    OP
       2019-07-21 14:52:45 +08:00   ❤️ 1
    @dandycheung 谢谢,反正自己爽是第一的。
    imNull
        63
    imNull  
       2019-07-21 14:54:04 +08:00 via Android
    支持楼主
    Kulics
        64
    Kulics  
    OP
       2019-07-21 14:55:09 +08:00
    @no1xsyzy { 的确是跟 go 一样必须在第一行。静态语言没有判断类型吗?至少我用的多的 c#和 go 都有。
    inhzus
        65
    inhzus  
       2019-07-21 14:55:13 +08:00 via Android
    看不起左撇子程序员?为什么要一直用右手小指!涉嫌歧视左撇子,建议击毙(滑稽
    love
        66
    love  
       2019-07-21 17:13:09 +08:00   ❤️ 1
    为啥要追求取消一切关键字?那不是更不可读了?
    比如你这个循环:

    @ {
    ...... # 永远不会跳出 #
    }

    太不显眼了

    至于跳出循环用 <-@ 这是什么鬼,简直是为符号而符号吧,用个 break 会死吗

    @ {
    <- @ # 什么都没执行就跳出了 #
    }
    wi
        67
    wi  
       2019-07-21 18:41:22 +08:00
    想法和有一致,也有不同,留个联系方式,我们交流一下
    datou
        68
    datou  
       2019-07-21 18:45:40 +08:00
    符号太多能劝退不少新手

    比如 c++和 rust 这样的
    v2nika
        69
    v2nika  
       2019-07-21 19:14:39 +08:00
    用符号换关键字有啥意义?
    Kulics
        70
    Kulics  
    OP
       2019-07-21 20:03:47 +08:00
    @love 可读性建立在学习语法之后,函数退出用了 <- ,循环退出用这个也是合理的。不会死,但没必要。
    Kulics
        71
    Kulics  
    OP
       2019-07-21 20:04:10 +08:00
    Kulics
        72
    Kulics  
    OP
       2019-07-21 20:05:44 +08:00
    @datou 本来设计目标也不是新手,没有想追求低门槛。写的语言多的人更容易体会到 Lite 的优点。
    Kulics
        73
    Kulics  
    OP
       2019-07-21 20:08:00 +08:00
    @v2nika 符号替换关键字没意义,精简语法有意义。
    zeroDev
        74
    zeroDev  
       2019-07-21 20:20:34 +08:00 via Android
    @qdwang 给个理由?
    GM
        75
    GM  
       2019-07-21 20:40:07 +08:00
    @datou 符号太特立独行既能劝退新手,也能劝退老手。
    tanszhe
        76
    tanszhe  
       2019-07-21 20:55:10 +08:00   ❤️ 1
    手动点赞 赞!!
    有些建议
    现在语言已经非常多了,一个新的语言还能流行起来,必然有自己非常明显的优势,正好解决程序员一些痛点。
    go,rust 算是新贵 都符合这个特征。
    no1xsyzy
        77
    no1xsyzy  
       2019-07-21 21:49:04 +08:00
    @Kulics 本来 Variant / Union 类型就是处于动态和静态中间的。
    要觉得 Variant 也能算静态类型,你怎么不说 Python 就是个类型是 any/c 的静态类型?它也能 annotation 写类型标记,有了这类型标记也能写个 linter。
    luopengfei14
        78
    luopengfei14  
       2019-07-21 22:10:48 +08:00 via iPhone
    虽然楼上很多人说不太好,但是我觉得敢写语言的都很牛逼,摩拜一下👍
    no1xsyzy
        79
    no1xsyzy  
       2019-07-21 22:19:12 +08:00
    @Kulics #58 我指的是你原文的 “通过去除关键字”,实际上你并没有去掉哪怕一个。
    何况问号 “?” 本身完全可以被设定为可用于标识符的字符。是问号、叹号还是 if 并没有什么区别。
    函数名 equal? null? bool? str?
    (defmacro ? c `(case ,@c))
    这样的语法糖我一分钟能写 26 个。
    不过如果要写 26 个我会先写个语法糖 (defmacro sweet (orig new) (let ((c (gensym))) `(defmacro ? ,c `(case ,@,c))))
    no1xsyzy
        80
    no1xsyzy  
       2019-07-21 22:25:37 +08:00
    另外一个,<-@ 对我来说更像是 continue
    (function @() {
    doSomething();
    if(sometimes()){
    return @()
    }
    doRest();
    return @()
    })()
    @ 是一个函数名,并且调用函数不需要括号(像 ruby 或者很多 shell )的话,return @() 就是在 call 自己,符合尾调死循环的 continue 等价物。
    no1xsyzy
        81
    no1xsyzy  
       2019-07-21 22:36:09 +08:00
    @luopengfei14 写语言没什么牛逼的,任何一个复杂、通用的项目就是设计一个新语言,只不过不一定是图灵完备的,可能不过是写出一种配置语言的实际用途。
    你可以说 grep 正是写一种语言,其词法语法符合正则表达式,同时其作用是向某个文件寻找所有符合该正则表达式的行。
    正如格林斯潘第十定律:任何 C 或 Fortran 程序复杂到一定程度之后,都会包含一个临时开发的、不合规范的、充满程序错误的、运行速度很慢的、只有一半功能的 Common Lisp 实现。
    jaynos
        82
    jaynos  
       2019-07-21 22:44:38 +08:00
    我如果要写这个语言, 是需要买一把自动按 Shift 的键盘, 还是买一把普通键盘然后买一堆的 Shift 键呢(滑稽
    Kulics
        83
    Kulics  
    OP
       2019-07-21 22:49:33 +08:00
    @tanszhe 谢谢你的建议,现在 Lite 依赖目标语言的实现,除了语言之外很难有自己独特的特性,我自知不是明显的优势。真正语言自己的优势恐怕得之后输出到 llvm 的时候才能有更创新的设计。
    Kulics
        84
    Kulics  
    OP
       2019-07-21 22:56:17 +08:00
    @no1xsyzy 我假设同学你已经读过 Lite 的文档,至少没忽略声明和自动推导部分。
    Lite 的类型大量用了自动推导,根本不是 Variant 那回事。
    这是用 Lite 写的一个 demo 项目,简单的 xamarin。
    建议可以看看 Lite 是怎么输出到 c# 的,这是一个静态语言,纯正的。
    https://github.com/kulics/lite-demo/tree/master/LiteDemo/LiteDemo
    Kulics
        85
    Kulics  
    OP
       2019-07-21 23:02:59 +08:00
    @no1xsyzy 我前面也回答过,实际上关键词相关的语法都在,只是没有沿用用英语单词形式的关键词。但是关键词指的就是那些词,符号被称作操作符,任何一个语言都是这么称呼,这么描述应该没有什么问题。
    btw,同学你对关键词的执念很深,即使把操作符换回关键词,Lite 的语法结构依然非常精简。
    设计目标不是去掉关键词,那是结果不是目的,纠着这个眼镜不放,好的地方怕是看出来了。
    Kulics
        86
    Kulics  
    OP
       2019-07-21 23:07:25 +08:00
    @no1xsyzy 当然用宏可以把 @ 这么玩。没有 Lite 之前我也是这么玩。
    那么这些呢
    ```
    @ true {
    ...
    }
    @ {
    ...
    }
    [0 < 10] @ i {
    ...
    }
    ```
    任何一个图灵等价的语言都可以完成差不多的功能,
    但是原生的和非原生的就是有差别,不然我们只学 lisp 就够了。
    建议至少看完文档。
    Kulics
        87
    Kulics  
    OP
       2019-07-21 23:09:21 +08:00
    @luopengfei14 谢谢,写语言不牛逼,这个差不多还只是毕业设计水平,我不是大神。我是闲着想做些新东西(滑稽)
    Kulics
        88
    Kulics  
    OP
       2019-07-21 23:11:44 +08:00
    @jaynos 程序员哪需要这些,程序员只需要两个按钮一个 ctrl+c,另一个。。。(滑稽)
    no1xsyzy
        89
    no1xsyzy  
       2019-07-22 00:39:34 +08:00
    @Kulics #84 如果说推导就能解决的话就根本不需要判断类型,因为编译期就能明确该变量是什么类型。C# 或者 go 的大致是用于接口、泛型、Variant、Union、继承或者 C++ 模版,这时常常已经无法编译期判断数据类型了。在我看来,C++ 因为虚函数和多态的存在也是介于静态和动态之间的东西。因为个人对 M$ 的偏见,没用过 C#,随便搜了一下,不知真假: https://www.runoob.com/csharp/csharp-polymorphism.html#override
    #85 所以说那只是表象,你还是没理解 pascal.h 的意义,我亲眼见过写惯了 Pascal 的去写 C 先引入几个 define 把 begin end 给变成花括号对的。对 C 来说花括号对 “{” 和 “}” 是不是关键字呢?至少在用 pascal.h 的人看来绝对是。
    操作符和关键字也不冲突,比如 Pascal 和 Python 的 and 以及 or。
    lexer 和 syntax 并不会区分拉丁字母作关键字或者符号作关键字,都是关键字,对它来说还是字节流或者字符流,看你的 lexer 好像用的现成的轮子,也难怪。
    还有,你说没说错和是目的还是结果没什么联系。
    #86 我是说直观上的,你这样把 <-@ 当作 break 是真的非常奇怪的结构。虽然确实应该按大嘴法,<-@ 是一个整体,但这一形式上的一致不可避免地让我感觉到这是 continue ……另一方面,看到 @ 的话总会觉得至少行为应该和 @ 所在的位置有所关联,而不是隔了十万八千里的对应 } 处。
    另外,确实只需要 “学” lisp 就够了(指 SICP ),其他的不过稍微练习就行。连 Erlang 的消息驱动和微服务架构我都看 SICP 的时候重新发明了一遍。遗憾的是因为老爷子去世我才仔细了解到 Erlang 的消息驱动 Actor 式异步。连快速失败进程重启都发明了半遍(做得不完整,完全就是因为我做成消息拉动代码执行外加异常处理也是将异常作为消息抛到另一个信道上)。
    xujinkai
        90
    xujinkai  
       2019-07-22 00:50:07 +08:00
    主要是看不懂,Java,C#,python 直接看就能大概知道要干嘛,你这猜都不好猜。语法之外的疑问就一个:这是用来解决什么具体的问题的?
    no1xsyzy
        91
    no1xsyzy  
       2019-07-22 00:50:49 +08:00
    @Kulics 另外,你那个 demo 我看了半天自动推导都是交给 C# 的 var 关键词?
    no1xsyzy
        92
    no1xsyzy  
       2019-07-22 00:59:32 +08:00
    @Kulics #24 对了说起敲键盘的速度,我就是因为全拼太慢所以换的双拼。
    如果说敲键盘不能和脑子同步并形成肌肉记忆的话就是拖脑子后退,打乱思路。
    所以用 begin 比 { 好,end 比 } 好。
    Kulics
        93
    Kulics  
    OP
       2019-07-22 06:42:05 +08:00
    @xujinkai 为什么要猜,难道学门语言是靠关键词猜怎么用的吗,你是的话真强我佩服,我只会规规矩矩学文档。
    语法之外的疑问好解答:这个主要是用来解决程序员这个问题的(滑稽
    Kulics
        94
    Kulics  
    OP
       2019-07-22 06:58:18 +08:00
    @no1xsyzy
    1. 总之现在你确认 Lite 是静态语言了,any 类型肯定是需要的,推导不能解决一切问题,很多地方还得靠反射和类型判断,Lite 肯定也得支持。
    2. 我只说我去除了关键词,没说去掉了 token,不管字母还是符号到编译器都是 token,我喜欢操作符,不喜欢可以自行 fork 改成字母,这不影响 Lite 本身语法精简。
    3. lexer 和 parser 用的都是 antlr,用轮子难道有什么问题?敢情现在写个项目还要从汇编开始写吗。开源大轮子比自己写的要好千万倍吧,后端我还准备用 llvm。
    4. 老爷子去世我难过了好一阵,刚开始设计 Lite 看了好久 Erlang 的设计,里面的思想的确精辟,我也借鉴了一些。
    5. <- 是返回语义,我通过后面的内容判断返回的目标,<- value 是退出函数,<- @ 用来退出循环,这样符合这个语言自己的设计,统一表达规范是我很着重的部分,
    Kulics
        95
    Kulics  
    OP
       2019-07-22 07:15:03 +08:00
    @no1xsyzy 编译器实现了自动推导,输出到 C# 也得用 var 吧,为什么不用啊,写 C# 不用 var 吗? 233333
    Kulics
        96
    Kulics  
    OP
       2019-07-22 07:20:49 +08:00
    @no1xsyzy 双拼的确是非常快的,以前我在少数派工作的时候他们就大力推过,不过那时没有一个跨平台好用的双拼输入法,最终还是没坚持下去。
    现在我年纪大了,脑子转的很慢,写个代码要思前想后考虑很多,码字速度已经没拖脑子后腿了,追求不来速度(滑稽
    说真,要不你 fork 一份把操作符改成关键词试试玩玩,或者你觉得可以用什么关键词,发一份给我,我改个双模式,不影响编译。
    Niphor
        97
    Niphor  
       2019-07-22 09:08:45 +08:00
    难得一篇技术讨论的帖子快翻页了,参考的 go,我也就能理解为啥看的这么辛苦了...
    scalaer
        98
    scalaer  
       2019-07-22 09:14:56 +08:00
    基于 antlr 生成的,感觉像 dsl
    Kulics
        99
    Kulics  
    OP
       2019-07-22 10:20:42 +08:00
    @Niphor 对啊,难得讨论了回技术。一开始是以 go 为基础,现在差别挺大的,Lite 的语法需要看过文档学习后才能感觉到舒畅。
    Kulics
        100
    Kulics  
    OP
       2019-07-22 10:31:28 +08:00
    @mggis0or1 跟 dsl 差别挺大,通用编程,跟 C# 的语法复杂度差不多,基本无缝互操作,这个规模不太算是 dsl。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3719 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 10:38 · PVG 18:38 · LAX 03:38 · JFK 06:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.