Birb
| Paradigm(s) | functional |
|---|---|
| Designed by | User:Melvin, User:SCKelemen |
| Appeared in | 2021 |
| Type system | untyped |
| Memory system | stack-based |
| Computational class | Turing complete |
| Reference implementation | [1] |
| Influenced by | Combinatory Logic, Lambda Calculus, Gabriel Lebec, Samuel Kelemen |
| File extension(s) | .birb, .bird, |
Birb is an untyped, purely functional language based on Lambda Calculus and Combinatory Logic.
Language overview
The birb language is entirely comprised of bird emojis.
Symbols
| Symbol | Name | Lambda Calculus | Combinator |
|---|---|---|---|
| π¦ | owl | \ab.b(ab) | owl |
| π¦ | eagle | \abcde.ab(cde) | eagle |
| πͺ½ | wing | \abcd.a(bd)(cd) | phoenix |
| ποΈ | dove | \abcd.ab(cd) | dove |
| π¦ | parrot | \a.aa | mockingbird |
| π¦ | duck | \abc.c(ba) | quacky |
| π€ | touring chick | \ab.b(aab) | turing |
| π₯ | kool chick | \ab.a | kestrel |
| π£ | hatching chick | \abc.c(ab) | quirky |
| π¦ | simple bird | \a.a | identity |
| π¦ | peacock | \abc.b(ac) | queer |
| 𦀠| dodo | \ab.a(bb)\ab.a(bb) | sage |
| π§ | penguin | \abc.a(bc) | blackbird |
| π¦’ | swan | \abc.ac(bc) | substitution |
| 𦩠| flamingo | \abc.acb | cardinal |
Syntax
[birb]+: Birb- everything else: Comment
Syntax errors are impossible as long as you use at least one birb.
Semantics
Birbs stagger as they walk: they are reduced in alternating associative order, starting with left associativity at birb index βlen/2β:
π¦π¦ -> (π¦π¦) π¦π¦π¦ -> ((π¦π¦)π¦) π¦π¦π¦π¦ -> (π¦((π¦π¦)π¦)) π¦π¦π¦π¦π¦ -> ((π¦((π¦π¦)π¦))π¦) π¦π¦π¦π¦π¦π¦ -> (π¦((π¦((π¦π¦)π¦))π¦)) π¦π¦π¦π¦π¦π¦π¦ -> ((π¦((π¦((π¦π¦)π¦))π¦))π¦) ...
Examples
You can find more examples (with comments) in the samples/ directory.
Relationships
- πͺ½π¦ -> π¦’
- π¦’π¦ -> π¦
- π¦π¦ -> π¦
- ποΈπ¦ -> π§
- π§π§ -> ποΈ
- π¦©π§ -> π¦
- π¦©π¦ -> π§
- π¦©π¦ -> π£
One can only imagine what happens if two parrots talk to each other: π¦π¦ -> π₯. The same happens with π€π€; they just canβt stop waddling!
Arithmetic
For this example I use the Church numerals. Zero would then be encoded as π₯π¦. The successor function can be written as π¦’π§:
- π¦π§π¦π¦’π§π₯π¦ ->
\\(10)(Church numeral 1) - π¦π§π¦π§ποΈπ¦’π§π¦’π§π₯π¦ ->
\\(1(10))(Church numeral 2)
Similarly, one can translate the Church addition function to πͺ½π§. Now, to calculate 1+2 based on their increments from zero:
- π¦π¦ποΈπ§ποΈπ§π¦π§ποΈπ§ποΈπͺ½π§π¦’π§π¦’π§π₯π¦π¦’π§π₯π¦ ->
\\(1(1(10)))(Church numeral 3)
Also: π§ is a*b, π¦ is n^n and π¦π¦ a^b.
Note that there exist many alternative ways to do arithmetic. Try writing the functions above with other birbs!
Containers
You can create a pair [X,Y] using π¦©π¦©π¦©YX.
Typically, one would now construct a list using repeated application of pairs (Boehm-Berarducci/Church encoding). However, due to the reversed application and alternating associativity, the Mogensen-Scott encoding is more suitable:
List [X_1,X_2,...,X_n]: [π¦©]βΏπ¦©X2X1...XN.
Turing-completeness
Birb is Turing complete, since one can construct any term of the Jot variant of Iota. A Jot term ((X s) k) is equivalent to π¦π¦Xπ¦’π₯. Similarly, (s (k X)) is equivalent to π¦π¦Xπ₯π¦’.
Implementations
As of right now there is one interpreter, written by User:melvin in Haskell: [2]. It also features a BLC to birb transpiler.