You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
419 lines
6.6 KiB
419 lines
6.6 KiB
print('--- Empty functions')
|
|
|
|
func f() end
|
|
|
|
print(f())
|
|
|
|
print('--- While loop')
|
|
a = 1
|
|
while a < 10 do
|
|
print(a)
|
|
a += 1
|
|
end
|
|
|
|
print("--- Range")
|
|
|
|
func mul9(b)
|
|
for i in range(#b) do
|
|
b[i] *= 9
|
|
end
|
|
end
|
|
|
|
l = [1 2 3 4 5]
|
|
print(range(#l))
|
|
print("--- Iter list")
|
|
for i in l do print(i) end
|
|
print("--- Index list")
|
|
for i in range(#l) do print(i, l[i]) end
|
|
print('--- mul9')
|
|
mul9(l)
|
|
for i in l do print(i) end
|
|
print('--- Iter mul9')
|
|
for i in range(#l) do print(i, l[i]) end
|
|
|
|
print("--- Mapgen")
|
|
|
|
PI = 3.14159265358979
|
|
|
|
d = {
|
|
integer = 1
|
|
string = "hello"
|
|
submap = {
|
|
stamina = 100
|
|
health = 42.0
|
|
}
|
|
sublist = [1 1 2 3 5 8],
|
|
["this time with spaces"] = PI*2,
|
|
[1 + 5] = 1 + 5,
|
|
[1 + 9] = 1 + 9
|
|
}
|
|
|
|
print(d)
|
|
print('--- Map iter')
|
|
for i in d do print(i, d[i]) end
|
|
|
|
print('--- try')
|
|
|
|
func bad(x)
|
|
print(x)
|
|
return x.c()
|
|
end
|
|
|
|
test1 = {c = func() return 15 end}
|
|
test2 = {}
|
|
|
|
print(try(bad, test1))
|
|
print(try(bad, test2))
|
|
|
|
print(bad(test1))
|
|
--print(bad(test2))
|
|
|
|
print('--- Induced errors')
|
|
|
|
func raise(x)
|
|
error(x)
|
|
end
|
|
|
|
print(try(raise, "lp0 on fire"))
|
|
|
|
print('--- Indexing')
|
|
|
|
print(d["integer"])
|
|
print(d.integer)
|
|
d.integer += 5
|
|
print(d.integer)
|
|
|
|
print('--- Function binding')
|
|
|
|
func outer(a)
|
|
func inner(b)
|
|
return a+b
|
|
end
|
|
inner.closure.a = a
|
|
return inner
|
|
end
|
|
|
|
i = outer(5)
|
|
print(i(3), i(4), i(5))
|
|
j = outer(8)
|
|
print(j(3), j(4), j(5))
|
|
|
|
print('--- Iterators')
|
|
|
|
func myiter()
|
|
if i>10 then return StopIteration end
|
|
i+=1
|
|
return i-1
|
|
end
|
|
myiter.closure.i = 1
|
|
|
|
for i in myiter do print(i) end
|
|
|
|
print('--- Method calls')
|
|
|
|
d = {a = func(a, b) print(a, b) end}
|
|
|
|
d.a(1, 2)
|
|
d:a(3)
|
|
|
|
print('--- Special methods')
|
|
|
|
d = {__index = func(obj, key) print('Index', obj, key) return key end,
|
|
__setindex = func(obj, key, val) print('SetIndex', obj, key, val) end,
|
|
__call = func(obj, arg1, arg2) print('Call', obj, arg1, arg2) return arg1 end}
|
|
|
|
print(d[3], d[5])
|
|
|
|
d.a = 7
|
|
|
|
print(d("q", "r"))
|
|
|
|
e = {a=1, b=2}
|
|
d = {__index = e, __setindex = e}
|
|
|
|
print(d, d.a, d.b)
|
|
|
|
d.c = 5
|
|
d.b = 7
|
|
|
|
print(d, e)
|
|
|
|
print('--- Data sharing')
|
|
|
|
d = {}
|
|
e = [1 2 3 4 5]
|
|
d.a = e
|
|
d.b = e
|
|
|
|
print(d)
|
|
|
|
e[2]=7
|
|
e[3]="c"
|
|
|
|
print(d)
|
|
|
|
d.a:insert(#(d.a), "q")
|
|
d.b:remove(1)
|
|
d.a[3]="f"
|
|
|
|
print(d)
|
|
|
|
print('--- Arithmetic structure operations')
|
|
|
|
print('ab'+'cd')
|
|
print('l'+'ol'*32)
|
|
print([1 2 3]+[4 5])
|
|
print([1 2 3]*5)
|
|
print({a=1 b=2}+{c=3})
|
|
|
|
print('--- Map/filter')
|
|
|
|
l = [1 2 3 4 5]
|
|
print(l)
|
|
|
|
l:map(func (i) return i*3 end)
|
|
print(l)
|
|
|
|
l:filter(func (i) return i & 1 end)
|
|
print(l)
|
|
|
|
print('--- Map/filter chain')
|
|
|
|
print([1 2 3 4 5]:map(func (i) return i * 3 end):filter(func (i) return i & 1 end))
|
|
|
|
print('--- Exec/eval')
|
|
|
|
exec('print("Hello from exec!")')
|
|
print(eval('5 + 3'))
|
|
execfile('programs/subtest.sol')
|
|
|
|
print('--- Modulus')
|
|
|
|
print(5%3)
|
|
print(13%5)
|
|
print(15%15)
|
|
|
|
print('--- Special function manipulation')
|
|
|
|
func foo(x)
|
|
return x
|
|
end
|
|
|
|
print(foo)
|
|
foo.name = "bar"
|
|
print(foo)
|
|
|
|
func something()
|
|
return i
|
|
end
|
|
|
|
something.closure = {i=[1, 2, 3]}
|
|
print(something())
|
|
|
|
cl = something.closure
|
|
cl.i:insert(0, "b")
|
|
print(something())
|
|
|
|
print('--- Function body swapping')
|
|
|
|
func a()
|
|
return 0
|
|
end
|
|
|
|
func b()
|
|
return 2
|
|
end
|
|
|
|
print(a, a())
|
|
print(b, b())
|
|
|
|
print(a.stmt)
|
|
print(b.stmt)
|
|
|
|
temp = a.stmt
|
|
a.stmt = b.stmt
|
|
b.stmt = temp
|
|
|
|
print(a, a())
|
|
print(b, b())
|
|
|
|
newbody = parse('return 4')
|
|
print(newbody)
|
|
|
|
a.stmt = newbody
|
|
b.stmt = newbody
|
|
|
|
print(a, a())
|
|
print(b, b())
|
|
|
|
print('--- More complicated ASTs')
|
|
|
|
print(outer, outer.stmt, outer.stmt.stmtlist)
|
|
|
|
print('--- Exec- and eval-by-parse')
|
|
|
|
parse('print("Hello from parse()!")')()
|
|
print(parse('5 + 3').stmtlist[0].expr())
|
|
|
|
print('--- Mutating ASTs')
|
|
|
|
func f()
|
|
return 5 + 7
|
|
end
|
|
|
|
print(f, f.stmt, f())
|
|
|
|
f.stmt.stmtlist[0].ret.right.ival = 11
|
|
|
|
print(f, f.stmt, f())
|
|
|
|
func g()
|
|
a=1
|
|
b=2
|
|
print("a=", a, ", b=", b)
|
|
end
|
|
|
|
print(g, g.stmt, g())
|
|
|
|
g.stmt.stmtlist[1].expr.value = parse('a').stmtlist[0].expr
|
|
|
|
print(g, g.stmt, g())
|
|
|
|
print('--- AST Environments')
|
|
|
|
code = parse('print("a is", a, "and b is", b"); a = 4; b = 5')
|
|
print(code)
|
|
code()
|
|
|
|
d = {a=1, b=2}
|
|
print(d)
|
|
code(d)
|
|
print(d)
|
|
e = {a="hello", b=["world"]}
|
|
print(e)
|
|
code(e)
|
|
print(e)
|
|
|
|
e = {a=1, b=2}
|
|
d = {__index = e}
|
|
print(d)
|
|
print(e)
|
|
code(d)
|
|
print(d)
|
|
print(e)
|
|
|
|
print('--- Basic buffers')
|
|
|
|
print('(buffer.fromstring = ', buffer.fromstring, ')')
|
|
b = buffer.fromstring("Hello, world!")
|
|
print(b)
|
|
print('(b.get = ', b.get, ')')
|
|
print(b:get(buffer.type.cstr))
|
|
b:set(buffer.type.char, "Q")
|
|
b:set(buffer.type.char, "L", 2)
|
|
print(b:get(buffer.type.cstr))
|
|
print(b:get(buffer.type.cstr, 5))
|
|
print(b:get(buffer.type.uint32))
|
|
--b:set(buffer.type.double, 1.243416560929)
|
|
b:set(buffer.type.uint32, 1886545252)
|
|
print(b:get(buffer.type.uint32))
|
|
print(b:get(buffer.type.cstr))
|
|
q = buffer.fromaddress(b:address(), b:size())
|
|
print(q:get(buffer.type.cstr))
|
|
q:set(buffer.type.cstr, "Goodbye!")
|
|
print(q:get(buffer.type.cstr), b:get(buffer.type.cstr))
|
|
|
|
s = "A string!"
|
|
b = buffer.fromobject(s)
|
|
prepr(s)
|
|
print('...is a', buffer.objtype[b:get(buffer.type.int, 0)])
|
|
print('(buffer.sizeof.ptr = ', buffer.sizeof.ptr, ')')
|
|
print('(buffer.sizeof.int = ', buffer.sizeof.int, ')')
|
|
print('(buffer.sizeof.int*2 = ', buffer.sizeof.int*2, ')')
|
|
print('(buffer.sizeof.int*2 + buffer.sizeof.ptr = ', buffer.sizeof.int*2 + (buffer.sizeof.ptr), ')')
|
|
bs = b:get(buffer.type.ptr, buffer.sizeof.int*2 + (buffer.sizeof.ptr))
|
|
print('...string buffer:', bs)
|
|
print('...with value:', bs:get(buffer.type.cstr))
|
|
|
|
print('--- IO redirection')
|
|
|
|
oldstdout = io.stdout
|
|
io.stdout = io.open('stdout', io.MODE_WRITE|io.MODE_TRUNCATE)
|
|
|
|
print('A line!')
|
|
print('An object:', {a=1, b=2, c="turkey"})
|
|
print('Something mysterious :o')
|
|
io.stdout:write('Writing directly to a file :D')
|
|
io.stdout:flush()
|
|
|
|
io.stdout = oldstdout
|
|
|
|
print('...restored stdout.')
|
|
|
|
f = io.open('stdout', io.MODE_READ)
|
|
s = f:read(io.ALL)
|
|
print('Buffered output was:')
|
|
prepr(s)
|
|
f = None
|
|
|
|
print('...second time.')
|
|
|
|
io.stdout = io.open('stdout', io.MODE_WRITE|io.MODE_TRUNCATE)
|
|
|
|
print('Hey there!')
|
|
print('l'+'ol'*32)
|
|
io.stdout:flush()
|
|
|
|
io.stdout = oldstdout
|
|
|
|
print('...restored.')
|
|
print('Output was:')
|
|
prepr(io.open('stdout', io.MODE_READ):read(io.ALL))
|
|
|
|
print('--- Substrings')
|
|
|
|
s = 'This is a test!'
|
|
prepr(s)
|
|
prepr(s:sub(1, -1))
|
|
prepr(s:sub(3, -3))
|
|
prepr(s:sub(3, 5))
|
|
prepr(s:sub(3, 11))
|
|
prepr(s:sub(-1000, -1000))
|
|
|
|
print('--- Splitting')
|
|
s = 'This is a test!'
|
|
prepr(s)
|
|
prepr(s:split(' '))
|
|
prepr(s:split('i'))
|
|
prepr(s:split('0'))
|
|
prepr(s:split('aeiou'))
|
|
|
|
l = s:split(' ')
|
|
for i in l do
|
|
prepr(i, type(i))
|
|
end
|
|
|
|
print('--- Continue/break')
|
|
|
|
l = range(10)
|
|
for i in l do
|
|
print(i)
|
|
if i >= 5 then break end
|
|
end
|
|
|
|
print('---')
|
|
|
|
for i in l do
|
|
if i%2 == 0 then continue end
|
|
print(i)
|
|
end
|
|
|
|
print('--- Control expressions')
|
|
|
|
print('1 is', if 1 then 'true' else 'false' end)
|
|
print('0 is', if 0 then 'true' else 'false' end)
|
|
|
|
print(for i in l do continue 1000 + 2 * i end)
|
|
print(for i in l do print('(', i, ')') if i >= 5 then break i end end)
|
|
|
|
print('--- All done!')
|