Execute SNUSP: Difference between revisions
Content added Content deleted
No edit summary |
(Add Seed7 example) |
||
Line 35: | Line 35: | ||
=={{header|Ruby}}== |
=={{header|Ruby}}== |
||
See [[RCSNUSP/Ruby]]. |
See [[RCSNUSP/Ruby]]. |
||
=={{header|Seed7}}== |
|||
The interpreter below implements Core SNUSP: |
|||
<lang seed7>$ include "seed7_05.s7i"; |
|||
const proc: snusp (in string: sourceCode, in integer: memSize, inout file: input, inout file: output) is func |
|||
local |
|||
var array string: instructions is 0 times ""; |
|||
var array char: memory is 0 times ' '; |
|||
var integer: dataPointer is 1; |
|||
var integer: instrPtrRow is 0; |
|||
var integer: instrPtrColumn is 0; |
|||
var integer: rowDir is 0; |
|||
var integer: columnDir is 1; |
|||
var integer: helpDir is 0; |
|||
var integer: row is 0; |
|||
begin |
|||
instructions := split(sourceCode, "\n"); |
|||
memory := memSize times '\0\'; |
|||
for key row range instructions do |
|||
if pos(instructions[row], '$') <> 0 then |
|||
instrPtrRow := row; |
|||
instrPtrColumn := pos(instructions[row], '$'); |
|||
end if; |
|||
end for; |
|||
while instrPtrRow >= 1 and instrPtrRow <= length(instructions) and |
|||
instrPtrColumn >= 1 and instrPtrColumn <= length(instructions[instrPtrRow]) do |
|||
case instructions[instrPtrRow][instrPtrColumn] of |
|||
when {'>'}: incr(dataPointer); |
|||
when {'<'}: decr(dataPointer); |
|||
when {'+'}: incr(memory[dataPointer]); |
|||
when {'-'}: decr(memory[dataPointer]); |
|||
when {'.'}: write(output, memory[dataPointer]); |
|||
when {','}: memory[dataPointer] := getc(input); |
|||
when {'/'}: helpDir := rowDir; |
|||
rowDir := -columnDir; |
|||
columnDir := -helpDir; |
|||
when {'\\'}: helpDir := rowDir; |
|||
rowDir := columnDir; |
|||
columnDir := helpDir; |
|||
when {'!'}: instrPtrRow +:= rowDir; |
|||
instrPtrColumn +:= columnDir; |
|||
when {'?'}: if memory[dataPointer] = '\0\' then |
|||
instrPtrRow +:= rowDir; |
|||
instrPtrColumn +:= columnDir; |
|||
end if; |
|||
end case; |
|||
instrPtrRow +:= rowDir; |
|||
instrPtrColumn +:= columnDir; |
|||
end while; |
|||
end func; |
|||
# SNUSP implementation of Hello World. |
|||
const string: helloWorld is "/++++!/===========?\\>++.>+.+++++++..+++\\\n\ |
|||
\\\+++\\ | /+>+++++++>/ /++++++++++<<.++>./\n\ |
|||
\$+++/ | \\+++++++++>\\ \\+++++.>.+++.-----\\\n\ |
|||
\ \\==-<<<<+>+++/ /=.>.+>.--------.-/"; |
|||
const proc: main is func |
|||
begin |
|||
snusp(helloWorld, 5, IN, OUT); |
|||
end func;</lang> |
|||
{{out}} |
|||
<pre> |
|||
Hello World! |
|||
</pre> |
|||
=={{header|Tcl}}== |
=={{header|Tcl}}== |