自荐一个编程语言: Lite

2019-07-21 09:08:10 +08:00
 Kulics
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"}
}
11752 次点击
所在节点    程序员
112 条回复
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
2019-07-21 13:11:20 +08:00
@no1xsyzy 为什么 foreach 要带 pattern matching 的功能? do one thing and do it well 就不是简洁了?
chenjau
2019-07-21 13:20:39 +08:00
关键词多寡从来不是真正的痛点. 且关键词比符号更易读, 直观. 使用符号代替关键词是南辕北辙.
减少语言表达力的后果是代码繁琐, 增加读写负担. 极端的例子是 brainfuck.
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
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
2019-07-21 13:41:29 +08:00
@no1xsyzy 这个比楼主现在的东西有意思多了

我觉得 symbol 还是要加的
dandycheung
2019-07-21 13:41:46 +08:00
我觉得挺好,不算难看,不用管别人,自己喜欢就好,不好再改
hwdef
2019-07-21 13:43:13 +08:00
@pisc 开源了。。。。
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
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
2019-07-21 14:07:33 +08:00
@no1xsyzy 核心不是 coc 么,pattern match 不过就是个 eliminator 而已,而且跟 Atom, 和 symbol 有啥关系。
@hwdef LZ 给的 repo 没有,是放其他地方了么。。。
Kulics
2019-07-21 14:35:51 +08:00
@surewen
1. 我没有特意追求 typing 效率,这不是 Lite 的目标,追求的人可以不用。
2.3. 得完整看完文档之后才能真的理解是不是增加了复杂性,只看我贴出来的样板代码内容太有限。
Kulics
2019-07-21 14:37:00 +08:00
@cnxobo 不太算是 dsl
Kulics
2019-07-21 14:38:59 +08:00
@Vegetable 关键词跟功能没有意义上的相等,看怎么理解,有人觉得是操作符,有人觉得是关键字,我只想精简,怎么定义都行。
Kulics
2019-07-21 14:40:23 +08:00
@vscode
不是因为符号=>简单,是因为语法设计,就算把符号换成关键字,它也依然很精简。
Kulics
2019-07-21 14:41:47 +08:00
@ihciah 文档里有提到开源仓库,反而我还没提供 binary。
Kulics
2019-07-21 14:42:58 +08:00
@liuxey 有仇的,因为我们的姿势不一样
Kulics
2019-07-21 14:47:32 +08:00
@no1xsyzy
关键词被操作符替代了,数量上的确是没变少,我也没说过它门槛低,还是需要学习的,没有降低编程难度。
那一段其实可以写的更短,但是没那么做,判断语法那里有提到另一种写法。
hwdef
2019-07-21 14:49:16 +08:00
@pisc 因为支持输出到 C#/Go/TypeScript,无法放在一个仓库里,所以分开放在其他仓库了,在文档里有说明,有兴趣可以了解一下
Kulics
2019-07-21 14:51:44 +08:00
@chenjau
去掉关键字不是设计目标,目标是精简,Lite 跟 c# 基本无缝互操作,表达力没少多少。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/584791

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX