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 Normal View History

 Moved all sol files to programs directory 7 years ago​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ ```print('--- Empty functions') func f() end print(f()) print('--- While loop')a = 1while a < 10 do print(a) a += 1end print("--- Range") func mul9(b) for i in range(#b) do b[i] *= 9 endend l = [1 2 3 4 5]print(range(#l))print("--- Iter list")for i in l do print(i) endprint("--- Index list")for i in range(#l) do print(i, l[i]) endprint('--- mul9')mul9(l)for i in l do print(i) endprint('--- 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 += 5print(d.integer) print('--- Function binding') func outer(a) func inner(b) return a+b end inner.closure.a = a return innerend 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-1endmyiter.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 = 5d.b = 7 print(d, e) print('--- Data sharing') d = {}e = [1 2 3 4 5]d.a = ed.b = e print(d) e[2]=7e[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 xend print(foo)foo.name = "bar"print(foo) func something() return iend something.closure = {i=[1, 2, 3]}print(something()) cl = something.closurecl.i:insert(0, "b")print(something()) print('--- Function body swapping') func a() return 0end func b() return 2end print(a, a())print(b, b()) print(a.stmt)print(b.stmt) temp = a.stmta.stmt = b.stmtb.stmt = temp print(a, a())print(b, b()) newbody = parse('return 4')print(newbody) a.stmt = newbodyb.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 + 7end 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.stdoutio.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 endend print('---') for i in l do if i%2 == 0 then continue end print(i)end print('--- All done!')```