199 个版本

0.6.42 2024 年 8 月 22 日
0.6.40 2024 年 7 月 24 日
0.6.33 2024 年 3 月 21 日
0.6.28 2023 年 12 月 30 日
0.5.13 2022 年 11 月 26 日

编程语言 中排名 31

Download history 258/week @ 2024-05-04 21/week @ 2024-05-11 172/week @ 2024-05-18 67/week @ 2024-05-25 22/week @ 2024-06-01 12/week @ 2024-06-08 381/week @ 2024-06-15 29/week @ 2024-06-22 267/week @ 2024-06-29 165/week @ 2024-07-06 8/week @ 2024-07-13 128/week @ 2024-07-20 124/week @ 2024-07-27 100/week @ 2024-08-03 194/week @ 2024-08-10 455/week @ 2024-08-17

每月下载量 885

MIT/Apache

9MB
94K SLoC

Erg 编程语言


这是 Erg 的主要源代码仓库。它包含编译器和文档。

Build status Build status Discord

日语 | 简体中文 | 繁体中文

  • 想要 Rust 类型的健壮性和舒适的编译器支持,但又不需要 Rust 中冗长的类型说明和内存管理模型。
  • 对 Python 感到沮丧,但又不能丢弃 Python 代码资产。
  • 想要像 ML 一样简单、一致的语言。
  • 想要具有依赖/精化类型的实用通用语言。
  • 想要像 Scala 一样既能面向对象也能函数式使用的语言。

特性

一些特性尚未实现。请参阅 TODO.md 以获取实现状态。

  1. 健壮性

    Erg 具有智能且强大的类型系统。例如,Erg 可以在编译时进行空值检查(Option 类型)、除零和数组越界地址。

    rand = pyimport "random"
    
    l = [1, 2, 3]
    assert l in [Nat; 3] # type checking
    assert l in [1..3; 3] # more detailed
    l2 = l.push(rand.choice! 0..10)
    assert l2 in [0..10; 4]
    assert l2 + [3, 5, 7] in [0..10; 7]
    # This causes an IndexError, Erg can detect it at compile time
    l2[10] # IndexError: `l2` has 7 elements but was accessed the 11th element
    
    2.times! do!:
        print! "hello, ", end := ""
    # => hello, hello,
    -2.times! do!:
        print! "hello, ", end := ""
    # TypeError: `.times!` is a method of `Nat` (0 or more Int), not `Int`
    
    {Meter; Sec; meter; yard; sec} = import "unit"
    
    velocity x: Meter, t: Sec = x / t
    
    v = velocity 3yard, 2sec # TypeError: the type of `x` was mismatched: expect `Meter`, found `Yard`
    v = velocity 3meter, 2sec # v == 1.5 m/s
    
  2. 简洁性

    Erg 由一个非常简单的语法组成,与其它语言相比,可以显著减少代码量。然而,其功能并不逊色。

    由于类型推断系统强大,您可以用类似动态类型语言的方式进行编码。

    fib 0 = 0
    fib 1 = 1
    fib n = fib(n - 1) + fib(n - 2)
    assert fib(10) == 55
    

    即使是 for 和 while 表达式也只是子例程之一,因此这是可能的。

    loop! block! = while! do! True, block!
    
    # equals to `while! do(True), do! print! "hello"`
    loop! do!:
        print! "hello"
    
  3. 函数式与面向对象

    Erg 是一种纯面向对象的语言。一切都是对象;类型、函数和运算符都是对象。另一方面,Erg 也是一种函数式语言。Erg 要求在可能产生副作用或更改内部状态代码上放置某些标记,这可以定位代码的复杂性。这将大大提高代码的可维护性。

    # Functional style (immutable), same as `sorted(list)` in Python
    immut_arr = [1, 3, 2]
    assert immut_arr.sort() == [1, 2, 3]
    # Object-oriented style (mutable)
    mut_arr = ![1, 3, 2]
    mut_arr.sort!()
    assert mut_arr == [1, 2, 3]
    i = !1
    i.update! old -> old + 1
    assert i == 2
    
    # Functions cannot cause side effects
    inc i: Int! =
        i.update! old -> old + 1
    # SyntaxError: cannot call a procedural method in a function
    # hint: only methods of mutable types can change the state of objects
    
    # Code that uses a lot of side effects is redundant, so you will naturally write pure code
    Counter! = Inherit Int!
    Counter!.
        new i: Int = Counter! !i
        inc! ref! self =
            self.update! old -> old + 1
    
    c = Counter!.new 1
    c.inc!()
    assert c == 2
    
  4. 互操作性

    Erg 与 Python 内部兼容,并且可以免费导入 Python API。

    # using built-in Python modules
    math, time = pyimport "math", "time"
    {sin; pi} = math
    # using an external Python module
    tqdm = pyimport "tqdm"
    
    print! sin pi # 1.2246467991473532e-16
    for! tqdm.tqdm(0..99), i =>
        time.sleep! 0.01 * i
    
  5. 可读性强的错误消息

    Erg 强调错误消息的可读性; Erg 是一种面向程序员的友好语言,与 C++ 不同。

    proc! x =
        l = [1, 2, 3]
        l.push!(x)
        l
    
    Error[#12]: File example.er, line 3, in <module>::proc!
    2│     l = [1, 2, 3]
    3│     l.push!(x)
             ^^^^^
    AttributeError: List object has no attribute `.push!`
    hint: to update the internal state of an object, make it mutable by using `!` operator
    hint: `List` has `push`, see https://erg-lang.github.io/docs/prelude/List/##push for more information
    hint: `List!` has `push!`, see https://erg-lang.github.io/docs/prelude/List!/##push! for more information
    

要求

需要一个 Python3 (3.7~3.11) 解释器。如果它已经安装在本机上,则无需设置。

安装

通过 cargo(Rust 软件包管理器)安装

cargo install erg

从源码构建

从源码构建需要 Rust 工具链。

git clone https://github.com/erg-lang/erg.git
cd erg
cargo build --release

通过 Nix 构建

如果你已经安装了 Nix,则以下命令将在项目目录下生成二进制文件到 result/bin/erg

git clone https://github.com/erg-lang/erg.git
cd erg
nix-build

如果你已经启用了 Nix Flakes

git clone https://github.com/erg-lang/erg.git
cd erg
nix build

标志

通过启用 --features 标志,你可以自定义安装和构建。

  • 你可以使用 --features {language} 来更改错误消息的语言
--features japanese
--features simplified_chinese
--features traditional_chinese

还将添加更多语言(我们正在寻找翻译者。请加入 翻译项目)。

其他标志

  • 安装和构建 ELS(Erg 语言服务器)
    • --features els
  • 调试模式(供贡献者使用)
    • --featuresdebug
  • 丰富的 REPL 体验(光标移动、粘贴、历史记录等。)
    • --features full-repl
  • 使显示看起来更好
    • --features unicode--features pretty
  • 启用所有功能(不包括开发者的功能)
    • --features full
  • 有关更多标志的信息,请参阅 此处

贡献

贡献总是受欢迎!要开始贡献,请参阅 CONTRIBUTING.md

如果您有任何问题,请随时在 Discord 频道 上提问。

许可证

所有 assetsdoc 文件夹中的文件均采用 CC-BY-4.0 许可。本存储库中其余文件采用 Apache License 2.0 + MIT License 许可。

有关第三方 crate 的信用信息,请参阅 THIRD_PARTY_CREDITS.md

依赖关系

~2–11MB
~118K SLoC