Examples#

You can find a lot more examples on Rosetta code or on the dedicated interactive samples page.

Hello world!#

Hello world using lists and IO!

:import std/List .

main ["Hello " ++ 0 ++ "!\n"]
$ printf "world" | bruijn file.bruijn
Hello world!

Syntax#

Example functions demonstrating the syntax without usage of std/.

# this is a comment
# returns ternary 1 (syntactic sugar)
get-one (+1)

# we can use the function in all functions below its definition
get-one2 get-one

# tests are similar to assertions in other languages
# they test equality using α-equivalence of reduced expressions
:test (get-one2) ((+1))

# indenting acts similarly to Haskell's where statement
get-one3 foo
    bar (+1)
    foo bar

# equivalent of λx.x or Haskell's id x = x
id [0]

# testing equivalent of (λx.x) (λx.λy.x) = λx.λy.x
# the numbers in the abstractions refer to arguments using
# De Bruijn indices
:test (id [[1]]) ([[1]])

# prefix function definition
!‣ [[1]]

# use prefix function '!'
# ![0] becomes ([[1]] [0]) which in turn becomes [[0]]
:test (![0]) ([[0]])

# infix function definition: flip and apply arguments
…<>… [[0 1]]

# use infix function '<>'
# [[0]] <> [[1]] becomes (([[0 1]] [[0]]) [[1]])
:test ([[0]] <> [[1]]) ([[1]] [[0]])

# multiple arguments
number-set set-of-three (+1) (+2) (+3)
    set-of-three [[[[0 1 2 3]]]]

access-first [0 [[[0]]]]

:test (access-first number-set) ((+1))

# ignore stdin and return string
main ["Hello world!\n"]

Standard library#

:import std/Combinator .
:import std/List .
:import std/Logic .
:import std/Number .
:import std/Option .
:import std/Pair .

# pairs with some values
love pair me you
    me [[[1]]]
    you [[[2]]]

:test (fst love) ([[[1]]])
:test (snd love) ([[[2]]])

# you can also write (me : you) instead of (pair me you)
# also ^love and ~love instead of (fst love) and (snd love)

# numerical operations
# remember that every mixfix chain is left-associative
five --((+8) + (-4) - (-2))

not-five? [if (0 =? (+5)) false true]

# awesome mixfix functions
:test (∑ (+1) → (+3) | [++0]) ((+9))
:test (∏ (+1) → (+3) | [++0]) ((+24))

:test (not-five? five) (false)

:test ((uncurry mul (pair (+3) (+2))) =? (+6)) (true)

# lazy evaluation using infinite lists and indexing
pow2 …!!… (iterate (…⋅… (+2)) (+1))

:test ((pow2 (+5)) =? (+32)) (true)

# options
:test (map inc (some (+1))) (some (+2))
:test (apply (some (+1)) [some ++0]) (some (+2))

# boolean
# the main function gets executed automatically
# ignore stdin arguments by not referencing 0
main [¬(false ⋀? true ⋁? true)]

:test (main [0]) (false)

More examples#

You can find more example programs in samples/ of our source-code repository. The samples include several solutions to Advent of Code problems.

Reading the source of the standard library can also be helpful.