Python version: 3.7 Lua version: 5.3
I want to know more about FEATURES!
- The latest version includes the use of 'operator overloading', and 'properties' in classes
- Type comparisons have been added
- Try/except blocks have been added
- String functions have been added (find, split, join, replace, basic slices (no step yet) rudimentary format (no typing, e.g. {.2f})
- The string functions required a large change to the overall code to include luas : operator. Classes etc have been changed substantially under the hood, but the user should not be able to notice the change.
- Assigning static methods to variables and calling them is not permitted, only call static methods directly
- Assigning nested classes to variables and initializing them is not permitted, only initialize nested classes from within the main class directly.
usage: python-lua [-h] [--show-ast] [--only-lua-init] [--no-lua-init] [IF]
Python to lua translator.
positional arguments:
IF A python script filename to translate it.
optional arguments:
-h, --help show this help message and exit
--show-ast Print python ast tree before code.
--only-lua-init Print only lua initialization code.
--no-lua-init Print lua code without lua init code.
For example: python3 __main__py tests/iterlist.py
from pythonlua.translator import Translator ... translator = Translator() lua_code = translator.translate(python_code)
For example see runtests.py.
This translator defines some python functions in lua (len, range, enumerate, list, dict and other).
For list and dict it also defines most methods like append() for list and items() for dict.
You can find this definitions in the file pythonlua/luainit.lua.
Also this definitions will be in the output, when you run translator as a standalone application.
For example
local string_meta = getmetatable("") string_meta.__add = function(v1, v2) if type(v1) == "string" and type(v2) == "string" then return v1 .. v2 end return v1 + v2 end local str = tostring local int = tonumber local function len(t) return #t end local function range(from, to, step) assert(from ~= nil) if to == nil then to = from from = 1 end if step == nil then step = to > from and 1 or -1 end local i = from return function() ret = i if (step > 0 and i > to) or (step < 0 and i < to) then return nil end i = i + step return ret end end local function list(t) local methods = {} methods.append = function(value) table.insert(t, value) end local iterator_index = nil setmetatable(t, { __index = function(self, index) if type(index) == "number" and index < 0 then return rawget(t, #t + index + 1) end return methods[index] end, __call = function(self, _, idx) if idx == nil and iterator_index ~= nil then iterator_index = nil end local v = nil iterator_index, v = next(t, iterator_index) return v end, }) return t end function dict(t) local methods = {} methods.items = function() return pairs(t) end local key_index = nil setmetatable(t, { __index = methods, __call = function(self, _, idx) if idx == nil and key_index ~= nil then key_index = nil end key_index, _ = next(t, key_index) return key_index end, }) return t end function enumerate(t, start) start = start or 1 local i, v = next(t, nil) return function() local index, value = i, v i, v = next(t, i) if index == nil then return nil end return index + start - 1, value end end local a, b, c = 1, 2, 3 print(a, b, c) a, b = nil, nil print(a, b, c) c = nil print(a, b, c)
Open
Python code:
foo.bar.baz.one.two.three("Hello, world!")
Lua code:
foo.bar.baz.one.two:three(("Hello, world!"))
Output:
Open
Python code:
class Animal: PLANET = "Earth" def __init__(self, name): self.name = name def say_hello(self): print("Hello, my name is: " + self.name + "!") @staticmethod def statichello(msg): print(msg+" from staticmethod") class Dog(Animal): def say_hello(self): print("Hello, my name is: " + self.name + "!") self.bark() def bark(self): print("Bark! Bark! Bark!") sparky = Animal("Sparky") barky = Dog("Barky") sparky.say_hello() barky.say_hello() barky.bark() print("Animal.PLANET = ", Animal.PLANET) print("sparky.PLANET = ", sparky.PLANET) print("barky.PLANET = ", barky.PLANET) Animal.PLANET = "Mars" print("Animal.PLANET = ", Animal.PLANET) print("sparky.PLANET = ", sparky.PLANET) Animal.statichello("Hello") Dog.statichello("Hello")
Lua code:
Animal = class(function(Animal) Animal.PLANET = ("Earth") function Animal.__init__(self, name) self.name = name end function Animal.say_hello(self) print(((("Hello, my name is: ") + self.name) + ("!"))) end Animal.statichello = staticmethod(function(msg) print((msg + (" from staticmethod"))) end) return Animal end, "Animal", {}, {}, {}) Dog = class(function(Dog) function Dog.say_hello(self) print(((("Hello, my name is: ") + self.name) + ("!"))) self:bark() end function Dog.bark(self) print(("Bark! Bark! Bark!")) end return Dog end, "Dog", {Animal}, {}, {}) sparky = Animal(("Sparky")) barky = Dog(("Barky")) sparky:say_hello() barky:say_hello() barky:bark() print(("Animal.PLANET = "), Animal.PLANET) print(("sparky.PLANET = "), sparky.PLANET) print(("barky.PLANET = "), barky.PLANET) Animal.PLANET = ("Mars") print(("Animal.PLANET = "), Animal.PLANET) print(("sparky.PLANET = "), sparky.PLANET) Animal:statichello(("Hello")) Dog:statichello(("Hello"))
Output:
Hello, my name is: Sparky! Hello, my name is: Barky! Bark! Bark! Bark! Bark! Bark! Bark! Animal.PLANET = Earth sparky.PLANET = Earth barky.PLANET = Earth Animal.PLANET = Mars sparky.PLANET = Mars Hello from staticmethod Hello from staticmethod
Open
Python code:
class example: def __init__(self, v): self.value = v def __add__(self, other): return example(self.value+other.value) def __sub__(self, other): return example(self.value-other.value) def __mul__(self, other): return example(self.value*other.value) def __truediv__(self, other): return example(self.value/other.value) def __lt__(self, other): return self.value < other.value def __str__(self): return str(self.value) def __contains__(self, item): if isinstance(item, str): return True return False @property def prop(self): return self.value @prop.setter def prop(self,new): if new > 5: self.value = new class A: obj = None def __new__(cls, *args, **kwargs): if not cls.obj: cls.obj = object.__new__(cls) return cls.obj def __init__(self): print('init') a = example(5) b = example(6) print(a+b) print(a-b) print(a*b) print(a/b) print(a.prop) a.prop = 4 print(a.prop) a.prop = 6 print(a.prop) if "string" in a: print("yes") if 1 in a: print("no") a = A() b = A() print(a==b)
Lua code:
example = class(function(example) function example.__init__(self, v) self.value = v end function example.__add__(self, other) return example((self.value + other.value)) end function example.__sub__(self, other) return example((self.value - other.value)) end function example.__mul__(self, other) return example((self.value * other.value)) end function example.__truediv__(self, other) return example((self.value / other.value)) end function example.__lt__(self, other) return (self.value < other.value) end function example.__str__(self) return str(self.value) end function example.__contains__(self, item) if isinstance(item, str) then return true end return false end example.prop = property(function(self) return self.value end) example.prop = example.prop:setter(function(self, new) if (new > 5) then self.value = new end end) return example end, "example", {}, {__add = "__add__", __sub = "__sub__", __mul = "__mul__", __div = "__truediv__", __lt = "__lt__", __tostring = "__str__", __in = "__contains__"}, {prop = "example.prop"}) A = class(function(A) A.obj = nil function A.__new__(cls, ...) local args = list {...} if not cls.obj then cls.obj = object:__new__(cls) end return cls.obj end function A.__init__(self) print(("init")) end return A end, "A", {}, {}, {}) a = example(5) b = example(6) print((a + b)) print((a - b)) print((a * b)) print((a / b)) print(a.prop) a.prop = 4 print(a.prop) a.prop = 6 print(a.prop) if (operator_in(("string"), a)) then print(("yes")) end if (operator_in(1, a)) then print(("no")) end a = A() b = A() print((a == b))
Output:
11 -1 30 0.83333333333333 5 5 6 yes init init true
Open
Python code:
"""Documentation comments test""" class Animal: """Class-level docstring""" pass def foo(): """Function-level docstring""" pass name = "John " + "Parrish" print(name) print("Hello!")
Lua code:
--[[ Documentation comments test ]] Animal = class(function(Animal) --[[ Class-level docstring ]] return Animal end, "Animal", {}, {}, {}) function foo() --[[ Function-level docstring ]] end name = (("John ") + ("Parrish")) print(name) print(("Hello!"))
Output:
John Parrish Hello!
Open
Python code:
a = [i * j for i in range(5) for j in range(3) if i * j % 2 == 0 and i > 0 and j > 0] for item in a: print(item) lst = ["a","b","c","d","e"] b = {lst[i]: i ** 2 for i in range(5)} for k in lst: print(k,b[k])
Lua code:
a = (function() local result = list {} for i in range(5) do for j in range(3) do if (((math.fmod((i * j), 2)) == 0) and (i > 0) and (j > 0)) then result:append((i * j)) end end end return result end)() for item in a do print(item) ::loop_label_1:: end lst = list {("a"), ("b"), ("c"), ("d"), ("e")} b = (function() local result = dict {} for i in range(5) do result[lst[i]] = (i ^ 2) end return result end)() for k in lst do print(k, b[k]) ::loop_label_2:: end
Output:
2 2 4 6 4 8 a 0.0 b 1.0 c 4.0 d 9.0 e 16.0
Open
Python code:
for i in range(10): if i == 5: continue for j in range(10): if j == 7: continue print(i, " * ", j, " = ", i * j)
Lua code:
for i in range(10) do if (i == 5) then goto loop_label_3 end for j in range(10) do if (j == 7) then goto loop_label_4 end print(i, (" * "), j, (" = "), (i * j)) ::loop_label_4:: end ::loop_label_3:: end
Output:
0 * 0 = 0 0 * 1 = 0 0 * 2 = 0 0 * 3 = 0 0 * 4 = 0 0 * 5 = 0 0 * 6 = 0 0 * 8 = 0 0 * 9 = 0 1 * 0 = 0 1 * 1 = 1 1 * 2 = 2 1 * 3 = 3 1 * 4 = 4 1 * 5 = 5 1 * 6 = 6 1 * 8 = 8 1 * 9 = 9 2 * 0 = 0 2 * 1 = 2 2 * 2 = 4 2 * 3 = 6 2 * 4 = 8 2 * 5 = 10 2 * 6 = 12 2 * 8 = 16 2 * 9 = 18 3 * 0 = 0 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 3 * 4 = 12 3 * 5 = 15 3 * 6 = 18 3 * 8 = 24 3 * 9 = 27 4 * 0 = 0 4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16 4 * 5 = 20 4 * 6 = 24 4 * 8 = 32 4 * 9 = 36 6 * 0 = 0 6 * 1 = 6 6 * 2 = 12 6 * 3 = 18 6 * 4 = 24 6 * 5 = 30 6 * 6 = 36 6 * 8 = 48 6 * 9 = 54 7 * 0 = 0 7 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 8 = 56 7 * 9 = 63 8 * 0 = 0 8 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 48 8 * 8 = 64 8 * 9 = 72 9 * 0 = 0 9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 8 = 72 9 * 9 = 81
Open
Python code:
def strong(old_fun): def wrapper(*args): s = "<strong>" + old_fun(*args) + "</strong>" return s return wrapper def italic(old_fun): def wrapper(*args): s = "<em>" + old_fun(*args) + "</em>" return s return wrapper @italic @strong def hello(name): return "Hello, " + name + "!" print(hello("John"))
Lua code:
function strong(old_fun) local function wrapper(...) local args = list {...} local s = ((("<strong>") + old_fun(unpack(args))) + ("</strong>")) return s end return wrapper end function italic(old_fun) local function wrapper(...) local args = list {...} local s = ((("<em>") + old_fun(unpack(args))) + ("</em>")) return s end return wrapper end hello = italic(strong(function(name) return ((("Hello, ") + name) + ("!")) end)) print(hello(("John")))
Output:
Hello, John!
Open
Python code:
def hello(name, age=20, nickname="", *args): print("Hello, my name is " + name + " and I'm " + str(age)) print("My nickname is " + nickname) hello("John", 12, "antikiller") hello("Josh", 45) hello("Jane")
Lua code:
function hello(name, age, nickname, ...) age = age or 20 nickname = nickname or ("") local args = list {...} print((((("Hello, my name is ") + name) + (" and I'm ")) + str(age))) print((("My nickname is ") + nickname)) end hello(("John"), 12, ("antikiller")) hello(("Josh"), 45) hello(("Jane"))
Output:
Hello, my name is John and I'm 12 My nickname is antikiller Hello, my name is Josh and I'm 45 My nickname is Hello, my name is Jane and I'm 20 My nickname is
Open
Python code:
a, b, c = 1, 2, 3 print(a, b, c) del a, b print(a, b, c) del c print(a, b, c)
Lua code:
a, b, c = 1, 2, 3 print(a, b, c) a, b = nil, nil print(a, b, c) c = nil print(a, b, c)
Output:
1 2 3 nil nil 3 nil nil nil
Open
Python code:
def factorial(value): return 1 if value == 0 else value * factorial(value - 1) print(factorial(5)) print(factorial(10)) print(factorial(3)) print(factorial(0))
Lua code:
function factorial(value) return (function() if (value == 0) then return 1 end return (value * factorial((value - 1))) end)() end print(factorial(5)) print(factorial(10)) print(factorial(3)) print(factorial(0))
Output:
120 3628800 6 1
Open
Python code:
for i in range(10): print(i) k = [1, 2, 3] print(len(k))
Lua code:
for i in range(10) do print(i) ::loop_label_5:: end k = list {1, 2, 3} print(len(k))
Output:
0 1 2 3 4 5 6 7 8 9 3
Open
Python code:
foo = 42 def bar(): global foo foo = 34 print("foo = ", foo) bar() print("foo = ", foo)
Lua code:
foo = 42 function bar() foo = 34 end print(("foo = "), foo) bar() print(("foo = "), foo)
Output:
foo = 42 foo = 34
Open
Python code:
a = 45 b = 0 if a > 5 and b < 34: print("a > 5") if a >= 45: print("a >= 45") else: print("a < 45") elif a < 5: print("a < 5") else: print("a == 5") if a == 45: print("a == 45") x = 100 if 50 < x < 150: print("50 < x < 150") else: print("Something wrong.")
Lua code:
a = 45 b = 0 if ((a > 5) and (b < 34)) then print(("a > 5")) if (a >= 45) then print(("a >= 45")) else print(("a < 45")) end elseif (a < 5) then print(("a < 5")) else print(("a == 5")) end if (a == 45) then print(("a == 45")) end x = 100 if (50 < x and x < 150) then print(("50 < x < 150")) else print(("Something wrong.")) end
Output:
a > 5 a >= 45 a == 45 50 < x < 150
Open
Python code:
import foo.bar import bar as bar_ex
Lua code:
local bar = require("foo.bar") local bar_ex = require("bar")
Output:
Open
Python code:
a = [1, 2, 3, 4] b = { "name": "John", "age": 42, } c = "Hello, world!" if 2 < 3: print("2 < 3") print(1 in a) print(2 in a) print(5 in a) print("name" in b) print("surname" in b) print("Hell" in c) print("world" in c) print("Foo" in c) print("Hells" not in c)
Lua code:
a = list {1, 2, 3, 4} b = dict {[("name")] = ("John"), [("age")] = 42} c = ("Hello, world!") if (2 < 3) then print(("2 < 3")) end print((operator_in(1, a))) print((operator_in(2, a))) print((operator_in(5, a))) print((operator_in(("name"), b))) print((operator_in(("surname"), b))) print((operator_in(("Hell"), c))) print((operator_in(("world"), c))) print((operator_in(("Foo"), c))) print((not operator_in(("Hells"), c)))
Output:
2 < 3 true true false true false true true false true
Open
Python code:
class A: pass class B(A): pass a=A() b=B() print(isinstance(a,A)) print(isinstance(a,B)) print(isinstance(b,A)) print(isinstance(b,B))
Lua code:
A = class(function(A) return A end, "A", {}, {}, {}) B = class(function(B) return B end, "B", {A}, {}, {}) a = A() b = B() print(isinstance(a, A)) print(isinstance(a, B)) print(isinstance(b, A)) print(isinstance(b, B))
Output:
true false true true
Open
Python code:
book = { "title": "Harry Potter and the philosopher's stone", "author": "J. K. Rowling", "year": 1997, } k = 0 for i in book: k += 1 if k > 1: break for i in book: pass
Lua code:
book = dict {[("title")] = ("Harry Potter and the philosopher's stone"), [("author")] = ("J. K. Rowling"), [("year")] = 1997} k = 0 for i in book do k = (k + 1) if (k > 1) then break end ::loop_label_6:: end for i in book do ::loop_label_7:: end
Output:
Open
Python code:
a = [1, 4, 8, 16, 52, 34, 78, 342] k = 0 strange_sum = 0 for i in a: k += 1 if k > 3: break print("Current i is: ", i) strange_sum += i print("After break: ") for i in a: print("Current i is: ", i) strange_sum += i print("Some strange sum is: ", strange_sum)
Lua code:
a = list {1, 4, 8, 16, 52, 34, 78, 342} k = 0 strange_sum = 0 for i in a do k = (k + 1) if (k > 3) then break end print(("Current i is: "), i) strange_sum = (strange_sum + i) ::loop_label_8:: end print(("After break: ")) for i in a do print(("Current i is: "), i) strange_sum = (strange_sum + i) ::loop_label_9:: end print(("Some strange sum is: "), strange_sum)
Output:
Current i is: 1 Current i is: 4 Current i is: 8 After break: Current i is: 1 Current i is: 4 Current i is: 8 Current i is: 16 Current i is: 52 Current i is: 34 Current i is: 78 Current i is: 342 Some strange sum is: 548
Open
Python code:
sqr = lambda x: x * x print(sqr(2)) print(sqr(8))
Lua code:
sqr = function(x) return (x * x) end print(sqr(2)) print(sqr(8))
Output:
4 64
Open
Python code:
a = [1, 2, 5] b = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], ] c = { "firstname": "John", "lastname": "Doe", "age": 42, "children": [ { "name": "Sara", "age": 4, }, ], } print(a[1]) print(b[0][1]) print(c["firstname"], c["lastname"]) ch = c["children"][0] print(ch["name"], ch["age"])
Lua code:
a = list {1, 2, 5} b = list {list {1, 2, 3}, list {4, 5, 6}, list {7, 8, 9}} c = dict {[("firstname")] = ("John"), [("lastname")] = ("Doe"), [("age")] = 42, [("children")] = list {dict {[("name")] = ("Sara"), [("age")] = 4}}} print(a[1]) print(b[0][1]) print(c[("firstname")], c[("lastname")]) ch = c[("children")][0] print(ch[("name")], ch[("age")])
Output:
2 2 John Doe Sara 4
Open
Python code:
i = 10 j = 5 while i > 0: print(i) i = i - 1 test = 3434 test = 56 def fact(n): return 1 if n == 0 else n * fact(n - 1) class Foo: def __init__(self): self.cls_var = 45 localvar = 56
Lua code:
i = 10 j = 5 while (i > 0) do print(i) i = (i - 1) local test = 3434 ::loop_label_10:: end test = 56 function fact(n) return (function() if (n == 0) then return 1 end return (n * fact((n - 1))) end)() end Foo = class(function(Foo) function Foo.__init__(self) self.cls_var = 45 local localvar = 56 end return Foo end, "Foo", {}, {}, {})
Output:
10 9 8 7 6 5 4 3 2 1
Open
Python code:
def get_summ(a, b): return a + b print(get_summ(3, 5)) """[[luacode]] local c = 45 print(c) """ """[[luacode=tests\\luacode.lua]]"""
Lua code:
function get_summ(a, b) return (a + b) end print(get_summ(3, 5)) local c = 45 print(c) print('luacode imported')
Output:
8 45 luacode imported
Open
Python code:
class Foo: class Bar: def __init__(self): print("__init__ from Bar") def __init__(self): print("__init__ from Foo") Foo.Bar() Foo() Foo.Bar()
Lua code:
Foo = class(function(Foo) Foo.Bar = class(function(Bar) function Bar.__init__(self) print(("__init__ from Bar")) end return Bar end, "Bar", {}, {}, {}) function Foo.__init__(self) print(("__init__ from Foo")) Foo.Bar() end return Foo end, "Foo", {}, {}, {}) Foo() Foo:Bar()
Output:
init from Foo init from Bar init from Bar
Open
Python code:
print(5 + 3) print(18 - 2) print(5 * 5) print(64 / 2) print(11 ** 2) print(11 // 2) print(11 / 2) print(((5 + 34) ** 2 / 53) * (24 - 6 * 3))
Lua code:
print((5 + 3)) print((18 - 2)) print((5 * 5)) print((64 / 2)) print((11 ^ 2)) print((math.floor(11 / 2))) print((11 / 2)) print(((((5 + 34) ^ 2) / 53) * (24 - (6 * 3))))
Output:
8 16 25 32.0 121.0 5 5.5 172.18867924528
Open
Python code:
print("test" + "ing") print("test{}".format("ing2")) str = "ab{}cb{}" print(str.replace("b","d")) print(str.find("c")) print(str.format("asdf","asdf2")) print(str[1:5]) print("()".join(str.split("{}"))) print("""a multiline string """)
Lua code:
print((("test") + ("ing"))) print(("test{}"):format(("ing2"))) str = ("ab{}cb{}") print(str:replace(("b"), ("d"))) print(str:find(("c"))) print(str:format(("asdf"), ("asdf2"))) print(str[slice(1,5,nil)]) print(("()"):join(str:split(("{}")))) print(([[a multiline string ]]))
Output:
testing testing2 ad{}cd{} 4 abasdfcbasdf2 b{}c ab()cb() a multiline string
Open
Python code:
try: print('test') xpcall() print('still going') except: print('Error in function') print('running')
Lua code:
xpcall(function() print(("test")) xpcall() print(("still going")) end, function(Error) print(("Error in function")) end) print(("running"))
Output:
test Error in function running
Open
Python code:
class A: pass a = A() if isinstance(a,A) and type(a) is A: print("class typing works") b = 5.5 if isinstance(b,float): # or int, since both convert to number in lua print("number typing works") c = "my string" if isinstance(c,str): print("string typing works") d = [] if type(d) is list and isinstance(d,list): print("list type works") e = {} if type(e) is dict and isinstance(e,dict): print("dict type works") if type(d) is dict or type(e) is list: print("not good")
Lua code:
A = class(function(A) return A end, "A", {}, {}, {}) a = A() if (isinstance(a, A) and (type(a) == A)) then print(("class typing works")) end b = 5.5 if isinstance(b, float) then print(("number typing works")) end c = ("my string") if isinstance(c, str) then print(("string typing works")) end d = list {} if ((type(d) == list) and isinstance(d, list)) then print(("list type works")) end e = dict {} if ((type(e) == dict) and isinstance(e, dict)) then print(("dict type works")) end if ((type(d) == dict) or (type(e) == list)) then print(("not good")) end
Output:
class typing works number typing works string typing works list type works dict type works
Open
Python code:
a = 45 a = -a b = +a c = ~a test = True nt = not test print(a, b, c) print(test, nt)
Lua code:
a = 45 a = -a b = a c = bit32.bnot(a) test = true nt = not test print(a, b, c) print(test, nt)
Output:
-45 -45 44 true false
Open
Python code:
def foo(): pass def varargs(name, *args): print("Name is: ", name) print(*args) varargs("first", 1, 3, 6, 4, 7) varargs("second", "hello", "python", "world")
Lua code:
function foo() end function varargs(name, ...) local args = list {...} print(("Name is: "), name) print(unpack(args)) end varargs(("first"), 1, 3, 6, 4, 7) varargs(("second"), ("hello"), ("python"), ("world"))
Output:
Name is: first 1 3 6 4 7 Name is: second hello python world
Open
Python code:
a = 45 b = 100 a, b = b, a c = a * b d = c / (1 + 1) print(a) print(b) print(c) print(d)
Lua code:
a = 45 b = 100 a, b = b, a c = (a * b) d = (c / (1 + 1)) print(a) print(b) print(c) print(d)
Output:
100 45 4500 2250.0
Open
Python code:
i = 10 while i > 0: print(i) i -= 1
Lua code:
i = 10 while (i > 0) do print(i) i = (i - 1) ::loop_label_11:: end
Output:
10 9 8 7 6 5 4 3 2 1
Open
Python code:
with open("output") as output_file: output_file.write(input_file.read())
Lua code:
do local output_file = open(("output")) output_file:write(input_file:read()) end
Output: