Skip to content

Latest commit

History

1,137 Commits

Folders and files

NameName
Last commit message
Last commit date

The Erg Programming Language


This is the main source code repository for Erg. This contains the compiler and documentation.

Build statusBuild status
English | 日本語 | 简体中文 | 繁體中文

Erg can be recommended to a person that:

  • wants Rust-like robustness and comfortable compiler support, and yet, doesn't need the verbose type specifications & memory management model like Rust.
  • frustrated with Python, but can't throw away Python code assets.
  • wants a simple and consistent language like ML.
  • wants a practical general-purpose language with dependent/refinement types.
  • wants a language like Scala that can be used both object-oriented and functional.

Features

Some features are not yet implemented. Please see TODO.md for implementation status.

  1. Robustness

    Erg has a smart & powerful type system. For example, Erg can do null checking (Option type), division by zero, and out-of-range addresses in arrays at compile time.

    rand=pyimport"random"l= [1, 2, 3]
    assertlin [Nat; 3] # type checkingassertlin [1..3; 3] # more detailedl2=l.push(rand.choice! 0..10)
    assertl2in [0..10; 4]
    assertl2+ [3, 5, 7] in [0..10; 7]
    # This causes an IndexError, Erg can detect it at compile timel2[10] # IndexError: `l2` has 7 elements but was accessed the 11th element2.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"velocityx: Meter, t: Sec=x/tv=velocity3yard, 2sec# TypeError: the type of `x` was mismatched: expect `Meter`, found `Yard`v=velocity3meter, 2sec# v == 1.5 m/s
  2. Simplicity

    Erg consists of a very simple syntax, which can significantly reduce the amount of code compared to other languages. However, its functionality is not inferior to them.

    Since the type inference system is powerful, you can code like a dynamically typed language.

    fib0=0fib1=1fibn=fib(n-1) +fib(n-2)
    assertfib(10) ==55

    In Erg, there are very few things that are treated as special; there are no reserved words. even for and while expressions are just one of the subroutines, so this is possible.

    loop! block=while! True, block# equals to `while! True, do! print! "hello"`loop! do!:
    print! "hello"
  3. Functional & Object-oriented

    Erg is a pure object-oriented language. Everything is an object; types, functions, and operators are all objects. On the other hand, Erg is also a functional language. Erg requires some kinds of markers to be placed on code that causes side effects or changes internal state, which can localize the complexity of code. This will greatly improve the maintainability of your code.

    # Functional style (immutable), same as `sorted(list)` in Pythonimmut_arr= [1, 3, 2]
    assertimmut_arr.sort() == [1, 2, 3]
    # Object-oriented style (mutable)mut_arr= ![1, 3, 2]
    mut_arr.sort!()
    assertmut_arr== [1, 2, 3]
    i= !1i.update! old->old+1asserti==2# Functions cannot cause side effectsinci: 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 codeCounter! =InheritInt!
    Counter!.
    newi: Int=Self!::__new__ !i
    inc! ref! self=self.update! old->old+1c=Counter!.new1c.inc!()
    assertc==2
  4. Interoperability

    Erg is internally compatible with Python and can import the Python API at zero cost.

    # using built-in Python modulesmath, time=pyimport"math", "time"
    {sin; pi; ...} =math# using an external Python moduleTqdm! =pyimport("tqdm").'tqdm'print! sinpi# 1.2246467991473532e-16for! Tqdm!.'__call__'(0..99), i=>time.sleep! 0.01*i
  5. Readable Error Messages

    Erg emphasizes the readability of error messages; Erg is a programmer-friendly language, unlike 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: Array object has no attribute `.push!`hint: to update the internal state of an object, make it mutable by using `!` operatorhint: `Array` has `push`, see https://erg-lang.github.io/docs/prelude/Array/##push for more informationhint: `Array!` has `push!`, see https://erg-lang.github.io/docs/prelude/Array!/##push! for more information

Requirements

A Python3 interpreter is required. If it is already installed on your machine, no setup is required.

Installation

Installing by cargo (Rust package manager)

cargo install erg

By enabling the --features flag, you can change the language in which error messages are displayed.

  • Japanese
cargo install erg --features japanese
  • Chinese (Simplified)
cargo install erg --features simplified_chinese
  • Chinese (Traditional)
cargo install erg --features traditional_chinese

And more languages will be added (we are looking for translators. Please join the Translation Project).

  • Debugging mode (for contributors)
cargo install erg --features debug

Building from source

Building from source code requires the Rust toolchain.

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

Building by Nix

If you've been installed Nix, the following command will be generate binary into result/bin/erg under the project.

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

If you've been enabled Nix Flakes.

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

Contribution

Contributions are always welcome! To get started with contributions, please look CONTRIBUTING.md.

If you have any questions, please feel free to ask them on the Discord channel.

License

All files in the assets and doc folders are licensed with CC-BY-4.0. The rest of the files in this repository are licensed with Apache License 2.0 + MIT License.

For credits about third party crates, see THIRD_PARTY_CREDITS.md.

About

A Python-compatible statically typed language

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages