oplang: Stack-based esoteric programming language

[ compilers-interpreters, gpl, language, program ] [ Propose Tags ]

Please see the README on GitHub at https://github.com/aionescu/oplang#readme

[Skip to Readme]


Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


Versions [RSS],,,
Change log CHANGELOG.md
Dependencies base (>=4.15 && <5), containers (>=0.6.5 && <0.7), directory (>=1.3.7 && <1.4), filepath (>=1.4.2 && <1.5), megaparsec (>=9.2 && <9.3), mtl (>=2.3 && <2.4), optparse-applicative (>=0.17 && <0.18), process (>=1.6.14 && <1.7), text (>=2 && <2.1), text-builder-linear (>=0.1 && <0.2), transformers (>=0.6 && <0.7) [details]
License GPL-3.0-only
Copyright Copyright (C) 2019-2022 Alex Ionescu
Author Alex Ionescu
Maintainer alxi.2001@gmail.com
Category Compilers/Interpreters, Language
Home page https://github.com/aionescu/oplang#readme
Bug tracker https://github.com/aionescu/oplang/issues
Source repo head: git clone https://github.com/aionescu/oplang
Uploaded by aionescu at 2022-08-12T22:46:36Z
Distributions NixOS:
Executables oplang
Downloads 202 total (10 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs not available [build log]
All reported builds failed as of 2022-08-13 [all 2 reports]

Readme for oplang-

[back to package description]



OpLang is a stack-based esoteric programming language based on Brainfuck.


The compiler is available on Hackage, and can be installed via cabal (which can itself be installed via ghcup).

cabal install oplang


To compile an OpLang file with default options, use:

oplang code.op

For a list of available command-line options, use oplang --help.

Building from source


  • GHC >=9.0
  • cabal >=3.0

(Both can be installed via ghcup)

cabal build
cabal run . -- <args>

Language Features

OpLang is a strict superset of Brainfuck.

Its main improvement is the addition of user-defined operators, which are analogous to user-defined functions in languages like C or Python.

The "memory tape" in OpLang is specific to each operator invocation (akin to the stack space allocated for functions in C), and there is a separate "stack" which persists across operator invocations.

Each cell in the tape(s) and stack is 1 byte, and overflow/underflow is allowed.

The default size of the stack is 4KB, and the default size for each memory tape is 64KB. These can be modified via the command-line.


OpLang has 10 "intrinsic" operators, 8 of which are the Brainfuck operators, with the same semantics:

  • +: Increment the current cell
  • -: Decrement the current cell
  • <: Move the current cell pointer to the left
  • >: Move the current cell pointer to the right
  • ,: Read a character from stdin and store its ASCII value in the current cell
  • .: Interpret the current cell as an ASCII character and print it to stdout
  • [: Begin a loop (i.e. if the value at the current cell is zero, jump to the next ])
  • ]: End a loop (i.e. if the value at the current cell is non-zero, jump to the previous [)

And 2 of them are new operators that modify the stack:

  • ;: Pop a value from the stack and store it into the current cell
  • :: Push the value of the current cell onto the stack

An OpLang program consists of a series of custom operator definitions, followed by the "toplevel" (similar to a main() function in other languages).

An operator definition consists of the operator's name, followed by the operator's body, enclosed in {/}.

Single-line comments are supported, and are introduced by the # character.

Here's a simple program that reads a character from stdin, adds 3 to it, and prints it back:

a { ; +++ : }
,: a ;.

For more example programs, see the examples folder.


This repository is licensed under the terms of the GNU General Public License v3.

For more details, see the license file.