Do while true
Jump to navigation
Jump to search
Do while true is an esolang made by User:cleverxia, where every line is an expression.
Syntax
There is a stack.
Every line is an expression in postfix notation (1$2$- equals -1) and evaluated from left to right ($72$o$105$o-No prints Hi! and equals -33).
The intepreter first does that line and get the evaluated value, and then runs it until the evaluated value is 0.
Every negative or 0 value is treated as 0, else they're treates as 1.
Notes:
- the syntax sugar $abc$ means the number abc.
#xmeans argument x.- EOF returns -1, and the integers are unbounded.
| Command | Descriprion |
|---|---|
i |
gets input, evaluates to input. |
N |
change the sign of #1 |
o |
output #1 and returns it |
1 |
returns a 1 |
> |
returns 1 if #1>#2 else 0 |
~ |
returns 1, discards #1 |
: |
duplicate and return top of stack |
< |
push #1 onto the stack and returns #1 |
- |
returns #1 - #2 |
! |
returns and discards top of the stack |
r |
returns a random bit |
v |
rotate stack down. returns 0 |
@ |
anything beyond that is a comment |
S |
swaps top two stack elements, returns 0 |
^ |
rotate the stack up, returns a 0 |
= |
pop a list of numbers ending with 0 off-stack. convert them to strings. defines function number #1 to be the converted string as DWT code. returns #1 |
Z |
run function #1. returns #1. |
h |
halt. "returns" 0. |
Examples
Hello, World!
$72$o$101$o$108$o$108$o$111$o$44$o$32$o$87$o$111$o$114$o$108$o$100$o$33$o------------~1-
Truth-machine
i<~1- :o$48$-
Cat program
io
Self intepreter
i<:-^-|1-~ 1=1Z-h- @it's ok without the last "-"
Prime checker
requires integer input.
TBD
Interpreter in node.js
code=`input code here`
input=`input input here`
gi=(i=>{let c=0;return _=>(c>=i.length?-1:i.codePointAt(c++))})(input);stk=[];funcs=[]
function il(code,b,r){
let tst=[];for(i of code)switch(i){
case'h':process.exit();case'o':process.stdout.write(String.fromCodePoint(tst.pop()%1114111));break
case'1':tst.push(1);break;case'-':b=tst.pop();r=tst.pop();tst.push(b-r||0);break
case'>':b=tst.pop();r=tst.pop();tst.push(b>r);break;case'!':tst.push(stk.pop()||0);break
case'~':tst.pop();tst.push(1);break;case'<':stk.push(tst[tst.length-1]||0);break
case':':stk.push(stk[stk.length-1]||0);break;case'N':b=tst.pop();tst.push(-b||0);break
case'i':tst.push(gi``);break;case'S':b=stk.pop();r=stk.pop();stk.push(b||0);stk.push(r||0);tst.push(0);break
case'^':stk.push(stk[0]||0);stk=stk.slice(1);tst.push(0);break;case'r':tst.push(Math.random()<.5?1:0);break
case'v':stk=[stk[stk.length-1]||0].concat(stk);stk.pop();tst.push(0);break
case'=':b=[];while(stk.length&&(r=stk.pop())>0)b.push(r);funcs[r=tst.pop()||0]=String.fromCodePoint(...b);tst.push(r);break
case'Z':interpret(funcs[b=tst.pop()||0]);tst.push(b);break;default:tst.push(i.codePointAt())
}return tst.top()}function interpret(code){let codes=code.split`
`,T=0;for(let i of codes)do{T=il(i.split`@`[0])}while(T)}interpret(code)