加了模式守卫( Pattern Guard )可与is
表达式配合使用引入新的变量,比如:
pub fn infer_type(env: Map[String, Type], expr: Expr) -> Type! {
match expr {
Lit(_) => Int,
Var(x) if env[x] is Some(ty) => ty,
Var(x) => fail!("{x} is undefined"),
_ => ...
}
}
这类特性能简化类型检查和错误处理逻辑,整体代码更加清晰干净。
1
riceball 1 天前
不喜欢它的语法,特别是把 let 当常量。 估计只有被 rust 训过后的才能适应,但是搞 rust 的可以直接 wasm.
|
3
w568w 1 天前
@riceball Rust 又成出头鸟了?
看了一下你大概是写过 JS 的,JS 里也是推荐优先使用 const (等价于这里的 let )吧。明明可以用 const 的地方写 let ,ESLint 也要报错的吧。 |
![]() |
5
Opportunity 1 天前
我倒是觉得比较丑的地方在于抄了 rust 的 let 绑定以后有搞了个 is 绑定,就为了写起来方便点,变量一会在左一会在右的。
|
6
foolishcrab 1 天前 via iPhone
很好奇这个语言的定位,现在非 c-like 就很难成为工业语言了。ai 时代大家学新语言的动力也大大下降
|
![]() |
7
guiyumin 1 天前 via iPhone
这个怎么长得像 rust
|
8
Chaidu 1 天前
比丑,这个可以和 Rust 并列第一🤣
|
9
riceball 20 小时 57 分钟前
@DOLLOR 从语义上说,let 没有一定是常量的意思,它的本意是"让",但是 constant 关键字定义其含义更准确,就是常量了。
我玩过 basic, Fortran, pascal, c, asm, FORTH, js, coffeescript, lisp, java, scala, go, rust 也玩,但不喜欢,我更喜欢 zig 一点。 @w568w 错了,js 最早根本没有 let,只有 var ,这意义也很明确。let 是后来出现的,为了表示其的生命域与 var 不同而出现的。不过现在 js 已经被 ECMAScript 标准弄的一团糟,感觉是一群搞 java 的人在瞎弄。实际上,有一段时间,在 js 中使用 const 性能反而比 let 更低,不过我没关注,因为我以为区分 const 和变量是好事,另外选择 js 本身就是需要它的高度动态可扩展的特性,而非关注它的性能,尽管 v8 的优化很给力。 @InkStone 这是你以为,变量就变量,常量就常量,而语言内部是否以 immutable 为主,那应该是语言特性,而不是开发者操心的,只不过如果开发者在 immutable 为主的语言中滥用变量,受到的惩罚会加重。 从未来 AI 层面来说,AI 的语料来自人类,因此哪一门语言的表达更贴近原始人类的语义,更类似自然语言的,将有更大的优势:也就是说你不需要去看专门的语法书,你只看代码就能读懂,AI 理解会更好。同时这门语言的对人来说学习门槛更低,或者说几乎不用学习。 而且 MoonBit 还丑在大量使用缩写: fn, pub 。如果这是一门汇编语言,那也就算了。 |
![]() |
10
luoyou1014 20 小时 44 分钟前
|
![]() |
12
InkStone 20 小时 11 分钟前
@riceball 你列的这些除了 Go 、Zig 、Rust ,还有个已经死了的 coffee ,都是二十年以上历史的老语言了。这大概就是为什么你对“现代语言”这四个字毫无感觉,你是真不知道现代语言长什么样……
const 和 immutable 不是一个概念。很高兴看到你没在你“玩过”的语言里列出 C++,这至少说明你还有些自知之明。 |
13
aloxaf 20 小时 2 分钟前
@riceball #9 你这堆语言里恰好没有 c++,不然肯定不会觉得用 constant 含义更准确。
rust 明确区分「编译期常量」和「不可变变量」,如果用 const 代表不可变,那编译期常量就难办了。 就算要换掉 let ,final 这种明显也比 const 更合适,当然按照 rust 惜字如金的关键字风格,选 let 也在意料之中。 |
14
lyH0k1a 18 小时 54 分钟前
把我在知乎上的评论放在这里了。
开源时间比我之前询问的预计完了将近一年:https://github.com/moonbitlang/moonbit-docs/issues/82 编译器源代码似乎是转译生成的: - 全部文档里除了每个文件开头的 License ,一行注释也没有 - 至少 Parser 是 menhir 生成的,但是 menhir 的源代码不知道跑哪里去了: http://link.zhihu.com/?target=https%3A//github.com/moonbitlang/moonbit-compiler/blob/c4664ce8fd69c678303c136fda683c591b3a2abf/src/attribute_parser.ml - 这几个地方也疑似是生成的: http://link.zhihu.com/?target=https%3A//github.com/moonbitlang/moonbit-compiler/blob/c4664ce8fd69c678303c136fda683c591b3a2abf/src/basic_constr_info.ml%23L39 ; http://link.zhihu.com/?target=https%3A//github.com/moonbitlang/moonbit-compiler/blob/c4664ce8fd69c678303c136fda683c591b3a2abf/src/basic_core_ident.ml%23L72 ; http://link.zhihu.com/?target=https%3A//github.com/moonbitlang/moonbit-compiler/blob/c4664ce8fd69c678303c136fda683c591b3a2abf/src/basic_fn_address.ml%23L27 以及源代码更新速度跟不上编译器 release ,鬼知道你的编译器里面有没有后门? |
15
lyH0k1a 18 小时 53 分钟前
以及开源协议搞的还挺复杂,建议假开源少博眼球了
|
16
3085570450tt 18 小时 34 分钟前
@riceball 请问大哥这个是你的 github 吗? https://github.com/snowyu
|
17
riceball 12 小时 40 分钟前
@InkStone 对,我不喜欢 C++,尤其是里面的模板,我只认同 C ,虽然 CPP 本质还是 C 。你膜拜现代语言的“让”常量,而我老“土”了,不潮,一点不潮,现在的人动不动就说些莫名的话,抽象啊,吧尬吧尬啊,昆哥啊,中文也快被玩坏了。
@aloxaf 在我的印象中,lisp 是"链表",一切都是`((...))`,这让人惊叹,当然我很久都没再用过 lisp 了,因为 lisp 可读性差, logo 感觉稍好。与之对应的面向对象鼻祖 SmallTalk 的 Etoys ,则更有意思。 刚查了下:lisp 定义常量是 defconst https://www.cainiaoya.com/lisp/lisp-constants.html, let 估计是 lisp 后面发展的方言。 而 final 是最后/最终的意思,为啥要区分 编译期常量 和 运行时常量? 如果有这需求,编译期定义一般不是叫 macro 定义,而且更灵活。 以英文单词的本意来讲,翻翻字典就知道 let 绝没有 固定不变 的意思, 而 const/constant 就是常数之意。 无论是 fn, func 自己变量名用用就算了,但是在计算机语言中,特别是在计算机高级语言中这样用,就太随意了。尽量少缩写,少标新立异,不然英文这个词汇量还要继续膨胀,不停发明新词,在我看来就词汇信息量来说中文才是王道,尤其是文言。 以前在汇编语言时代,因为打孔作业,才流行缩写用语。 @3085570450tt 你可真能翻,是的。 |
![]() |
18
InkStone 12 小时 15 分钟前
@riceball
这不是喜欢不喜欢的问题,C++几乎是流行语言中语义最丰富的之一,只有少数语言的复杂度能跟它一拼。 C++不是 C with Class ,也不是 C with Template ,它是混合了很多种编程范式的大杂烩。 就你说的 const 的问题,C++就有 const 、constexpr 、consteval 来指代不同的情况,其中 const 在修饰函数、指针、引用的时候还有几种不同的行为。 为什么会说 C++,因为如果你了解 C++,那你很容易就能把其它语言的语义与 C++中的某一种情况做个映射——反之就很容易像你一样,把不同的概念混淆在一起。 另外把线性表和链表混为一谈也挺搞笑的。对你不懂的东西,真的是说多错多…… |
20
riceball 9 小时 57 分钟前
@InkStone 对 C++就是大杂烩,这就是我不喜欢的原因,因为我笨,我只搞得懂最简单的东西,C 因简单而喜欢.我喜欢 KISS. 那看你怎么定义链表(Lists)的,在我看,一个连一个(one point to another),就是链表,当然更仔细些:Lists in Lisp is a single Linked list. https://www.gnu.org/software/emacs/manual/html_node/eintr/Lists-diagrammed.html
|