Defunc
Defunc is a function-based, minimalist esoteric programming language currently developed by User:Obvious. The language operates on functions that return integers. These functions can vary in input size. Its name comes from a portmanteau of "define" and "function"
Predefined functions
The language consists of 5 functions, which are as follows:
| Function | Description |
|---|---|
0 |
Returns a 0 |
+a |
Returns a+1 |
?abcd |
If a>b, return c, otherwise return d |
.a |
Writes a to the console, while returning it (Note: Defunc will output the actual integer and does not support ASCII) |
, |
Requests user input in the form of an integer |
Note that ?abcd will evaluate a, b, and only one out of c and d. This also includes writing to the console. ?0.a0b can therefore be used to write a and return b.
Other functions
Apart from the predefined functions, there are other functions as well. In a program you are able to define your own function, within the constraints of the programming language. To define a function, take a character that is not yet defined as a function or variable as the function name, then take any amount of characters that are not defined as a function for the variable names, and then give the function it should return. For example: >ab?abab defines a > function with variables a and b and outputs the greater.
Functions can refer to earlier functions, but also to themselves, to create a loop. You could for example write a sum function as Sabc?bcS+ab+ca, which increments a and the counter variable c, until c reaches b. Then it returns a, which by then had b increments applied to it. Note that this function is capable of subtracting as well as the function would return a+b-c if b is greater than c and would return a otherwise.
Other Syntax
Anything must return exactly one argument. Iaa is valid, as Ia returns a, but Iaaa is not, as it would imply Ia returns aa, which are two arguments and not one. You should use a line break to separate the definitions/calculations.
Not everything has to be a definition. Executing a function has to be done as well.
Turing Completeness
This esoteric programming language has been proven Turing complete by the construction of a turing machine program interpreter within the programming language.
Examples
Hello, world!
4a++++a Ba44444444a LBBB4440 .+4444444.BB440 ..L .+++L .+++44444BB.B0 .+++.+++L .L .BBB40 .+B0
Due to output restrictions this will only output the decimal form of the ASCII codes
Cat
C?0.,0C C
The input is restricted to an integer
Fibonacci sequence
Sabc?bcS+ab+ca Fab?0.a0FbSab0 F0+0
Factorial
Arci?ciA+rc+ir *ab?b0Aa*aA0b+000 !a?a+0*a!A0a+0+0 .!,
Ackermann function
-ab?a+b-a+bb Aab?a0?b0A-a0Aa-b0A-a0+0+b .A,,
Truth-machine
Ta?.a0Ta0 T,
Turing machine
Sabc?bcS+ab+ca
Mabcd?bdMabSac0+dc
Eabcd?bdEabMac00+dc
Dabcd?acDabSbc0+dd
Rab?babRS0abb
Iabcd?adIaDbc00c+dRbc
Aabcd?b0?RCIbad0c++00ASEdbWIbad0c0aEdbIbad00+bDCIbad0c++000dASEdbWIbad0c0aEdbIbad00S0b+0DCIbad0c++000dAMad00+bcd
(a=tape, b=index, c=current state, d=amount of possible states)
Cab [insert your own chain of '?'-statements here, must return direction+2*newstate, with 0=left and 1=right]
Wab [insert your own chain of '?'-statements here, must return the value to be written]
(both use a=value, b=current state)