MoonBit 在模式匹配的安全性和易用性上又迈进了一步 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Hooooooey
V2EX    程序员

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

  •  
  •   Hooooooey 272 天前 2503 次点击
    这是一个创建于 272 天前的主题,其中的信息可能已经有所发展或是发生改变。

    加了模式守卫( 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  
       272 天前
    不喜欢它的语法,特别是把 let 当常量。 估计只有被 rust 训过后的才能适应,但是搞 rust 的可以直接 wasm.
    InkStone
        2
    InkStone  
       272 天前
    @riceball 现代语言以 immutable 为默认语义很正常吧,也不只是 rust 这么干。
    w568w
        3
    w568w  
       272 天前
    @riceball Rust 又成出头鸟了?

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

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

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

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

    开源时间比我之前询问的预计完了将近一年: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  
       272 天前
    以及开源协议搞的还挺复杂,建议假开源少博眼球了
    UB
        16
    UB  
       272 天前
    @riceball 请问大哥这个是你的 github 吗? https://github.com/snowyu
    riceball
        17
    riceball  
       272 天前
    @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  
       272 天前
    @riceball
    这不是喜欢不喜欢的问题,C++几乎是流行语言中语义最丰富的之一,只有少数语言的复杂度能跟它一拼。
    C++不是 C with Class ,也不是 C with Template ,它是混合了很多种编程范式的大杂烩。

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

    另外把线性表和链表混为一谈也挺搞笑的。对你不懂的东西,真的是说多错多……
    InkStone
        19
    InkStone  
       272 天前
    @InkStone 对不熟悉的东西瞎说的结果就是跟我一样:回复完感觉不对劲,一查果然,Lisp 这种应该叫广义表而不是线性表……
    riceball
        20
    riceball  
       271 天前
    @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     Solana     4157 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 39ms UTC 10:11 PVG 18:11 LAX 02:11 JFK 05:11
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86