swapfuck/Implementation
Jump to navigation
Jump to search
Here is a rough implementation of swapfuck in Lua. The "while zero" loop described in the main article has been included in this interpreter as {}.
return {
run = function (wc, tape)
local wc = wc:gsub("[^%@%<%>%[%]%{%}%.]", "")
local tape = tape or {}
local cell = 1
local stack = {}
local buffer = 0
local buffersize = 0
local i = 1
while i <= #wc do
local char = wc:sub(i, i)
-- Basics
if char == "@" then
tape[cell], tape[cell + 1] = tape[cell + 1], tape[cell]
elseif char == "<" then
cell = cell - 1
elseif char == ">" then
cell = cell + 1
-- While
elseif char == "[" or char == "{" then
if (char == "{") ~= (tape[cell] ~= nil and tape[cell] ~= 0) then
table.insert(stack, {type = "while", ip = i})
else
local depth = 1
i = i + 1
while depth > 0 do
local char = wc:sub(i, i)
if char == "[" then depth = depth + 1
elseif char == "]" then depth = depth - 1 end
i = i + 1
end
i = i - 1
end
elseif char == "]" or char == "}" then
if (char == "}") ~= (tape[cell] ~= nil and tape[cell] ~= 0) then
i = stack[#stack].ip
else
table.remove(stack)
end
-- Output
elseif char == "." then
buffer = buffer * 2 + ((tape[cell] and tape[cell] ~= 0) and 1 or 0)
buffersize = buffersize + 1
if buffersize == 8 then
io.write(string.char(buffer))
buffer, buffersize = 0, 0
end
end
i = i + 1
end
return tape
end
}