Execute Brain****: Difference between revisions

Added example for Pointless
(→‎{{header|8086 Assembly}}: Upload the version with the Ctrl-C bug fixed)
(Added example for Pointless)
Line 4,850:
(bye)</lang>
 
=={{header|Pointless}}==
 
<lang pointless>-- Code based on
-- https://github.com/allisio/pointless/blob/master/lib/examples/brainfuck.ptls
 
output =
iterate(run, vm)
|> takeUntil(isFinished)
|> map(vm => vm.outVal)
|> filter(notEq(None))
|> map(char)
|> printElems
 
----------------------------------------------------------
 
vm = VM {
ip = 0
dp = 0
data = zeroArray(1000)
inVals = map(ord, readLines)
outVal = None
}
 
----------------------------------------------------------
-- "hello.bf" contains brainf*** hello world code
 
ops = toArray(readFile("hello.bf"))
 
----------------------------------------------------------
 
run(vm) = vm |> clearOutput |> eval |> advance
 
advance(vm) = vm with $.ip += 1
isFinished(vm) = vm.ip >= length(ops)
clearOutput(vm) = vm with $.outVal = None
 
----------------------------------------------------------
 
jumps = getJumps(0, [], {})
 
getJumps(i, stack, jumps) = cond {
case (i == length(ops)) jumps
 
case (ops[i] == "[")
getJumps(i + 1, [i] ++ stack, jumps)
 
case (ops[i] == "]")
getJumps(i + 1, tail(stack), jumps with {
$[i] = head(stack)
$[head(stack)] = i
})
 
else getJumps(i + 1, stack, jumps)
}
 
----------------------------------------------------------
 
eval(vm) = cond {
case (op == ">") vm with $.dp += 1
case (op == "<") vm with $.dp -= 1
case (op == "+") vm with $.data[vm.dp] += 1
case (op == "-") vm with $.data[vm.dp] -= 1
case (op == ".") vm with $.outVal = byte
 
case (op == ",") vm with {
$.data[vm.dp] = head(vm.inVals)
$.inVals = tail(vm.inVals)
}
 
case (op == "[")
if byte != 0 then vm
else (vm with $.ip = jumps[vm.ip])
 
case (op == "]")
if byte == 0 then vm
else (vm with $.ip = jumps[vm.ip])
 
else vm
 
} where {
op = ops[vm.ip]
byte = vm.data[vm.dp]
}</lang>
 
=={{header|Potion}}==
Anonymous user