加了模式守卫( 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"),
_ => ...
}
}

这类特性能简化类型检查和错误处理逻辑,整体代码更加清晰干净。

不喜欢它的语法,特别是把 let 当常量。 估计只有被 rust 训过后的才能适应,但是搞 rust 的可以直接 wasm.

现代语言以 immutable 为默认语义很正常吧,也不只是 rust 这么干。

Rust 又成出头鸟了?

看了一下你大概是写过 JS 的,JS 里也是推荐优先使用 const (等价于这里的 let )吧。明明可以用 const 的地方写 let ,ESLint 也要报错的吧。

Swift 、F Sharp 、Haskell 也都是用 let 声明常量的,倒不如说 JS 才是不合群的一方

我倒是觉得比较丑的地方在于抄了 rust 的 let 绑定以后有搞了个 is 绑定,就为了写起来方便点,变量一会在左一会在右的。

很好奇这个语言的定位,现在非 c-like 就很难成为工业语言了。ai 时代大家学新语言的动力也大大下降

这个怎么长得像 rust

比丑,这个可以和 Rust 并列第一🤣

从语义上说,let 没有一定是常量的意思,它的本意是"让",但是 constant 关键字定义其含义更准确,就是常量了。

我玩过 basic, Fortran, pascal, c, asm, FORTH, js, coffeescript, lisp, java, scala, go, rust 也玩,但不喜欢,我更喜欢 zig 一点。

错了,js 最早根本没有 let,只有 var ,这意义也很明确。let 是后来出现的,为了表示其的生命域与 var 不同而出现的。不过现在 js 已经被 ECMAScript 标准弄的一团糟,感觉是一群搞 java 的人在瞎弄。实际上,有一段时间,在 js 中使用 const 性能反而比 let 更低,不过我没关注,因为我以为区分 const 和变量是好事,另外选择 js 本身就是需要它的高度动态可扩展的特性,而非关注它的性能,尽管 v8 的优化很给力。

这是你以为,变量就变量,常量就常量,而语言内部是否以 immutable 为主,那应该是语言特性,而不是开发者操心的,只不过如果开发者在 immutable 为主的语言中滥用变量,受到的惩罚会加重。

从未来 AI 层面来说,AI 的语料来自人类,因此哪一门语言的表达更贴近原始人类的语义,更类似自然语言的,将有更大的优势:也就是说你不需要去看专门的语法书,你只看代码就能读懂,AI 理解会更好。同时这门语言的对人来说学习门槛更低,或者说几乎不用学习。

而且 MoonBit 还丑在大量使用缩写: fn, pub 。如果这是一门汇编语言,那也就算了。

fn 非常好看,甚至比原单词 function 更优美,pub 中规中矩,说不上好看也不难看

go 和仓颉的 func 丑到爆炸,导致生理不适

#1 把 let 当常量不是 lisp 最先这么干的吗,而且也影响了不少后续函数式语言,怎么就只有被 rust 训过的才能适应了

你列的这些除了 Go 、Zig 、Rust ,还有个已经死了的 coffee ,都是二十年以上历史的老语言了。这大概就是为什么你对“现代语言”这四个字毫无感觉,你是真不知道现代语言长什么样……

const 和 immutable 不是一个概念。很高兴看到你没在你“玩过”的语言里列出 C++,这至少说明你还有些自知之明。

#9 你这堆语言里恰好没有 c++,不然肯定不会觉得用 constant 含义更准确。

rust 明确区分「编译期常量」和「不可变变量」,如果用 const 代表不可变,那编译期常量就难办了。
就算要换掉 let ,final 这种明显也比 const 更合适,当然按照 rust 惜字如金的关键字风格,选 let 也在意料之中。

把我在知乎上的评论放在这里了。

开源时间比我之前询问的预计完了将近一年: github.com/moonbitlang/moonbit-docs/issues/82

