# Fun with diagonalization

No more loops, embrace the future with recursive self-modifying code and diagonalization. In the following code snippet, we show how to replace loops like ‘while E do C’ with only ‘if’ and ‘eval’ statements:

```
// expects stmt == 'if(expr) { command }'
function Z(stmt) {
start = stmt.indexOf('(')+1;
end = stmt.indexOf(')');
expr = stmt.substr(start, end-start);

start = stmt.indexOf('{')+1;
end = stmt.lastIndexOf('}');
command = stmt.substr(start, end-start);

out = 'if ('+expr+') {'+command+'; stmt=\'if('+expr+') {'+command+'}\'; eval(Z(stmt))}';
return out;
}

i = 3;

// the following line is equivalent to while(i>=0) { alert(i); i-- }:
eval(Z('if(i>=0) { alert(i); i-- }'))
```

Read more about diagonalization and its use by Cantor and Gödel here.

UPDATE: a nicer code snippet by Matt Kaczmarek below.

```
special = "/**/"
function Z (stmt){
stmt = stmt.replace (special, "\'" + stmt + "\'");
return stmt;
}

i = 3;

// the following line is equivalent to while(i>=0) { alert(i); i-- }:
eval(Z('if(i>=0) {alert(i); i-- ; eval(Z(/**/))}'));
```