Execute Brain****: Difference between revisions
Content added Content deleted
Not a robot (talk | contribs) (→{{header|8086 Assembly}}: Upload the version with the Ctrl-C bug fixed) |
(Added example for Pointless) |
||
Line 4,850: | Line 4,850: | ||
(bye)</lang> |
(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}}== |
=={{header|Potion}}== |