编译器源代码似乎是转译生成的:

  • 全部文档里除了每个文件开头的 License ,一行注释也没有
  • 至少 Parser 是 menhir 生成的,但是 menhir 的源代码不知道跑哪里去了: link.zhihu.com/?target=https%3A//github.com/moonbitlang/moonbit-compiler/blob/c4664ce8fd69c678303c136fda683c591b3a2abf/src/attribute_parser.ml
  • 这几个地方也疑似是生成的: link.zhihu.com/?target=https%3A//github.com/moonbitlang/moonbit-compiler/blob/c4664ce8fd69c678303c136fda683c591b3a2abf/src/basic_constr_info.ml%23L39 ; link.zhihu.com/?target=https%3A//github.com/moonbitlang/moonbit-compiler/blob/c4664ce8fd69c678303c136fda683c591b3a2abf/src/basic_core_ident.ml%23L72 ; link.zhihu.com/?target=https%3A//github.com/moonbitlang/moonbit-compiler/blob/c4664ce8fd69c678303c136fda683c591b3a2abf/src/basic_fn_address.ml%23L27

以及源代码更新速度跟不上编译器 release ,鬼知道你的编译器里面有没有后门?

以及开源协议搞的还挺复杂,建议假开源少博眼球了

请问大哥这个是你的 github 吗? github.com/snowyu

对,我不喜欢 C++,尤其是里面的模板,我只认同 C ,虽然 CPP 本质还是 C 。你膜拜现代语言的“让”常量,而我老“土”了,不潮,一点不潮,现在的人动不动就说些莫名的话,抽象啊,吧尬吧尬啊,昆哥啊,中文也快被玩坏了。

在我的印象中,lisp 是"链表",一切都是((...)),这让人惊叹,当然我很久都没再用过 lisp 了,因为 lisp 可读性差, logo 感觉稍好。与之对应的面向对象鼻祖 SmallTalk 的 Etoys ,则更有意思。 刚查了下:lisp 定义常量是 defconst www.cainiaoya.com/lisp/lisp-constants.html, let 估计是 lisp 后面发展的方言。 而 final 是最后/最终的意思,为啥要区分 编译期常量 和 运行时常量? 如果有这需求,编译期定义一般不是叫 macro 定义,而且更灵活。

以英文单词的本意来讲,翻翻字典就知道 let 绝没有 固定不变 的意思, 而 const/constant 就是常数之意。
无论是 fn, func 自己变量名用用就算了,但是在计算机语言中,特别是在计算机高级语言中这样用,就太随意了。尽量少缩写,少标新立异,不然英文这个词汇量还要继续膨胀,不停发明新词,在我看来就词汇信息量来说中文才是王道,尤其是文言。
以前在汇编语言时代,因为打孔作业,才流行缩写用语。

你可真能翻,是的。

这不是喜欢不喜欢的问题,C++几乎是流行语言中语义最丰富的之一,只有少数语言的复杂度能跟它一拼。
C++不是 C with Class ,也不是 C with Template ,它是混合了很多种编程范式的大杂烩。

就你说的 const 的问题,C++就有 const 、constexpr 、consteval 来指代不同的情况,其中 const 在修饰函数、指针、引用的时候还有几种不同的行为。
为什么会说 C++,因为如果你了解 C++,那你很容易就能把其它语言的语义与 C++中的某一种情况做个映射——反之就很容易像你一样,把不同的概念混淆在一起。

另外把线性表和链表混为一谈也挺搞笑的。对你不懂的东西,真的是说多错多……

对不熟悉的东西瞎说的结果就是跟我一样:回复完感觉不对劲,一查果然,Lisp 这种应该叫广义表而不是线性表……

对 C++就是大杂烩,这就是我不喜欢的原因,因为我笨,我只搞得懂最简单的东西,C 因简单而喜欢.我喜欢 KISS. 那看你怎么定义链表(Lists)的,在我看,一个连一个(one point to another),就是链表,当然更仔细些:Lists in Lisp is a single Linked list. www.gnu.org/software/emacs/manual/html_node/eintr/Lists-diagrammed.html