Fun
Fun is an esoteric dialect of JavaScript, which uses only function calls.
To be more specific, a Fun program is a function call, where a function call is an identifier, followed by an open parenthesis, followed by zero or more function calls separated by commas, followed by a closing parenthesis.
Fun itself does not have an interpreter, we use the host language (JavaScript) to interpret Fun code. There is a standard library, where the functions are defined. There may also be a parser/validator which checks syntax.
Standard Library
Note that standard Fun functions, with the exception of RUN, do not immediately perform the operation described below, rather they return a function which performs that operation.
Name | Parameters | Description |
---|---|---|
RUN | program | runs program |
D0..D9 | - | primitive values 0..9 |
A..E | (value) or none | if no parameters, then return the a global variable associated with the letter, if one parameter then set the variable to that value |
NUM | (d1, d2 .. dN) | evaluate parameters, then concatenate them and return the result as a decimal number, for example NUM(D1(), D(0)) returns 10. |
value | evaluates value and prints it. | |
SEQUENCE | step1, step2 ... stepN | evaluates each parameter in turn, returning the value of the last one. |
READ | index | evaluates index, and returns the value of the global variable at that index. |
WRITE | index, value | evaluates index, and sets the value of the global variable at that index to value |
READ_PARAM | index | evaluates index, and returns the function parameter at that index. |
READ_LOCAL | index | like READ, except it returns a local variable at that index. |
WRITE_LOCAL | index, value | like WRITE except that it sets a local variable. |
IF | condition, action1, action2 | if condition evaluates to true, then evaluate action1, otherwise evaluate action2 |
WHILE | condition, action | while condition evaluates to true, evaluate action |
NOT | x | evaluates x, and returns NOT x |
EQ | a, b | evaluates a and b and returns true if they are equal |
LT | a, b | evaluates a and b and returns true if a < b |
GT | a, b | evaluates a and b and returns true if a > b |
ADD | a, b | evaluates a and b and returns a + b |
MULTIPLY | a, b | evaluates a and b and returns a * b |
SUBTRACT | a, b | evaluates a and b and returns a - b |
MOD | a, b | evaluates a and b and returns a % b |
FUNCTION | fn | returns fn unevaluated |
CALL | fn, arg1, arg2 ... argN | evaluates fn, and the provided arguments, binds the arguments to the function and calls it. |
Example Programs
Print 5
RUN( PRINT( D5() ) )
Print factorial 5
RUN( SEQUENCE( A( FUNCTION( IF( EQ(READ_PARAM(D0()), D1()), D1(), MULTIPLY( READ_PARAM(D0()), CALL( A(), SUBTRACT( READ_PARAM(D0()), D1() ) ) ) ) )), PRINT( CALL(A(), D5()) ) ) )
Print primes from 1 through 100
RUN( SEQUENCE( D( FUNCTION( SEQUENCE( A( D1() ), B( D2() ), WHILE( NOT(GT( B(), SUBTRACT( READ_PARAM(D0()), D1() ) ) ), SEQUENCE( IF( EQ(MOD(READ_PARAM(D0()), B()), D0()), A( D0() ) ), B( ADD( B(), D1() ) ) ) ), A() ) )), C( D2() ), WHILE(LT(C(), NUM(D1(), D0(), D0())), SEQUENCE( IF( EQ( CALL(D(), C()), D1() ), PRINT(C()) ), C( ADD(C(), D1())) ) ) ) )
Implementation Guidelines
As indicated above, an implementation of fun is a library containing the standard functions. Fun functions should not call eval, or transpile Fun code into JavaScript code.
Turing-completeness
Fun is Turing-complete, as brainfuck with no I/O can be translated into it as follows. A
is used for the cell pointer and the numbered global variables are used for the cell values.
Brainfuck | Fun |
---|---|
Header | RUN(SEQUENCE(D(0),
|
+ |
WRITE(A(),ADD(READ(A()),D1())),
|
- |
WRITE(A(),SUBTRACT(READ(A()),D1())),
|
< |
A(SUBTRACT(A(),D1())),
|
> |
A(ADD(A(),D1())),
|
[ |
WHILE(READ(A()),SEQUENCE(
|
] |
))
|
Footer | ))
|