V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Hooooooey
V2EX  ›  程序员

MoonBit 在模式匹配的安全性和易用性上又迈进了一步

  •  
  •   Hooooooey · 1 天前 · 1062 次点击

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

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

    20 条回复    2025-03-18 19:55:55 +08:00
    riceball
        1
    riceball  
       1 天前
    不喜欢它的语法,特别是把 let 当常量。 估计只有被 rust 训过后的才能适应,但是搞 rust 的可以直接 wasm.
    InkStone
        2
    InkStone  
       1 天前
    @riceball 现代语言以 immutable 为默认语义很正常吧,也不只是 rust 这么干。
    w568w
        3
    w568w  
       1 天前
    @riceball Rust 又成出头鸟了?

    看了一下你大概是写过 JS 的,JS 里也是推荐优先使用 const (等价于这里的 let )吧。明明可以用 const 的地方写 let ,ESLint 也要报错的吧。
    DOLLOR
        4
    DOLLOR  
       1 天前
    @riceball
    Swift 、F Sharp 、Haskell 也都是用 let 声明常量的,倒不如说 JS 才是不合群的一方
    Opportunity
        5
    Opportunity  
       1 天前
    我倒是觉得比较丑的地方在于抄了 rust 的 let 绑定以后有搞了个 is 绑定,就为了写起来方便点,变量一会在左一会在右的。
    foolishcrab
        6
    foolishcrab  
       1 天前 via iPhone
    很好奇这个语言的定位,现在非 c-like 就很难成为工业语言了。ai 时代大家学新语言的动力也大大下降
    guiyumin
        7
    guiyumin  
       1 天前 via iPhone
    这个怎么长得像 rust
    Chaidu
        8
    Chaidu  
       1 天前
    比丑,这个可以和 Rust 并列第一🤣
    riceball
        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 。如果这是一门汇编语言,那也就算了。
    luoyou1014
        10
    luoyou1014  
       20 小时 44 分钟前
    @riceball fn 非常好看,甚至比原单词 function 更优美,pub 中规中矩,说不上好看也不难看

    go 和仓颉的 func 丑到爆炸,导致生理不适
    aloxaf
        11
    aloxaf  
       20 小时 12 分钟前
    @riceball #1 把 let 当常量不是 lisp 最先这么干的吗,而且也影响了不少后续函数式语言,怎么就只有被 rust 训过的才能适应了
    InkStone
        12
    InkStone  
       20 小时 11 分钟前
    @riceball 你列的这些除了 Go 、Zig 、Rust ,还有个已经死了的 coffee ,都是二十年以上历史的老语言了。这大概就是为什么你对“现代语言”这四个字毫无感觉,你是真不知道现代语言长什么样……

    const 和 immutable 不是一个概念。很高兴看到你没在你“玩过”的语言里列出 C++,这至少说明你还有些自知之明。
    aloxaf
        13
    aloxaf  
       20 小时 2 分钟前
    @riceball #9 你这堆语言里恰好没有 c++,不然肯定不会觉得用 constant 含义更准确。

    rust 明确区分「编译期常量」和「不可变变量」,如果用 const 代表不可变,那编译期常量就难办了。
    就算要换掉 let ,final 这种明显也比 const 更合适,当然按照 rust 惜字如金的关键字风格,选 let 也在意料之中。
    lyH0k1a
        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 ,鬼知道你的编译器里面有没有后门?
    lyH0k1a
        15
    lyH0k1a  
       18 小时 53 分钟前
    以及开源协议搞的还挺复杂,建议假开源少博眼球了
    3085570450tt
        16
    3085570450tt  
       18 小时 34 分钟前
    @riceball 请问大哥这个是你的 github 吗? https://github.com/snowyu
    riceball
        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 你可真能翻,是的。
    InkStone
        18
    InkStone  
       12 小时 15 分钟前
    @riceball
    这不是喜欢不喜欢的问题,C++几乎是流行语言中语义最丰富的之一,只有少数语言的复杂度能跟它一拼。
    C++不是 C with Class ,也不是 C with Template ,它是混合了很多种编程范式的大杂烩。

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

    另外把线性表和链表混为一谈也挺搞笑的。对你不懂的东西,真的是说多错多……
    InkStone
        19
    InkStone  
       12 小时 9 分钟前
    @InkStone 对不熟悉的东西瞎说的结果就是跟我一样:回复完感觉不对劲,一查果然,Lisp 这种应该叫广义表而不是线性表……
    riceball
        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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1004 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:52 · PVG 05:52 · LAX 14:52 · JFK 17:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.