The Hamler Programming Language
Hamler - Haskell-style functional programming language running on Erlang VM.
Hamler is a strongly-typed language with compile-time type-checking and built-in support for concurrency and distribution.
Hamler empowers industries to build the next generation of scalable, reliable, real-time applications, especially for 5G, IoT, and edge computing.
Why Hamler?
For almost a decade, we have been developing software systems based on Erlang/OTP, especially our main product EMQ X - the scalable open-source MQTT broker. So, we have always believed that Erlang is a masterpiece of engineering. With amazing concurrency, distribution, and fault tolerance, it is one of the few general-purpose language platforms able to properly handle concurrency and soft realtime.
However, from all the experience writing Erlang, we believe that the following features can help Erlang programmers better adapt to the coming wave of 5G, IoT, and edge-programming and attract more people to using BEAM.
- Compile-time type checking and type reference
- ADTs, Function Composition, Type Classes
- More friendly syntax for prosperous communities
- Functor, Applicative, and Monad...:)
Now all the features are available in the Hamler programming language.
Features
- Functional programming
- Haskell and ML style
- Compile-time type Checking/Inference
- Algebraic data type (ADT)
- Functions, higher-order functions
- Currying and partial application
- Pattern matching, and Guards
- List comprehension
- Applicative and Monad
- Advanced module system
- Built-in concurrency
Design
The Hamler compiler architecture is shown as below:
The Hamler 0.1 compiler was forked from PureScript 0.13.6. The Hamler source code is parsed to generate CST, then CoreErlang's IR is generated after CST -> AST -> CoreFn's syntax tree transformation, syntax analysis and type checking. The code is then used by the Erlang compiler to generate the final Beam bytecode.
Installation
Get the installation package through Github Release
packages for windows will be coming soon...
Linux
$ tar zxvf hamler-$version.tgz -C /usr/lib/
$ ln -s /usr/lib/hamler/bin/hamler /usr/bin/hamler
Centos 7
$ rpm -ivh hamler-$version-1.el7.x86_64.rpm
Debian 8 / Debian 9 / Debian 10 / Ubuntu 16.04 / Ubuntu 18.04 / Ubuntu 20.04
$ dpkg -i hamler_$version_amd64.deb
Homebrew(macOS)
$ brew tap hamler-lang/hamler
$ brew install hamler
Project Layout
โโโ .github/workflows # ci
โโโ app # hamler commands, such as `compile`, `repl`, ...
โโโ deploy
โโโ doc # link to hamler documents
โโโ lib # hamler standard libraries
โฃ โโโ Control # common control structures, concurrent Process, and OTP behaviours.
โฃ โโโ Data # commonly used data structures and functions
โฃ โโโ Database # common databases in erlang, such as ETS, DETS, and Mnesia
โฃ โโโ Foreign
โฃ โโโ Network # hamler network libraries.
โฃ โโโ System # system libraries including IO, VM, OS, Env, File, Random, Timer, and Logger.
โฃ โโโ Test # hamler QuickCheck test framework
โฃ โโโ Foreign.hm # hamler FFI functions
โฃ โโโ Prelude.hm # functions exported by default
โโโ repl
โฃ โโโ replsrv # hamler REPL server
โโโ src/Language # hamler compiler source
โฃ โโโ Hamler
โฃ โฃ โโโ CodeGen.hs # convert CoreFn to CoreErlang
โฃ โฃ โโโ Make
โฃ โฃ โโโ Make.hs
โฃ โฃ โโโ Util.hs
โฃ โโโ Hamler.hs
โโโ tests
โฃ โโโ Test # test cases for hamler libraries
โฃ โฃ โโโ Control
โฃ โฃ โโโ Data
โฃ โฃ โโโ Database
โฃ โฃ โโโ Network
โฃ โฃ โโโ System
โฃ โโโ Test.hm # entrance to execute test cases
โฃ โโโ Main.hs
โโโ .gitignore
โโโ LICENSE
โโโ Makefile
โโโ README.md
โโโ Setup.hs
โโโ hamler.cabal
โโโ package.yaml
โโโ stack.yaml
Build from source code
Required
- Erlang/OTP >= 23
- Cabal
Building
-
Clone hamler from the git repo
$ git clone https://github.com/hamler-lang/hamler.git $ cd hamler
-
Configuring
$ export LC_ALL=en_US.UTF-8
-
Building
$ make
-
Testing
$ make test
-
Install hamler
$ sudo make install
Create a project
$ mkdir demo-project
$ cd demo-project
$ hamler init
$ make
$ make run
Try the interpreter
$ hamler repl
> -- List, range and enums
> [1,2,3]
> [1..10]
> ['a'..'z']
> -- erlang style maps
> import Data.Map as Map
> -- New map
> m = #{"foo" => "bar", "bar" => "foo"}
> -- Match Map
> #{"foo" := a, "bar" := b} = m
> -- get, put
> Map.get "foo" m -- a = "bar"
> Map.get "bar" m -- b = "foo"
> m1 = Map.put "key" "val" m
> -- keys, values
> keys = Map.keys m
> values = Map.values m
Documentation
Community, discussion, and supports
You can reach the Hamler community and core team via the following channels:
Contributing
To contribute to Hamler project:
- Report issues : submit any bugs, issues to hamler/issues
- Contribute code: Reference roadmap as a guidance for new features. Fork the project, and submit feature requests to hamler-lang/hamler
- Submit a proposal: Fork the hamler-wiki project and submit a pull request
Core Team
The Hamler core team comes from EMQ Technologies Co., Ltd. now:
- Feng Lee: Designer of Hamler Language
- Yang M: Implemented Hamler Compiler
- S Hu: Maintainer of the documentations
- Shawn: Contributed rebar3_hamler plugin
- Rory Z: Contributed homebrew install package
- wivwiv: Designer of hamler-lang.org website
- CrazyWisdom: Maintainer of hamler-lang.org
- ysfscream: Maintainer of hamler-lang.org
- juan6666๏ผDesigner of Hamler language logo
License & Credits
We would like to express our great appreciation to the PureScript team and community for all years of efforts making its amazing compiler, especially CoreFn and its incredible adaptability.
The hamler language project is licensed under BSD3, see LICENSE.
About EMQ
EMQ is an open-source software company providing highly-scalable, real-time messaging and streaming platforms for IoT applications in the 5G Era.