RosettaCodeData/Task/Subleq/APL/subleq.apl

30 lines
1.4 KiB
APL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/local/bin/apl -s --
⎕IO0 ⍝ Index origin 0 is more intuitive with 'pointers'
Subleq;fn;text;M;A;B;C;X
(5⎕ARG)/usage ⍝ There should be one (additional) argument
fn⎕ARG[4] ⍝ This argument should be the file name
(''0text⎕FIO[26]fn)/filerr ⍝ Load the file
text[(text⎕TC)/text]' ' ⍝ Control characters to spaces
text[(text='-')/text]'¯' ⍝ Negative numbers get high minus
Mtext ⍝ The memory starts with the numbers in the text
pc0 ⍝ Program counter starts at PC
instr: (A B C)3pcM ⍝ Read instruction
M'(1+A⌈B⌈C⌈M)↑M'⎕EA'M⊣M[A,B,C]' ⍝ Extend the array if necessary
pcpc+3 ⍝ PC is incremented by 3
(A=¯1)/in ⍝ If A=-1, read input
(B=¯1)/out ⍝ If B=-1, write output
(0<M[B]M[B]-M[A])/instr ⍝ Do SUBLEQ instruction
pcC ⍝ Set PC if necessary
(C0)×instr ⍝ Next instruction if C≥0
in: X(M[B]1⎕FIO[41]1)⎕FIO[42]1 instr
out: XM[A]⎕FIO[42]1 instr
usage: 'subleq.apl <file> - Run the SUBLEQ program in <file>' 0
filerr: 'Error loading: ',fn 0
Subleq
)OFF