Skip to main content

The NumFu programming language

Project description

Logo

NumFu Programming Language

NumFu is a functional programming language designed for readable & expressive code, extensibility, and mathematical computing with arbitrary precision arithmetic.

NumFu's simple syntax and semantics make it well-suited for educational applications, such as courses in functional programming and general programming introductions. At the same time, as its name suggests, NumFu is also ideal for exploring mathematical ideas and sketching algorithms, thanks to its native support for arbitrary-precision arithmetic.

Features

  • Arbitrary Precision Arithmetic - Reliable mathematical computing powered by Python's mpmath
  • First-Class Functions - Automatic currying, partial application, and function composition
  • Expressive Syntax - Infix operators, spread/rest operators, and lots of syntactic sugar
  • Tail Call Optimization for efficient recursive algorithms without stack overflow
  • Interactive Development - Friendly REPL and helpful error messages
  • Minimal Complexity - Only four core types: Number, Boolean, List, and String
  • Python Integration - Large & reliable standard library through NumFu's Python runtime
  • Extensible - NumFu is written entirely in Python with the goal of being extensible and easy to understand.

Quick Start

Installation

From PyPI

pip install numfu-lang

From Source

git clone https://github.com/dr-lego/numfu
cd numfu
make install

Hello NumFu!

Create hello.nfu:

// Mathematical computing with arbitrary precision
let golden = {depth ->
  let recur =
    {d -> if d <= 0 then 1 else 1 + 1 / recur(d - 1)}
  in recur(depth)
} in golden(10) // โ‰ˆ 1.618

// Function composition & piping
let add1 = {x -> x + 1},
    double = {x -> x * 2}
in 5 |> (add1 >> double) // 12

// Partial Application
{a, b, c -> a+b+c}(_, 5, _)
// {a,c -> a+5+c}

// Assertions
sqrt(49) ---> $ == 7

// Built-in testing with assertions
let square = {x -> x * x} in
  square(7) ---> $ == 49  // โœ“ passes

Run it:

numfu hello.nfu

Interactive REPL

numfu repl
NumFu REPL. Type 'exit' or press Ctrl+D to exit.
>>> 2 + 3 * 4
14
>>> let square = {x -> x * x} in square(7)
49
>>> [1, 2, 3, 4, 5, 6, 7] |> filter(_, {x -> x%2 == 0}) |> max
6

๐Ÿ“– Documentation

[!NOTE] As a language interpreted in Python, which is itself an interpreted language, NumFu is not especially fast. Therefore, it is not recommended for performance-critical applications or large-scale projects. However, NumFu has not yet been thoroughly optimized so you can expect some performance improvements in the future.

๐Ÿ› ๏ธ Development

Prerequisites

  • Python โ‰ฅ 3.10

Setup Development Environment

git clone https://github.com/dr-lego/numfu
cd numfu

make build

NumFu contains built-ins written in NumFu itself (src/numfu/stdlib/builtins.nfu). make build first installs NumFu without the built-ins, then parses and serializes the file, and finally performs a full editable install. The script also builds NumFu and creates wheels.

Building Documentation

cd docusaurus && npm i && cd .. # make sure to install dependencies

make serve  # local preview
make docs   # build to 'docs-build'

Project Structure

numfu/
โ”œโ”€โ”€ src/numfu/
โ”‚   โ”œโ”€โ”€ __init__.py         # Package exports
โ”‚   โ”œโ”€โ”€ _version.py         # Version & metadata
โ”‚   โ”œโ”€โ”€ classes.py          # Basic dataclasses
โ”‚   โ”œโ”€โ”€ parser.py           # Lark-based parser & AST generator
โ”‚   โ”œโ”€โ”€ interpreter.py      # Complete Interpreter
โ”‚   โ”œโ”€โ”€ modules.py          # Import/export & module resolving
โ”‚   โ”œโ”€โ”€ ast_types.py        # AST node definitions
โ”‚   โ”œโ”€โ”€ builtins.py         # Built-in functions
โ”‚   โ”œโ”€โ”€ cli.py              # Command-line interface
โ”‚   โ”œโ”€โ”€ repl.py             # Interactive REPL
โ”‚   โ”œโ”€โ”€ errors.py           # Error handling & display
โ”‚   โ”œโ”€โ”€ typechecks.py       # Built-in type system
โ”‚   โ”œโ”€โ”€ reconstruct.py      # Code reconstruction for printing
โ”‚   โ”œโ”€โ”€ grammar/            # Lark grammar files
โ”‚   โ””โ”€โ”€ stdlib/             # Standard library modules
โ”œโ”€โ”€ docs/                   # Language documentation
โ”‚   โ”œโ”€โ”€ guide/              # User guides
โ”‚   โ””โ”€โ”€ reference/          # Reference
โ”œโ”€โ”€ docusaurus/             # Docusaurus website
โ”œโ”€โ”€ tests/                  # Test files
โ”œโ”€โ”€ scripts/                # Build and utility scripts
โ””โ”€โ”€ pyproject.toml          # Configuration

Testing

NumFu is tested with over 300 tests covering core features, edge cases, and real-world examples โ€” including most snippets from the documentation. Tests are grouped by category and include handwritten cases as well as tests generated by LLMs (mostly Claude Sonnet 4).

Every test is self-validating using assertions and fails with an error if the output isnโ€™t exactly as expected.

To run all tests from the tests folder:

make test

Contributing

Found a bug or have an idea? Open an issue.

Want to contribute code?

  • Check existing issues and TODO.md for open tasks.
  • Run all tests before committing.
  • Pull requests are welcome!

License

This project is licensed under Apache License 2.0 - see the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

numfu_lang-0.1.tar.gz (37.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

numfu_lang-0.1-py3-none-any.whl (39.8 kB view details)

Uploaded Python 3

File details

Details for the file numfu_lang-0.1.tar.gz.

File metadata

  • Download URL: numfu_lang-0.1.tar.gz
  • Upload date:
  • Size: 37.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for numfu_lang-0.1.tar.gz
Algorithm Hash digest
SHA256 20b33b71257bcddc9d1755fd59c80bbb852e02193b428987c43bfa54caee2526
MD5 f54bb57e8b31a65403accabdbe524049
BLAKE2b-256 4c62eba670ef7378c5a905d0f240cc09ca6965ac32fe67193673b54e1a033f4b

See more details on using hashes here.

File details

Details for the file numfu_lang-0.1-py3-none-any.whl.

File metadata

  • Download URL: numfu_lang-0.1-py3-none-any.whl
  • Upload date:
  • Size: 39.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for numfu_lang-0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e9fb3a3658a02d8d5d303a56e92f35b21200e808ea893cbe0f1e9737d312c4a4
MD5 cbdcefa006dd02e33189ce03c06cb6c2
BLAKE2b-256 444d111b95cad1ff86dab340a014f963250d02bbe9817b76df10af219fcdf874

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page