Nabd
Description
A simple, functional esoteric programming language
The name is an acronym standing for "Not A B.f. Derivative."
Click here to go to the compiler's GitHub repo
Possibly going to be used as a basis for a functional graphical programming language.
Modules
Code is organized into modules and the module file directories can be passed into the compiler with -I<folder name> like headers are included into gcc.
Modules can either be nabd code or C++ headers with a corresponding object file (determined by file extension).
For reference, look at the standard library implementation as that is a C++ library
Instructions
I've placed spaces, but they're not required
| Instruction | Description |
|---|---|
| $ _ $ | Reads code from the module within dollar signs. If a module contains $, an escape sequence (\$) can be used |
| _ = _ > _ . | Define a function with name (first _) and parameter (second _) returning an expression (last _). Polymorphism is allowed. |
| _ ( _ ) | Call function (first _) with parameter (second _) |
| [ _ , _ , _ , ... ] | Expression denoting a list with type first _ of comma separated sub expressions |
| '_' | Expression denoting a string, just like in other programming languages |
| 0d_# | Expression denoting a decimal number. |
| 0x_# | Enter a number as hex |
| { _ , _ } | Expression denoting a tuple |
| ! _ ? _ : _ | If an expression converted to a number is > 0, then expression is first, otherwise second |
Types:
- String - a character string
- Number - a decimal number
- Tuple - two objects of different types packed together
- List - a collection of objects of the same types
Note: all types can be converted to each other and will not error out. For instance, if a string is implicitly cast as a number, or the cast fails to convert it properly to a number, the first character will be converted to its ascii representation
Code is organized into functions, and the first function called is main, which takes a list of strings as an argument
Examples
Hello World:
$std$main=args>print('Hello, world!\n').
Truth Machine:
$std$i1InfI0Stop=!loop>loop?i1InfI0Stop(print(1)):print(0d0#).main=args>i1InfI0Stop(parseNum(input(0d0#))).
Or, more cleanly:
$std$
i1InfI0Stop = loop >
! loop ? i1Inf0Stop(print(0d1#)) : print(0d0#).
main = args >
i1InfI0Stop(
parseNuminput(0d0#))).
Guess The Number:
$std$
startGame = randNum > [
print('Guess a number btwn 0 and 10: '),
guessFor({ randNum, 0d2# }),
print('The answer was '),
print(randNum),
print('\nEnter \'1\' to play again or \'0\' to quit: '),
! parseNum(input(0d0#)) ?
startGame(round(random({ 0d0#, 0d10# }))) :
0d0# ].
guessFor = numAndAttempts > [
print('Guess (integer): '),
checkGuess({ parseNum(input(0d0#)), numAndAttempts }) ].
checkGuess = inputAndTupNumAtt >
! eq({
fst(inputAndTupNumAtt),
fst(snd(inputAndTupNumAtt))
}) ?
print('You won!\n') :
! snd(snd(inputAndTupNumAtt)) ?
! gt({
fst(inputAndTupNumAtt),
fst(snd(inputAndTupNumAtt))
}) ? [
print('Too high!\n'),
guessFor({
fst(snd(inputAndTupNumAtt)),
dec(snd(snd(inputAndTupNumAtt)))
}) ] : [
print('Too low!\n'),
guessFor({
fst(snd(inputAndTupNumAtt)),
dec(snd(snd(inputAndTupNumAtt)))
}) ] :
print('You lose!\n').
main = args >
snd({[
seedRandom(0x0#),
print('Welcome to Guess the Number!\n'),
startGame(round(random({ 0d0#, 0d10# }))) ], 0d0# }).
Standard Library Functions
These are built-in functionality to add a lot to the language. It will be increased overtime.
| Function | Description | Is Implemented? |
|---|---|---|
| prints the value passed in to stdout and returns the string printed to console | Yes | |
| input | read a string from stdin. Does nothing with parameter | Yes |
| len | returns the length of what's passed in. For tuples it's always 2, for numbers it's 1, and for lists and strings it's the actual length | Yes |
| swap | takes the first item of the list parameter and interprets it as a number and returns a copy of the second item with its first-parameter-th index replaced by the third element. If the index is outside the second parameter, then it simply returns the original parameter. | Yes |
| parseNum | don't just cast to a number, but try to actually parse a number out | Yes |
| gt | takes two inputs via a tuple, compares them, and returns 1 if param 1 > param 2 or -1 otherwise | Yes |
| ls | same as greater but with < | Yes |
| eq | same as greater but with = | Yes |
| gte | same as greater but with >= | Yes |
| lse | same as greater but with <= | Yes |
| ne | same as greater but with != | Yes |
| seedRandom | takes a dummy parameter and seeds a random given the current time. Returns 0 | Yes |
| random | given a tuple with range min to max, return a random number | Yes |
| dup | duplicates an item and creates a tuple of the two | Yes |
| round | returns input rounded to the nearest int | Yes |
| floor | returns input rounded down | Yes |
| ceil | returns input rounded up | Yes |
| fst | get first item of tuple | Yes |
| snd | get second item of tuple | Yes |
| elem | get first element of tuple and then get the item of the second tuple item | Yes |
| inc | increment a number | Yes |
| dec | decrement a number | Yes |