Execute SNUSP: Difference between revisions
Content added Content deleted
(Added Kotlin) |
|||
Line 266: | Line 266: | ||
{{out}} |
{{out}} |
||
<pre>Hello World!</pre> |
<pre>Hello World!</pre> |
||
=={{header|Phix}}== |
|||
{{trans|Go}}<lang Phix>integer id = 0, ipr = 1, ipc = 1 |
|||
procedure step() |
|||
if and_bits(id,1) == 0 then |
|||
ipc += 1 - and_bits(id,2) |
|||
else |
|||
ipr += 1 - and_bits(id,2) |
|||
end if |
|||
end procedure |
|||
procedure snusp(integer dlen, string s) |
|||
sequence ds = repeat(0,dlen) -- data store |
|||
integer dp = 1 -- data pointer |
|||
-- remove leading '\n' from string if present |
|||
s = trim_head(s,'\n') |
|||
-- make 2 dimensional instruction store and set instruction pointers |
|||
sequence cs = split(s,'\n') |
|||
ipr = 1 |
|||
ipc = 1 |
|||
-- look for starting instruction |
|||
for i=1 to length(cs) do |
|||
ipc = find('$',cs[i]) |
|||
if ipc then |
|||
ipr = i |
|||
exit |
|||
end if |
|||
end for |
|||
id = 0 |
|||
-- execute |
|||
while ipr>=1 and ipr<=length(cs) |
|||
and ipc>=1 and ipc<=length(cs[ipr]) do |
|||
integer op = cs[ipr][ipc] |
|||
switch op do |
|||
case '>' : dp += 1 |
|||
case '<' : dp -= 1 |
|||
case '+' : ds[dp] += 1 |
|||
case '-' : ds[dp] -= 1 |
|||
case '.' : puts(1,ds[dp]) |
|||
case ',' : ds[dp] = getc(0) |
|||
case '/' : id = not_bits(id) |
|||
case '\\': id = xor_bits(id,1) |
|||
case '!' : step() |
|||
case '?' : if ds[dp]=0 then step() end if |
|||
end switch |
|||
step() |
|||
end while |
|||
end procedure |
|||
constant hw = """ |
|||
/++++!/===========?\>++.>+.+++++++..+++\ |
|||
\+++\ | /+>+++++++>/ /++++++++++<<.++>./ |
|||
$+++/ | \+++++++++>\ \+++++.>.+++.-----\ |
|||
\==-<<<<+>+++/ /=.>.+>.--------.-/""" |
|||
snusp(5, hw)</lang> |
|||
{{out}} |
|||
<pre> |
|||
Hello World! |
|||
</pre> |
|||
=={{header|PicoLisp}}== |
=={{header|PicoLisp}}== |