Assign

Assign is an esoteric programming language that is a subset of JavaScript. In Assign there are no assignment, increment or decrement operators.

Strategy

I found that to write programs in assign I would need to use one of two strategies (maybe there are others). The first strategy is to use recursive functions instead of loops in all cases. This actually leads to some very elegant (and short) programs. The second strategy is to use an array to store values. We initialize the array by passing [] into a function, and then provided set and get operations which modify elements in the array.

Example Programs

Primes #1

```function checkPrime(a, b){
if(a == b)
return true
return ( b % a != 0 ) && checkPrime(a+1, b)
}

function isPrime(x){
return checkPrime(2, x)
}

function printPrimes(a, b){
if(isPrime(a))
console.log(a)
if(a < b)
printPrimes(a+1, b)
}

printPrimes(2, 30)
```

Sort

```function merge(arr1, arr2){
if( (arr1.length > 0) && (arr2.length > 0) ){
if(arr1[0] < arr2[0])
return [arr1[0]].concat( merge(arr1.slice(1), arr2) )
else
return [arr2[0]].concat( merge(arr1, arr2.slice(1)) )
} else {
return arr1.concat(arr2)
}
}

function sort(arr){
if(arr.length < 2)
return arr
return merge( sort( arr.slice( Math.floor( arr.length / 2 ) ) ), sort( arr.slice( 0, Math.floor( arr.length / 2 ) ) ) )
}

console.log(sort([4, 3, 2, 1, 5]))
```

Primes #2

```function run(arr, size){
function init(){
arr.push([])
arr.push([])
while(arr[0].length < size){
arr[0].push(0)
}
}

function set(pos, value){
while(arr[0].length > (pos + 1))
arr[1].push(arr[0].pop())

arr[0].pop()
arr[0].push(value)

while(arr[1].length > 0)
arr[0].push(arr[1].pop())
}

function get(pos){
return arr[0][pos]
}

init()

function isPrime(x){
set(1, 2)
while(get(1) < x){
if(x % get(1) == 0)
return false
set(1, get(1) + 1)
}
return true
}

for(set(0, 2); get(0) < 30; set(0, get(0)+1 )){
if(isPrime(get(0)))
console.log(get(0))
}

}

run([], 10)
```

Quine

```((q,d)=>{console.log(d+q+`',`+q+d+q+`)`)})('"',"((q,d)=>{console.log(d+q+`',`+q+d+q+`)`)})('")
```