自荐一个编程语言: 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"}
}
11753 次点击
所在节点    程序员
112 条回复
no1xsyzy
2019-07-21 22:36:09 +08:00
@luopengfei14 写语言没什么牛逼的,任何一个复杂、通用的项目就是设计一个新语言,只不过不一定是图灵完备的,可能不过是写出一种配置语言的实际用途。
你可以说 grep 正是写一种语言,其词法语法符合正则表达式,同时其作用是向某个文件寻找所有符合该正则表达式的行。
正如格林斯潘第十定律:任何 C 或 Fortran 程序复杂到一定程度之后,都会包含一个临时开发的、不合规范的、充满程序错误的、运行速度很慢的、只有一半功能的 Common Lisp 实现。
jaynos
2019-07-21 22:44:38 +08:00
我如果要写这个语言, 是需要买一把自动按 Shift 的键盘, 还是买一把普通键盘然后买一堆的 Shift 键呢(滑稽
Kulics
2019-07-21 22:49:33 +08:00
@tanszhe 谢谢你的建议,现在 Lite 依赖目标语言的实现,除了语言之外很难有自己独特的特性,我自知不是明显的优势。真正语言自己的优势恐怕得之后输出到 llvm 的时候才能有更创新的设计。
Kulics
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
2019-07-21 23:02:59 +08:00
@no1xsyzy 我前面也回答过,实际上关键词相关的语法都在,只是没有沿用用英语单词形式的关键词。但是关键词指的就是那些词,符号被称作操作符,任何一个语言都是这么称呼,这么描述应该没有什么问题。
btw,同学你对关键词的执念很深,即使把操作符换回关键词,Lite 的语法结构依然非常精简。
设计目标不是去掉关键词,那是结果不是目的,纠着这个眼镜不放,好的地方怕是看出来了。
Kulics
2019-07-21 23:07:25 +08:00
@no1xsyzy 当然用宏可以把 @ 这么玩。没有 Lite 之前我也是这么玩。
那么这些呢
```
@ true {
...
}
@ {
...
}
[0 < 10] @ i {
...
}
```
任何一个图灵等价的语言都可以完成差不多的功能,
但是原生的和非原生的就是有差别,不然我们只学 lisp 就够了。
建议至少看完文档。
Kulics
2019-07-21 23:09:21 +08:00
@luopengfei14 谢谢,写语言不牛逼,这个差不多还只是毕业设计水平,我不是大神。我是闲着想做些新东西(滑稽)
Kulics
2019-07-21 23:11:44 +08:00
@jaynos 程序员哪需要这些,程序员只需要两个按钮一个 ctrl+c,另一个。。。(滑稽)
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
2019-07-22 00:50:07 +08:00
主要是看不懂,Java,C#,python 直接看就能大概知道要干嘛,你这猜都不好猜。语法之外的疑问就一个:这是用来解决什么具体的问题的?
no1xsyzy
2019-07-22 00:50:49 +08:00
@Kulics 另外,你那个 demo 我看了半天自动推导都是交给 C# 的 var 关键词?
no1xsyzy
2019-07-22 00:59:32 +08:00
@Kulics #24 对了说起敲键盘的速度,我就是因为全拼太慢所以换的双拼。
如果说敲键盘不能和脑子同步并形成肌肉记忆的话就是拖脑子后退,打乱思路。
所以用 begin 比 { 好,end 比 } 好。
Kulics
2019-07-22 06:42:05 +08:00
@xujinkai 为什么要猜,难道学门语言是靠关键词猜怎么用的吗,你是的话真强我佩服,我只会规规矩矩学文档。
语法之外的疑问好解答:这个主要是用来解决程序员这个问题的(滑稽
Kulics
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
2019-07-22 07:15:03 +08:00
@no1xsyzy 编译器实现了自动推导,输出到 C# 也得用 var 吧,为什么不用啊,写 C# 不用 var 吗? 233333
Kulics
2019-07-22 07:20:49 +08:00
@no1xsyzy 双拼的确是非常快的,以前我在少数派工作的时候他们就大力推过,不过那时没有一个跨平台好用的双拼输入法,最终还是没坚持下去。
现在我年纪大了,脑子转的很慢,写个代码要思前想后考虑很多,码字速度已经没拖脑子后腿了,追求不来速度(滑稽
说真,要不你 fork 一份把操作符改成关键词试试玩玩,或者你觉得可以用什么关键词,发一份给我,我改个双模式,不影响编译。
Niphor
2019-07-22 09:08:45 +08:00
难得一篇技术讨论的帖子快翻页了,参考的 go,我也就能理解为啥看的这么辛苦了...
scalaer
2019-07-22 09:14:56 +08:00
基于 antlr 生成的,感觉像 dsl
Kulics
2019-07-22 10:20:42 +08:00
@Niphor 对啊,难得讨论了回技术。一开始是以 go 为基础,现在差别挺大的,Lite 的语法需要看过文档学习后才能感觉到舒畅。
Kulics
2019-07-22 10:31:28 +08:00
@mggis0or1 跟 dsl 差别挺大,通用编程,跟 C# 的语法复杂度差不多,基本无缝互操作,这个规模不太算是 dsl。

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

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

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

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

© 2021 V2EX