The Sol Programming Language!
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.

#### 411 lines 6.4 KiB Raw Blame History

 `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('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('--- All done!') ```