# Divzeros

Divzeros program is in a format with function definitions name = expression and a semicolon, the last entry is the main program, without a name and equal sign. The function name can contain uppercase/lowercase letters, period, comma, and numbers, but it cannot start with a number.

The program is in the form of a expression, using these operators (listed from high priority to low priority):

(x) This is a parentheses for grouping expressions. ?x Output the character x and returns x. ? Input a character and return its ASCII number. #x Returns what the return value was of the x-1 iteration of the current subprogram. If x-1 is negative it returns the last return value of the parent subprogram, if x is too large the subprogram quits. # Returns the number of the iteration of the current subprogram. First iteration is number zero. <x Returns left half unmingle of x. >x Returns right half unmingle of x. _x Returns x times negative one. !x Returns bitwise NOT x. @ Returns parameter given to this function. x*y x/y x%y Returns x times/divide/modulo y. If x is zero it will not evaluate y, and if y is zero in division or modulo function, the subprogram quits. The division is integer division rounded toward negative infinity. x+y x-y Returns x plus or minus y. x&y Returns bitwise x AND y. Does not evaluate y if x is zero. x^y Returns bitwise x XOR y. x|y Returns bitwise x OR y. Does not evaluate y if x is negative one. x$y Returns x mingle y (as in INTERCAL). If one of them is negative and one is non-negative, then y will be bitwise NOT before evaluation, to make both the same sign. x~y Returns x select y (as in INTERCAL). If x is zero it will not evaluate y. [x] Executes a subprogram in a loop. Returns the last return value of the subprogram expression before it quit.

Numbers can be integers only, and can be written in decimal, or in hex with ` at front, or as a character ' and the character to get the ASCII value of.

You can make a string by putting quotation marks around it. This string can only be used as a parameter for a function call. The code `fn("abC")` will expand to `(fn('a)+fn('b)+fn('C))`

Functions are invoked by indicating the name of the function followed by the parameter to give to the function.

Comments can be written by putting text between {{ and }}

## Examples

To copy input to output forever:

??

To copy input to output until a null character is received (and output the null character as well):

1/??

To copy input to output until a null character is received (but omit the null character from the output):

(#/?##)*0+?

Hello world program:

(?'H+?'e+?'l+?'l+?'o+?',+?' +?'W+?'o+?'r+?'l+?'d+?'!)/0

To compare if 2 numbers equal:

Equal=1-(1&(@~@)); {{ You can call it like: Equal(x-y) The result will be 0 if not equal, 1 if is equal }}

Check if x is less than y:

Less=1-[(#*#(1-@)/(2-#))*0+#]; {{ You can call it like: Less(x-y) The result will be 0 if x>=y, 1 if x<y }}

Beer program (using UNIX newline):

Amount=99; Print=?@; Equal=1-(1&(@~@)); BottlesOfBeer=Print(" bottles of beer"); OnTheWall=Print(" on the wall")+?10; Current=Amount()-#; PrintNumber=(@/10)*?('0+(@/10))+?('0+(@%10)); NoMore=Equal(Current()-1)*(Print("No more bottles of beer on the wall")/0); Line1=PrintNumber(Current())+BottlesOfBeer()+OnTheWall(); Line2=PrintNumber(Current())+BottlesOfBeer()+?10; Line3=Print("Take 1 down and pass it around")+?10; Line4=NoMore()+PrintNumber(Current()-1)+BottlesOfBeer()+OnTheWall(); Iteration=Line1()+Line2()+Line3()+Line4()+?10; Iteration()