├── 10 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── errors.go │ ├── eval.go │ ├── object.go │ └── scope.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── 11 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── errors.go │ ├── eval.go │ ├── object.go │ └── scope.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── 12 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── builtin.go │ ├── errors.go │ ├── eval.go │ ├── object.go │ └── scope.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── 13 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── builtin.go │ ├── errors.go │ ├── eval.go │ ├── object.go │ └── scope.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── 14 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── builtin.go │ ├── errors.go │ ├── eval.go │ ├── object.go │ └── scope.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── 15 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── builtin.go │ ├── errors.go │ ├── eval.go │ ├── object.go │ └── scope.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── 16 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── builtin.go │ ├── errors.go │ ├── eval.go │ ├── object.go │ └── scope.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── 17 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── builtin.go │ ├── errors.go │ ├── eval.go │ ├── object.go │ └── scope.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── 18 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── builtin.go │ ├── errors.go │ ├── eval.go │ ├── object.go │ └── scope.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── 19 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── builtin.go │ ├── errors.go │ ├── eval.go │ ├── object.go │ └── scope.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── 20 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── builtin.go │ ├── errors.go │ ├── eval.go │ ├── object.go │ └── scope.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── 21 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── builtin.go │ ├── errors.go │ ├── eval.go │ ├── object.go │ └── scope.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── 22 ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── object.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go ├── tinyrun_wasm.sh └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 23 ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── object.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 24 ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── object.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 25 ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── object.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 26 ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── object.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 27 ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── object.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 28 ├── examples │ └── sub_package │ │ └── calc.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── object.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 29 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── control_flow.mp │ ├── function.mp │ ├── import.mp │ ├── sub_package │ │ └── calc.mp │ └── sub_package2 │ │ └── calc.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── object.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 30 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── control_flow.mp │ ├── function.mp │ ├── import.mp │ ├── regexp.mp │ ├── sub_package │ │ └── calc.mp │ └── sub_package2 │ │ └── calc.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── object.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 31 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── control_flow.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── regexp.mp │ ├── sub_package │ │ └── calc.mp │ └── sub_package2 │ │ └── calc.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── goobject.go │ │ ├── object.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 32 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── control_flow.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── regexp.mp │ ├── sub_package │ │ └── calc.mp │ └── sub_package2 │ │ └── calc.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── goobject.go │ │ ├── object.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 33 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── control_flow.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── regexp.mp │ ├── sub_package │ │ └── calc.mp │ └── sub_package2 │ │ └── calc.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 34 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── control_flow.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── os.mp │ ├── regexp.mp │ ├── sub_package │ │ └── calc.mp │ └── sub_package2 │ │ └── calc.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 35 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── control_flow.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── os.mp │ ├── regexp.mp │ ├── struct.mp │ ├── struct2.mp │ ├── struct3.mp │ ├── sub_package │ │ └── calc.mp │ └── sub_package2 │ │ └── calc.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 36 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── control_flow.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── os.mp │ ├── regexp.mp │ ├── struct.mp │ ├── struct2.mp │ ├── struct3.mp │ ├── sub_package │ │ └── calc.mp │ ├── sub_package2 │ │ └── calc.mp │ └── switch.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 37 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── control_flow.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── os.mp │ ├── regexp.mp │ ├── struct.mp │ ├── struct2.mp │ ├── struct3.mp │ ├── sub_package │ │ └── calc.mp │ ├── sub_package2 │ │ └── calc.mp │ ├── switch.mp │ ├── try.mp │ ├── try2.mp │ └── try3.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 38 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── control_flow.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── os.mp │ ├── regexp.mp │ ├── struct.mp │ ├── struct2.mp │ ├── struct3.mp │ ├── sub_package │ │ └── calc.mp │ ├── sub_package2 │ │ └── calc.mp │ ├── switch.mp │ ├── try.mp │ ├── try2.mp │ └── try3.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 39 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── basic2.mp │ ├── control_flow.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── os.mp │ ├── regexp.mp │ ├── struct.mp │ ├── struct2.mp │ ├── struct3.mp │ ├── sub_package │ │ └── calc.mp │ ├── sub_package2 │ │ └── calc.mp │ ├── switch.mp │ ├── try.mp │ ├── try2.mp │ └── try3.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 40 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── basic2.mp │ ├── control_flow.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── os.mp │ ├── regexp.mp │ ├── struct.mp │ ├── struct2.mp │ ├── struct3.mp │ ├── sub_package │ │ └── calc.mp │ ├── sub_package2 │ │ └── calc.mp │ ├── switch.mp │ ├── try.mp │ ├── try2.mp │ └── try3.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 41 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── basic2.mp │ ├── control_flow.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── os.mp │ ├── regexp.mp │ ├── struct.mp │ ├── struct2.mp │ ├── struct3.mp │ ├── sub_package │ │ └── calc.mp │ ├── sub_package2 │ │ └── calc.mp │ ├── switch.mp │ ├── try.mp │ ├── try2.mp │ └── try3.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 42 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── basic2.mp │ ├── control_flow.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── linq.mp │ ├── linq │ │ └── linq.mp │ ├── linq_demo.mp │ ├── misc.mp │ ├── os.mp │ ├── regexp.mp │ ├── struct.mp │ ├── struct2.mp │ ├── struct3.mp │ ├── struct5.mp │ ├── sub_package │ │ └── calc.mp │ ├── sub_package2 │ │ └── calc.mp │ ├── switch.mp │ ├── try.mp │ ├── try2.mp │ ├── try3.mp │ └── varargs.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 43 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── basic2.mp │ ├── compound_assign_operators.mp │ ├── control_flow.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── linq │ │ └── linq.mp │ ├── linq_demo.mp │ ├── misc.mp │ ├── os.mp │ ├── other2.mp │ ├── regexp.mp │ ├── struct.mp │ ├── struct2.mp │ ├── struct3.mp │ ├── struct4.mp │ ├── struct5.mp │ ├── sub_package │ │ └── calc.mp │ ├── sub_package2 │ │ └── calc.mp │ ├── switch.mp │ ├── try.mp │ ├── try2.mp │ ├── try3.mp │ └── varargs.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 44 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── basic2.mp │ ├── compound_assign_operators.mp │ ├── control_flow.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── linq │ │ └── linq.mp │ ├── linq_demo.mp │ ├── misc.mp │ ├── multi_assign.mp │ ├── os.mp │ ├── regexp.mp │ ├── struct.mp │ ├── struct2.mp │ ├── struct3.mp │ ├── struct4.mp │ ├── struct5.mp │ ├── sub_package │ │ └── calc.mp │ ├── sub_package2 │ │ └── calc.mp │ ├── switch.mp │ ├── tco.mp │ ├── try.mp │ ├── try2.mp │ ├── try3.mp │ └── varargs.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 45 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── basic2.mp │ ├── compound_assign_operators.mp │ ├── control_flow.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── linq │ │ └── linq.mp │ ├── linq_demo.mp │ ├── misc.mp │ ├── multi_assign.mp │ ├── os.mp │ ├── regexp.mp │ ├── struct.mp │ ├── struct2.mp │ ├── struct3.mp │ ├── struct4.mp │ ├── struct5.mp │ ├── sub_package │ │ └── calc.mp │ ├── sub_package2 │ │ └── calc.mp │ ├── switch.mp │ ├── tco.mp │ ├── try.mp │ ├── try2.mp │ ├── try3.mp │ └── varargs.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 46 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── basic2.mp │ ├── compound_assign_operators.mp │ ├── control_flow.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── interpolateString.mp │ ├── linq │ │ └── linq.mp │ ├── linq_demo.mp │ ├── misc.mp │ ├── multi_assign.mp │ ├── os.mp │ ├── other.mp │ ├── regexp.mp │ ├── struct.mp │ ├── struct2.mp │ ├── struct3.mp │ ├── struct4.mp │ ├── struct5.mp │ ├── sub_package │ │ └── calc.mp │ ├── sub_package2 │ │ └── calc.mp │ ├── switch.mp │ ├── tco.mp │ ├── try.mp │ ├── try2.mp │ ├── try3.mp │ └── varargs.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 47 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── basic2.mp │ ├── compound_assign_operators.mp │ ├── control_flow.mp │ ├── decorator.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── interpolateString.mp │ ├── linq │ │ └── linq.mp │ ├── linq_demo.mp │ ├── misc.mp │ ├── multi_assign.mp │ ├── os.mp │ ├── regexp.mp │ ├── struct.mp │ ├── struct2.mp │ ├── struct3.mp │ ├── struct4.mp │ ├── struct5.mp │ ├── sub_package │ │ └── calc.mp │ ├── sub_package2 │ │ └── calc.mp │ ├── switch.mp │ ├── tco.mp │ ├── try.mp │ ├── try2.mp │ ├── try3.mp │ └── varargs.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 48 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── basic2.mp │ ├── cmd.mp │ ├── compound_assign_operators.mp │ ├── control_flow.mp │ ├── decorator.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── interpolateString.mp │ ├── linq │ │ └── linq.mp │ ├── linq_demo.mp │ ├── misc.mp │ ├── multi_assign.mp │ ├── os.mp │ ├── regexp.mp │ ├── struct.mp │ ├── struct2.mp │ ├── struct3.mp │ ├── struct4.mp │ ├── struct5.mp │ ├── sub_package │ │ └── calc.mp │ ├── sub_package2 │ │ └── calc.mp │ ├── switch.mp │ ├── tco.mp │ ├── try.mp │ ├── try2.mp │ ├── try3.mp │ └── varargs.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 49 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── basic2.mp │ ├── cmd.mp │ ├── compound_assign_operators.mp │ ├── control_flow.mp │ ├── decorator.mp │ ├── enhanchedHash.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── interpolateString.mp │ ├── linq │ │ └── linq.mp │ ├── linq_demo.mp │ ├── misc.mp │ ├── multi_assign.mp │ ├── os.mp │ ├── regexp.mp │ ├── struct.mp │ ├── struct2.mp │ ├── struct3.mp │ ├── struct4.mp │ ├── struct5.mp │ ├── sub_package │ │ └── calc.mp │ ├── sub_package2 │ │ └── calc.mp │ ├── switch.mp │ ├── tco.mp │ ├── try.mp │ ├── try2.mp │ ├── try3.mp │ └── varargs.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 50 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── basic2.mp │ ├── cmd.mp │ ├── compound_assign_operators.mp │ ├── control_flow.mp │ ├── decorator.mp │ ├── enhanchedHash.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── interpolateString.mp │ ├── linq │ │ └── linq.mp │ ├── linq_demo.mp │ ├── misc.mp │ ├── multi_assign.mp │ ├── os.mp │ ├── pipe.mp │ ├── regexp.mp │ ├── struct.mp │ ├── struct2.mp │ ├── struct3.mp │ ├── struct4.mp │ ├── struct5.mp │ ├── sub_package │ │ └── calc.mp │ ├── sub_package2 │ │ └── calc.mp │ ├── switch.mp │ ├── tco.mp │ ├── try.mp │ ├── try2.mp │ ├── try3.mp │ └── varargs.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 51 ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── basic2.mp │ ├── cmd.mp │ ├── compound_assign_operators.mp │ ├── control_flow.mp │ ├── decorator.mp │ ├── enhanchedHash.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── interpolateString.mp │ ├── linq │ │ └── linq.mp │ ├── linq_demo.mp │ ├── misc.mp │ ├── multi_assign.mp │ ├── orderedhash.mp │ ├── os.mp │ ├── pipe.mp │ ├── regexp.mp │ ├── struct.mp │ ├── struct2.mp │ ├── struct3.mp │ ├── struct4.mp │ ├── struct5.mp │ ├── sub_package │ │ └── calc.mp │ ├── sub_package2 │ │ └── calc.mp │ ├── switch.mp │ ├── tco.mp │ ├── try.mp │ ├── try2.mp │ ├── try3.mp │ └── varargs.mp ├── main.go ├── readme.txt ├── run.sh ├── run_wasm.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 52 ├── embed │ ├── attachments.json │ ├── embedder.exe │ └── linq │ │ └── linq.mp ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── basic2.mp │ ├── cmd.mp │ ├── compound_assign_operators.mp │ ├── control_flow.mp │ ├── decorator.mp │ ├── enhanchedHash.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── interpolateString.mp │ ├── linq │ │ └── linq.mp │ ├── linq_demo.mp │ ├── misc.mp │ ├── multi_assign.mp │ ├── orderedhash.mp │ ├── os.mp │ ├── pipe.mp │ ├── regexp.mp │ ├── struct.mp │ ├── struct2.mp │ ├── struct3.mp │ ├── struct4.mp │ ├── struct5.mp │ ├── sub_package │ │ └── calc.mp │ ├── switch.mp │ ├── tco.mp │ ├── try.mp │ ├── try2.mp │ ├── try3.mp │ └── varargs.mp ├── main.go ├── readme.txt ├── run.sh ├── run_embed.sh ├── run_wasm.sh ├── src │ ├── github.com │ │ └── maja42 │ │ │ └── ember │ │ │ ├── LICENSE │ │ │ ├── attachement.go │ │ │ ├── cmd │ │ │ └── embedder │ │ │ │ └── embedder.go │ │ │ ├── embedding │ │ │ └── embedding.go │ │ │ ├── errors.go │ │ │ ├── go.mod │ │ │ ├── go.sum │ │ │ ├── internal │ │ │ ├── boundary.go │ │ │ └── toc.go │ │ │ └── marker.go │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 53 ├── embed │ ├── attachments.json │ ├── embedder.exe │ ├── linq │ │ └── linq.mp │ └── linq_demo.mp ├── examples │ ├── Cfor.mp │ ├── basic.mp │ ├── basic2.mp │ ├── cmd.mp │ ├── compound_assign_operators.mp │ ├── control_flow.mp │ ├── decorator.mp │ ├── enhanchedHash.mp │ ├── file.mp │ ├── function.mp │ ├── goObj.mp │ ├── import.mp │ ├── interpolateString.mp │ ├── linq_demo.mp │ ├── misc.mp │ ├── multi_assign.mp │ ├── orderedhash.mp │ ├── os.mp │ ├── pipe.mp │ ├── regexp.mp │ ├── std_demo.mp │ ├── struct.mp │ ├── struct2.mp │ ├── struct3.mp │ ├── struct4.mp │ ├── struct5.mp │ ├── sub_package │ │ └── calc.mp │ ├── switch.mp │ ├── tco.mp │ ├── try.mp │ ├── try2.mp │ ├── try3.mp │ └── varargs.mp ├── main.go ├── readme.txt ├── run.sh ├── run_embed.sh ├── run_wasm.sh ├── src │ ├── github.com │ │ └── maja42 │ │ │ └── ember │ │ │ ├── LICENSE │ │ │ ├── attachement.go │ │ │ ├── cmd │ │ │ └── embedder │ │ │ │ └── embedder.go │ │ │ ├── embedding │ │ │ └── embedding.go │ │ │ ├── errors.go │ │ │ ├── go.mod │ │ │ ├── go.sum │ │ │ ├── internal │ │ │ ├── boundary.go │ │ │ └── toc.go │ │ │ └── marker.go │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── builtin.go │ │ ├── errors.go │ │ ├── eval.go │ │ ├── file.go │ │ ├── goobject.go │ │ ├── object.go │ │ ├── os.go │ │ └── scope.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ ├── lib │ │ │ ├── linq.mp │ │ │ └── str.mp │ │ └── parser.go │ │ └── token │ │ └── token.go └── wasm │ ├── README.md │ ├── assets │ ├── index.html │ └── wasm_exec.js │ └── cmd │ ├── server │ └── main.go │ └── wasm │ └── main.go ├── 01 ├── main.go ├── readme.txt ├── run.sh ├── src │ └── magpie │ │ ├── ast │ │ └── ast.go │ │ ├── eval │ │ ├── eval.go │ │ └── object.go │ │ ├── lexer │ │ └── lexer.go │ │ ├── parser │ │ └── parser.go │ │ └── token │ │ └── token.go └── tiny_run.sh ├── 02 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── eval.go │ └── object.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── 03 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── eval.go │ └── object.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── 04 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── eval.go │ └── object.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── 05 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── eval.go │ ├── object.go │ └── scope.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── 06 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── eval.go │ ├── object.go │ └── scope.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── 07 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── errors.go │ ├── eval.go │ ├── object.go │ └── scope.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── 08 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── errors.go │ ├── eval.go │ ├── object.go │ └── scope.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── 09 ├── main.go ├── readme.txt ├── run.sh └── src │ └── magpie │ ├── ast │ └── ast.go │ ├── eval │ ├── errors.go │ ├── eval.go │ ├── object.go │ └── scope.go │ ├── lexer │ └── lexer.go │ ├── parser │ └── parser.go │ └── token │ └── token.go ├── LICENSE ├── doc ├── 10 │ └── readme10.md ├── 11 │ └── readme11.md ├── 12 │ └── readme12.md ├── 13 │ └── readme13.md ├── 14 │ └── readme14.md ├── 15 │ └── readme15.md ├── 16 │ └── readme16.md ├── 17 │ └── readme17.md ├── 18 │ └── readme18.md ├── 19 │ └── readme19.md ├── 20 │ └── readme20.md ├── 21 │ └── readme21.md ├── 22 │ ├── ScreenHunter 45.png │ ├── html.png │ ├── readme22.md │ ├── webAssembly1.png │ └── webAssembly2.png ├── 23 │ └── readme23.md ├── 24 │ └── readme24.md ├── 25 │ └── readme25.md ├── 26 │ ├── format0.png │ ├── formatter1.png │ ├── formatter2.png │ ├── printf.png │ └── readme26.md ├── 27 │ └── readme27.md ├── 28 │ └── readme28.md ├── 29 │ └── readme29.md ├── 30 │ └── readme30.md ├── 31 │ ├── go_magpie.png │ └── readme31.md ├── 32 │ └── readme32.md ├── 33 │ └── readme33.md ├── 34 │ └── readme34.md ├── 35 │ └── readme35.md ├── 36 │ └── readme36.md ├── 37 │ └── readme37.md ├── 38 │ └── readme38.md ├── 39 │ └── readme39.md ├── 40 │ ├── in_operator.png │ └── readme40.md ├── 41 │ ├── dot_operator.png │ └── readme41.md ├── 42 │ └── readme42.md ├── 43 │ └── readme43.md ├── 44 │ └── readme44.md ├── 45 │ └── readme45.md ├── 46 │ └── readme46.md ├── 47 │ └── readme47.md ├── 48 │ └── readme48.md ├── 49 │ └── readme49.md ├── 50 │ └── readme50.md ├── 51 │ └── readme51.md ├── 52 │ └── readme52.md ├── 53 │ └── readme53.md ├── 01 │ ├── AST.png │ ├── AST2.png │ ├── expr_func_map.png │ ├── language-flow.png │ ├── readme1.html │ ├── readme1.md │ └── token.png ├── 02 │ └── readme2.md ├── 03 │ └── readme3.md ├── 04 │ └── readme4.md ├── 05 │ └── readme5.md ├── 06 │ └── readme6.md ├── 07 │ └── readme7.md ├── 08 │ └── readme8.md ├── 09 │ └── readme9.md └── 序言.md ├── readme.md ├── run.sh ├── run_clean.sh └── run_format.sh /01/readme.txt: -------------------------------------------------------------------------------- 1 | Simple Math Expression Evaluation -------------------------------------------------------------------------------- /01/src/magpie/eval/object.go: -------------------------------------------------------------------------------- 1 | package eval 2 | 3 | import ( 4 | "fmt" 5 | ) 6 | 7 | //object 8 | type ObjectType string 9 | 10 | const ( 11 | NUMBER_OBJ = "NUMBER" 12 | ) 13 | 14 | type Object interface { 15 | Type() ObjectType 16 | Inspect() string 17 | } 18 | 19 | type Number struct { 20 | Value float64 21 | } 22 | 23 | func (n *Number) Inspect() string { 24 | return fmt.Sprintf("%g", n.Value) 25 | } 26 | 27 | func (n *Number) Type() ObjectType { return NUMBER_OBJ } 28 | 29 | func NewNumber(f float64) *Number { 30 | return &Number{Value: f} 31 | } 32 | -------------------------------------------------------------------------------- /01/tiny_run.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | interpreter_name=magpie 8 | 9 | tinygo build -o magpie.exe main.go 10 | -------------------------------------------------------------------------------- /02/readme.txt: -------------------------------------------------------------------------------- 1 | Add Identifier for lexer & parser -------------------------------------------------------------------------------- /02/src/magpie/eval/object.go: -------------------------------------------------------------------------------- 1 | package eval 2 | 3 | import ( 4 | "fmt" 5 | ) 6 | 7 | //object 8 | type ObjectType string 9 | 10 | const ( 11 | NUMBER_OBJ = "NUMBER" 12 | ) 13 | 14 | type Object interface { 15 | Type() ObjectType 16 | Inspect() string 17 | } 18 | 19 | type Number struct { 20 | Value float64 21 | } 22 | 23 | func (n *Number) Inspect() string { 24 | return fmt.Sprintf("%g", n.Value) 25 | } 26 | 27 | func (n *Number) Type() ObjectType { return NUMBER_OBJ } 28 | 29 | func NewNumber(f float64) *Number { 30 | return &Number{Value: f} 31 | } 32 | -------------------------------------------------------------------------------- /03/readme.txt: -------------------------------------------------------------------------------- 1 | Add evaluation for 'true, false, nil' -------------------------------------------------------------------------------- /04/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'let' statement -------------------------------------------------------------------------------- /05/readme.txt: -------------------------------------------------------------------------------- 1 | Add scope -------------------------------------------------------------------------------- /06/readme.txt: -------------------------------------------------------------------------------- 1 | Add logic for evaluate 'letStatement' & 'identifier expression' -------------------------------------------------------------------------------- /07/readme.txt: -------------------------------------------------------------------------------- 1 | Add error handling for evaluation phase -------------------------------------------------------------------------------- /08/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'return statement' -------------------------------------------------------------------------------- /09/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'block statement' -------------------------------------------------------------------------------- /10/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'String' handling -------------------------------------------------------------------------------- /11/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'function literal' & 'function call' handling -------------------------------------------------------------------------------- /12/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'builtin function' support -------------------------------------------------------------------------------- /13/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'if-else' expression support -------------------------------------------------------------------------------- /14/readme.txt: -------------------------------------------------------------------------------- 1 | Add '!' support -------------------------------------------------------------------------------- /15/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'array' & 'array index' support -------------------------------------------------------------------------------- /16/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'Hash' support -------------------------------------------------------------------------------- /17/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'method-call' support -------------------------------------------------------------------------------- /18/readme.txt: -------------------------------------------------------------------------------- 1 | Add loop support(1) 2 | Add loop support(1-2) -------------------------------------------------------------------------------- /19/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'assignment' support -------------------------------------------------------------------------------- /20/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'tuple' support -------------------------------------------------------------------------------- /21/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'named function' support -------------------------------------------------------------------------------- /22/readme.txt: -------------------------------------------------------------------------------- 1 | Add wasm support -------------------------------------------------------------------------------- /22/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /22/tinyrun_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | export GO111MODULE=off 5 | 6 | olddir=$(pwd) 7 | # build-wasm 8 | cd wasm/cmd/wasm 9 | echo "Building wasm..." 10 | tinygo build -o ../../assets/magpie.wasm -target wasm ./main.go 11 | 12 | # run server 13 | cd ../server 14 | echo "Running server..." 15 | echo " Now open the browser, and type 'http://localhost:9090'" 16 | tinygo run main.go 17 | 18 | 19 | -------------------------------------------------------------------------------- /22/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /23/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'for loop' support -------------------------------------------------------------------------------- /23/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /23/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /24/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'do & while' loop support -------------------------------------------------------------------------------- /24/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /24/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /25/readme.txt: -------------------------------------------------------------------------------- 1 | Add multiple assignment & return-values -------------------------------------------------------------------------------- /25/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /25/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /26/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'printf' builtin support -------------------------------------------------------------------------------- /26/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /26/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /27/readme.txt: -------------------------------------------------------------------------------- 1 | Add '&&' and '||' support -------------------------------------------------------------------------------- /27/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /27/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /28/examples/sub_package/calc.mp: -------------------------------------------------------------------------------- 1 | fn _add(x, y) { 2 | return x + y 3 | } 4 | 5 | fn Add(x, y) { 6 | return _add(x, y) 7 | } 8 | 9 | fn Minus (x, y ) { 10 | return x - y 11 | } 12 | 13 | fn Add_and_Minus(x, y) { 14 | return x + y, x - y 15 | } 16 | 17 | fn multiply(x, y) { 18 | return x * y 19 | } 20 | -------------------------------------------------------------------------------- /28/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'import' statement -------------------------------------------------------------------------------- /28/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /28/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /29/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /29/examples/function.mp: -------------------------------------------------------------------------------- 1 | #function statement 2 | fn addFunc(x,y) { 3 | return x+ y 4 | } 5 | println(addFunc(2,3)) 6 | 7 | #function literal 8 | sumFunc = fn(x,y) { 9 | return x+ y 10 | } 11 | println(sumFunc(2,3)) 12 | 13 | ##function literal with direct call 14 | sumResult = fn(x,y) { return x+ y }(2,3) 15 | println(sumResult) 16 | 17 | #function with multiple return value 18 | fn math(x, y) { 19 | return x+y, x-y 20 | } 21 | a, b = math(5,3) 22 | printf("a=%g, b=%g\n", a, b) 23 | 24 | fn math2(x, y){ 25 | return x+y, x-y, x * y 26 | } 27 | a, _, c = math2(5,3) 28 | printf("a=%g, c=%g\n", a, c) -------------------------------------------------------------------------------- /29/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | # error, '_add' not exported 6 | # println(_add(2,3)) 7 | -------------------------------------------------------------------------------- /29/examples/sub_package/calc.mp: -------------------------------------------------------------------------------- 1 | #Identifiers and functions which have their first 2 | #letter 'Uppercased' will be exported. 3 | 4 | #not exported, the first letter is not Uppercase. 5 | fn _add(x, y) { 6 | return x + y 7 | } 8 | #exported 9 | fn Add(x, y) { 10 | return _add(x, y) 11 | } 12 | 13 | #exported 14 | fn Minus(x, y) { 15 | return x - y 16 | } 17 | 18 | #exported 19 | fn Add_and_Minus(x,y) { 20 | return x + y, x - y 21 | } 22 | 23 | #not exported, the first letter is not Uppercase. 24 | fn multiply(x, y) { 25 | return x * y 26 | } 27 | -------------------------------------------------------------------------------- /29/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /29/readme.txt: -------------------------------------------------------------------------------- 1 | Add example files & change main file 2 | Add comment support -------------------------------------------------------------------------------- /29/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /29/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /30/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /30/examples/function.mp: -------------------------------------------------------------------------------- 1 | #function statement 2 | fn addFunc(x,y) { 3 | return x+ y 4 | } 5 | println(addFunc(2,3)) 6 | 7 | #function literal 8 | sumFunc = fn(x,y) { 9 | return x+ y 10 | } 11 | println(sumFunc(2,3)) 12 | 13 | ##function literal with direct call 14 | sumResult = fn(x,y) { return x+ y }(2,3) 15 | println(sumResult) 16 | 17 | #function with multiple return value 18 | fn math(x, y) { 19 | return x+y, x-y 20 | } 21 | a, b = math(5,3) 22 | printf("a=%g, b=%g\n", a, b) 23 | 24 | fn math2(x, y){ 25 | return x+y, x-y, x * y 26 | } 27 | a, _, c = math2(5,3) 28 | printf("a=%g, c=%g\n", a, c) -------------------------------------------------------------------------------- /30/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | # error, '_add' not exported 6 | # println(_add(2,3)) 7 | -------------------------------------------------------------------------------- /30/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /30/examples/sub_package/calc.mp: -------------------------------------------------------------------------------- 1 | #Identifiers and functions which have their first 2 | #letter 'Uppercased' will be exported. 3 | 4 | #not exported, the first letter is not Uppercase. 5 | fn _add(x, y) { 6 | return x + y 7 | } 8 | #exported 9 | fn Add(x, y) { 10 | return _add(x, y) 11 | } 12 | 13 | #exported 14 | fn Minus(x, y) { 15 | return x - y 16 | } 17 | 18 | #exported 19 | fn Add_and_Minus(x,y) { 20 | return x + y, x - y 21 | } 22 | 23 | #not exported, the first letter is not Uppercase. 24 | fn multiply(x, y) { 25 | return x * y 26 | } 27 | -------------------------------------------------------------------------------- /30/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /30/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'regular-expression' support -------------------------------------------------------------------------------- /30/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /30/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /31/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /31/examples/function.mp: -------------------------------------------------------------------------------- 1 | #function statement 2 | fn addFunc(x,y) { 3 | return x+ y 4 | } 5 | println(addFunc(2,3)) 6 | 7 | #function literal 8 | sumFunc = fn(x,y) { 9 | return x+ y 10 | } 11 | println(sumFunc(2,3)) 12 | 13 | ##function literal with direct call 14 | sumResult = fn(x,y) { return x+ y }(2,3) 15 | println(sumResult) 16 | 17 | #function with multiple return value 18 | fn math(x, y) { 19 | return x+y, x-y 20 | } 21 | a, b = math(5,3) 22 | printf("a=%g, b=%g\n", a, b) 23 | 24 | fn math2(x, y){ 25 | return x+y, x-y, x * y 26 | } 27 | a, _, c = math2(5,3) 28 | printf("a=%g, c=%g\n", a, c) -------------------------------------------------------------------------------- /31/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /31/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | # error, '_add' not exported 6 | # println(_add(2,3)) 7 | -------------------------------------------------------------------------------- /31/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /31/examples/sub_package/calc.mp: -------------------------------------------------------------------------------- 1 | #Identifiers and functions which have their first 2 | #letter 'Uppercased' will be exported. 3 | 4 | #not exported, the first letter is not Uppercase. 5 | fn _add(x, y) { 6 | return x + y 7 | } 8 | #exported 9 | fn Add(x, y) { 10 | return _add(x, y) 11 | } 12 | 13 | #exported 14 | fn Minus(x, y) { 15 | return x - y 16 | } 17 | 18 | #exported 19 | fn Add_and_Minus(x,y) { 20 | return x + y, x - y 21 | } 22 | 23 | #not exported, the first letter is not Uppercase. 24 | fn multiply(x, y) { 25 | return x * y 26 | } 27 | -------------------------------------------------------------------------------- /31/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /31/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'goObj' support -------------------------------------------------------------------------------- /31/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /31/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /32/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /32/examples/function.mp: -------------------------------------------------------------------------------- 1 | #function statement 2 | fn addFunc(x,y) { 3 | return x+ y 4 | } 5 | println(addFunc(2,3)) 6 | 7 | #function literal 8 | sumFunc = fn(x,y) { 9 | return x+ y 10 | } 11 | println(sumFunc(2,3)) 12 | 13 | ##function literal with direct call 14 | sumResult = fn(x,y) { return x+ y }(2,3) 15 | println(sumResult) 16 | 17 | #function with multiple return value 18 | fn math(x, y) { 19 | return x+y, x-y 20 | } 21 | a, b = math(5,3) 22 | printf("a=%g, b=%g\n", a, b) 23 | 24 | fn math2(x, y){ 25 | return x+y, x-y, x * y 26 | } 27 | a, _, c = math2(5,3) 28 | printf("a=%g, c=%g\n", a, c) -------------------------------------------------------------------------------- /32/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /32/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | # error, '_add' not exported 6 | # println(_add(2,3)) 7 | -------------------------------------------------------------------------------- /32/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /32/examples/sub_package/calc.mp: -------------------------------------------------------------------------------- 1 | #Identifiers and functions which have their first 2 | #letter 'Uppercased' will be exported. 3 | 4 | #not exported, the first letter is not Uppercase. 5 | fn _add(x, y) { 6 | return x + y 7 | } 8 | #exported 9 | fn Add(x, y) { 10 | return _add(x, y) 11 | } 12 | 13 | #exported 14 | fn Minus(x, y) { 15 | return x - y 16 | } 17 | 18 | #exported 19 | fn Add_and_Minus(x,y) { 20 | return x + y, x - y 21 | } 22 | 23 | #not exported, the first letter is not Uppercase. 24 | fn multiply(x, y) { 25 | return x * y 26 | } 27 | -------------------------------------------------------------------------------- /32/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /32/readme.txt: -------------------------------------------------------------------------------- 1 | Panic, panic, panic... -------------------------------------------------------------------------------- /32/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /32/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /33/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /33/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | } else { 5 | file.writeLine("This is the first line") 6 | file.writeLine("This is the second line") 7 | file.writeString("这是第三行\n") 8 | file.close() 9 | } 10 | 11 | printf("=====Reading file=====\n") 12 | file, err = open("./file.log", "r") 13 | if err { 14 | println(err) 15 | } else { 16 | println(file.readLine()) 17 | println(file.readLine()) 18 | println(file.readLine()) 19 | file.close() 20 | } 21 | 22 | 23 | # stdin, stdout 24 | print("Please type your name:") 25 | name = stdin.readLine() 26 | stdout.writeLine("Hello " + name + "!") 27 | -------------------------------------------------------------------------------- /33/examples/function.mp: -------------------------------------------------------------------------------- 1 | #function statement 2 | fn addFunc(x,y) { 3 | return x+ y 4 | } 5 | println(addFunc(2,3)) 6 | 7 | #function literal 8 | sumFunc = fn(x,y) { 9 | return x+ y 10 | } 11 | println(sumFunc(2,3)) 12 | 13 | ##function literal with direct call 14 | sumResult = fn(x,y) { return x+ y }(2,3) 15 | println(sumResult) 16 | 17 | #function with multiple return value 18 | fn math(x, y) { 19 | return x+y, x-y 20 | } 21 | a, b = math(5,3) 22 | printf("a=%g, b=%g\n", a, b) 23 | 24 | fn math2(x, y){ 25 | return x+y, x-y, x * y 26 | } 27 | a, _, c = math2(5,3) 28 | printf("a=%g, c=%g\n", a, c) -------------------------------------------------------------------------------- /33/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /33/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | # error, '_add' not exported 6 | # println(_add(2,3)) 7 | -------------------------------------------------------------------------------- /33/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /33/examples/sub_package/calc.mp: -------------------------------------------------------------------------------- 1 | #Identifiers and functions which have their first 2 | #letter 'Uppercased' will be exported. 3 | 4 | #not exported, the first letter is not Uppercase. 5 | fn _add(x, y) { 6 | return x + y 7 | } 8 | #exported 9 | fn Add(x, y) { 10 | return _add(x, y) 11 | } 12 | 13 | #exported 14 | fn Minus(x, y) { 15 | return x - y 16 | } 17 | 18 | #exported 19 | fn Add_and_Minus(x,y) { 20 | return x + y, x - y 21 | } 22 | 23 | #not exported, the first letter is not Uppercase. 24 | fn multiply(x, y) { 25 | return x * y 26 | } 27 | -------------------------------------------------------------------------------- /33/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /33/readme.txt: -------------------------------------------------------------------------------- 1 | Add builtin 'file' object -------------------------------------------------------------------------------- /33/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /33/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /34/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /34/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /34/examples/function.mp: -------------------------------------------------------------------------------- 1 | #function statement 2 | fn addFunc(x,y) { 3 | return x+ y 4 | } 5 | println(addFunc(2,3)) 6 | 7 | #function literal 8 | sumFunc = fn(x,y) { 9 | return x+ y 10 | } 11 | println(sumFunc(2,3)) 12 | 13 | ##function literal with direct call 14 | sumResult = fn(x,y) { return x+ y }(2,3) 15 | println(sumResult) 16 | 17 | #function with multiple return value 18 | fn math(x, y) { 19 | return x+y, x-y 20 | } 21 | a, b = math(5,3) 22 | printf("a=%g, b=%g\n", a, b) 23 | 24 | fn math2(x, y){ 25 | return x+y, x-y, x * y 26 | } 27 | a, _, c = math2(5,3) 28 | printf("a=%g, c=%g\n", a, c) -------------------------------------------------------------------------------- /34/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /34/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | # error, '_add' not exported 6 | # println(_add(2,3)) 7 | -------------------------------------------------------------------------------- /34/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /34/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /34/examples/sub_package/calc.mp: -------------------------------------------------------------------------------- 1 | #Identifiers and functions which have their first 2 | #letter 'Uppercased' will be exported. 3 | 4 | #not exported, the first letter is not Uppercase. 5 | fn _add(x, y) { 6 | return x + y 7 | } 8 | #exported 9 | fn Add(x, y) { 10 | return _add(x, y) 11 | } 12 | 13 | #exported 14 | fn Minus(x, y) { 15 | return x - y 16 | } 17 | 18 | #exported 19 | fn Add_and_Minus(x,y) { 20 | return x + y, x - y 21 | } 22 | 23 | #not exported, the first letter is not Uppercase. 24 | fn multiply(x, y) { 25 | return x * y 26 | } 27 | -------------------------------------------------------------------------------- /34/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /34/readme.txt: -------------------------------------------------------------------------------- 1 | Add builtin 'os' object -------------------------------------------------------------------------------- /34/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /34/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /35/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /35/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /35/examples/function.mp: -------------------------------------------------------------------------------- 1 | #function statement 2 | fn addFunc(x,y) { 3 | return x+ y 4 | } 5 | println(addFunc(2,3)) 6 | 7 | #function literal 8 | sumFunc = fn(x,y) { 9 | return x+ y 10 | } 11 | println(sumFunc(2,3)) 12 | 13 | ##function literal with direct call 14 | sumResult = fn(x,y) { return x+ y }(2,3) 15 | println(sumResult) 16 | 17 | #function with multiple return value 18 | fn math(x, y) { 19 | return x+y, x-y 20 | } 21 | a, b = math(5,3) 22 | printf("a=%g, b=%g\n", a, b) 23 | 24 | fn math2(x, y){ 25 | return x+y, x-y, x * y 26 | } 27 | a, _, c = math2(5,3) 28 | printf("a=%g, c=%g\n", a, c) -------------------------------------------------------------------------------- /35/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /35/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | math = Math(2,3) 6 | printf("math.Add() = %g\n", math.Add()) 7 | 8 | printf("Math.add() = %g\n", Math(2,3).Add()) 9 | 10 | # error, '_add' not exported 11 | # println(_add(2,3)) 12 | -------------------------------------------------------------------------------- /35/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /35/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /35/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /35/readme.txt: -------------------------------------------------------------------------------- 1 | Add struct support -------------------------------------------------------------------------------- /35/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /35/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /36/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /36/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /36/examples/function.mp: -------------------------------------------------------------------------------- 1 | #function statement 2 | fn addFunc(x,y) { 3 | return x+ y 4 | } 5 | println(addFunc(2,3)) 6 | 7 | #function literal 8 | sumFunc = fn(x,y) { 9 | return x+ y 10 | } 11 | println(sumFunc(2,3)) 12 | 13 | ##function literal with direct call 14 | sumResult = fn(x,y) { return x+ y }(2,3) 15 | println(sumResult) 16 | 17 | #function with multiple return value 18 | fn math(x, y) { 19 | return x+y, x-y 20 | } 21 | a, b = math(5,3) 22 | printf("a=%g, b=%g\n", a, b) 23 | 24 | fn math2(x, y){ 25 | return x+y, x-y, x * y 26 | } 27 | a, _, c = math2(5,3) 28 | printf("a=%g, c=%g\n", a, c) -------------------------------------------------------------------------------- /36/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /36/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | math = Math(2,3) 6 | printf("math.Add() = %g\n", math.Add()) 7 | 8 | printf("Math.add() = %g\n", Math(2,3).Add()) 9 | 10 | # error, '_add' not exported 11 | # println(_add(2,3)) 12 | -------------------------------------------------------------------------------- /36/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /36/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /36/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /36/examples/switch.mp: -------------------------------------------------------------------------------- 1 | fn switchTest(name ) { 2 | switch name { 3 | case "welcome" { 4 | printf("Matched welcome: literal\n"); 5 | } 6 | case /^Welcome$/ , /^WELCOME$/i { 7 | printf("Matched welcome: regular-expression\n"); 8 | } 9 | case "Huang" + "HaiFeng" { 10 | printf("Matched HuangHaiFeng\n" ); 11 | } 12 | case 3, 6, 9 { 13 | printf("Matched Number %d\n", name); 14 | } 15 | default { 16 | printf("Default case: %v\n", name ); 17 | } 18 | } 19 | } 20 | 21 | switchTest( "welcome" ); 22 | switchTest( "WelCOME" ); 23 | switchTest( "HuangHaiFeng" ); 24 | switchTest( 3 ); 25 | switchTest( "Bob" ); 26 | switchTest( false ); -------------------------------------------------------------------------------- /36/readme.txt: -------------------------------------------------------------------------------- 1 | Add switch support -------------------------------------------------------------------------------- /36/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /36/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /37/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /37/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /37/examples/function.mp: -------------------------------------------------------------------------------- 1 | #function statement 2 | fn addFunc(x,y) { 3 | return x+ y 4 | } 5 | println(addFunc(2,3)) 6 | 7 | #function literal 8 | sumFunc = fn(x,y) { 9 | return x+ y 10 | } 11 | println(sumFunc(2,3)) 12 | 13 | ##function literal with direct call 14 | sumResult = fn(x,y) { return x+ y }(2,3) 15 | println(sumResult) 16 | 17 | #function with multiple return value 18 | fn math(x, y) { 19 | return x+y, x-y 20 | } 21 | a, b = math(5,3) 22 | printf("a=%g, b=%g\n", a, b) 23 | 24 | fn math2(x, y){ 25 | return x+y, x-y, x * y 26 | } 27 | a, _, c = math2(5,3) 28 | printf("a=%g, c=%g\n", a, c) -------------------------------------------------------------------------------- /37/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /37/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | math = Math(2,3) 6 | printf("math.Add() = %g\n", math.Add()) 7 | 8 | printf("Math.add() = %g\n", Math(2,3).Add()) 9 | 10 | # error, '_add' not exported 11 | # println(_add(2,3)) 12 | -------------------------------------------------------------------------------- /37/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /37/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /37/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /37/examples/switch.mp: -------------------------------------------------------------------------------- 1 | fn switchTest(name ) { 2 | switch name { 3 | case "welcome" { 4 | printf("Matched welcome: literal\n"); 5 | } 6 | case /^Welcome$/ , /^WELCOME$/i { 7 | printf("Matched welcome: regular-expression\n"); 8 | } 9 | case "Huang" + "HaiFeng" { 10 | printf("Matched HuangHaiFeng\n" ); 11 | } 12 | case 3, 6, 9 { 13 | printf("Matched Number %d\n", name); 14 | } 15 | default { 16 | printf("Default case: %v\n", name ); 17 | } 18 | } 19 | } 20 | 21 | switchTest( "welcome" ); 22 | switchTest( "WelCOME" ); 23 | switchTest( "HuangHaiFeng" ); 24 | switchTest( 3 ); 25 | switchTest( "Bob" ); 26 | switchTest( false ); -------------------------------------------------------------------------------- /37/examples/try2.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | } -------------------------------------------------------------------------------- /37/examples/try3.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | try { 11 | throw [1,2,3] 12 | } catch ex { 13 | printf("ex=%s\n", ex) 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /37/readme.txt: -------------------------------------------------------------------------------- 1 | Add try-catch-finally support -------------------------------------------------------------------------------- /37/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /37/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /38/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /38/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /38/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /38/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | math = Math(2,3) 6 | printf("math.Add() = %g\n", math.Add()) 7 | 8 | printf("Math.add() = %g\n", Math(2,3).Add()) 9 | 10 | # error, '_add' not exported 11 | # println(_add(2,3)) 12 | -------------------------------------------------------------------------------- /38/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /38/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /38/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /38/examples/switch.mp: -------------------------------------------------------------------------------- 1 | fn switchTest(name ) { 2 | switch name { 3 | case "welcome" { 4 | printf("Matched welcome: literal\n"); 5 | } 6 | case /^Welcome$/ , /^WELCOME$/i { 7 | printf("Matched welcome: regular-expression\n"); 8 | } 9 | case "Huang" + "HaiFeng" { 10 | printf("Matched HuangHaiFeng\n" ); 11 | } 12 | case 3, 6, 9 { 13 | printf("Matched Number %d\n", name); 14 | } 15 | default { 16 | printf("Default case: %v\n", name ); 17 | } 18 | } 19 | } 20 | 21 | switchTest( "welcome" ); 22 | switchTest( "WelCOME" ); 23 | switchTest( "HuangHaiFeng" ); 24 | switchTest( 3 ); 25 | switchTest( "Bob" ); 26 | switchTest( false ); -------------------------------------------------------------------------------- /38/examples/try2.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | } -------------------------------------------------------------------------------- /38/examples/try3.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | try { 11 | throw [1,2,3] 12 | } catch ex { 13 | printf("ex=%s\n", ex) 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /38/readme.txt: -------------------------------------------------------------------------------- 1 | Add anonymous functions(lambdas) support -------------------------------------------------------------------------------- /38/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /38/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /39/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /39/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /39/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /39/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | math = Math(2,3) 6 | printf("math.Add() = %g\n", math.Add()) 7 | 8 | printf("Math.add() = %g\n", Math(2,3).Add()) 9 | 10 | # error, '_add' not exported 11 | # println(_add(2,3)) 12 | -------------------------------------------------------------------------------- /39/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /39/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /39/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /39/examples/switch.mp: -------------------------------------------------------------------------------- 1 | fn switchTest(name ) { 2 | switch name { 3 | case "welcome" { 4 | printf("Matched welcome: literal\n"); 5 | } 6 | case /^Welcome$/ , /^WELCOME$/i { 7 | printf("Matched welcome: regular-expression\n"); 8 | } 9 | case "Huang" + "HaiFeng" { 10 | printf("Matched HuangHaiFeng\n" ); 11 | } 12 | case 3, 6, 9 { 13 | printf("Matched Number %d\n", name); 14 | } 15 | default { 16 | printf("Default case: %v\n", name ); 17 | } 18 | } 19 | } 20 | 21 | switchTest( "welcome" ); 22 | switchTest( "WelCOME" ); 23 | switchTest( "HuangHaiFeng" ); 24 | switchTest( 3 ); 25 | switchTest( "Bob" ); 26 | switchTest( false ); -------------------------------------------------------------------------------- /39/examples/try2.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | } -------------------------------------------------------------------------------- /39/examples/try3.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | try { 11 | throw [1,2,3] 12 | } catch ex { 13 | printf("ex=%s\n", ex) 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /39/readme.txt: -------------------------------------------------------------------------------- 1 | Comparison operator Chaining(a < b < c) support -------------------------------------------------------------------------------- /39/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /39/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /40/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /40/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /40/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /40/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | math = Math(2,3) 6 | printf("math.Add() = %g\n", math.Add()) 7 | 8 | printf("Math.add() = %g\n", Math(2,3).Add()) 9 | 10 | # error, '_add' not exported 11 | # println(_add(2,3)) 12 | -------------------------------------------------------------------------------- /40/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /40/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /40/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /40/examples/switch.mp: -------------------------------------------------------------------------------- 1 | fn switchTest(name ) { 2 | switch name { 3 | case "welcome" { 4 | printf("Matched welcome: literal\n"); 5 | } 6 | case /^Welcome$/ , /^WELCOME$/i { 7 | printf("Matched welcome: regular-expression\n"); 8 | } 9 | case "Huang" + "HaiFeng" { 10 | printf("Matched HuangHaiFeng\n" ); 11 | } 12 | case 3, 6, 9 { 13 | printf("Matched Number %d\n", name); 14 | } 15 | default { 16 | printf("Default case: %v\n", name ); 17 | } 18 | } 19 | } 20 | 21 | switchTest( "welcome" ); 22 | switchTest( "WelCOME" ); 23 | switchTest( "HuangHaiFeng" ); 24 | switchTest( 3 ); 25 | switchTest( "Bob" ); 26 | switchTest( false ); -------------------------------------------------------------------------------- /40/examples/try2.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | } -------------------------------------------------------------------------------- /40/examples/try3.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | try { 11 | throw [1,2,3] 12 | } catch ex { 13 | printf("ex=%s\n", ex) 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /40/readme.txt: -------------------------------------------------------------------------------- 1 | Add 'in' operator support -------------------------------------------------------------------------------- /40/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /40/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /41/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /41/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /41/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /41/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | math = Math(2,3) 6 | printf("math.Add() = %g\n", math.Add()) 7 | 8 | printf("Math.add() = %g\n", Math(2,3).Add()) 9 | 10 | # error, '_add' not exported 11 | # println(_add(2,3)) 12 | -------------------------------------------------------------------------------- /41/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /41/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /41/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /41/examples/switch.mp: -------------------------------------------------------------------------------- 1 | fn switchTest(name ) { 2 | switch name { 3 | case "welcome" { 4 | printf("Matched welcome: literal\n"); 5 | } 6 | case /^Welcome$/ , /^WELCOME$/i { 7 | printf("Matched welcome: regular-expression\n"); 8 | } 9 | case "Huang" + "HaiFeng" { 10 | printf("Matched HuangHaiFeng\n" ); 11 | } 12 | case 3, 6, 9 { 13 | printf("Matched Number %d\n", name); 14 | } 15 | default { 16 | printf("Default case: %v\n", name ); 17 | } 18 | } 19 | } 20 | 21 | switchTest( "welcome" ); 22 | switchTest( "WelCOME" ); 23 | switchTest( "HuangHaiFeng" ); 24 | switchTest( 3 ); 25 | switchTest( "Bob" ); 26 | switchTest( false ); -------------------------------------------------------------------------------- /41/examples/try2.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | } -------------------------------------------------------------------------------- /41/examples/try3.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | try { 11 | throw [1,2,3] 12 | } catch ex { 13 | printf("ex=%s\n", ex) 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /41/readme.txt: -------------------------------------------------------------------------------- 1 | Add range operator('..') support -------------------------------------------------------------------------------- /41/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /41/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /42/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /42/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /42/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /42/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | math = Math(2,3) 6 | printf("math.Add() = %g\n", math.Add()) 7 | 8 | printf("Math.add() = %g\n", Math(2,3).Add()) 9 | 10 | # error, '_add' not exported 11 | # println(_add(2,3)) 12 | -------------------------------------------------------------------------------- /42/examples/misc.mp: -------------------------------------------------------------------------------- 1 | fn Person(name, age) { 2 | self_ = {} 3 | self_["name"] = name 4 | self_["age"] = age 5 | self_["str"] = fn() { 6 | return self_["name"] + ", aged " + self_["age"] 7 | } 8 | return self_ 9 | } 10 | p = Person("Bob", "42") 11 | print(p["str"]()) -------------------------------------------------------------------------------- /42/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /42/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /42/examples/struct5.mp: -------------------------------------------------------------------------------- 1 | # 测试结构的可变参数 2 | struct math 3 | { 4 | let name = "math" 5 | 6 | # 构造函数 7 | fn init(x, y, args...) { 8 | self.x = x 9 | self.y= y 10 | printf("Hello %s\n", self.name) 11 | for i in args { 12 | printf("In init, i=%d\n", i) 13 | } 14 | } 15 | 16 | fn Sum(x, y, args...) { 17 | w = x + y 18 | for i in args { 19 | w = w + i 20 | } 21 | return w 22 | } 23 | 24 | } 25 | 26 | m1 = math(10, 12, 4,5,6,7) 27 | printf("sum = %d\n", m1.Sum(2,3,4,5,6,7)) 28 | -------------------------------------------------------------------------------- /42/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /42/examples/switch.mp: -------------------------------------------------------------------------------- 1 | fn switchTest(name ) { 2 | switch name { 3 | case "welcome" { 4 | printf("Matched welcome: literal\n"); 5 | } 6 | case /^Welcome$/ , /^WELCOME$/i { 7 | printf("Matched welcome: regular-expression\n"); 8 | } 9 | case "Huang" + "HaiFeng" { 10 | printf("Matched HuangHaiFeng\n" ); 11 | } 12 | case 3, 6, 9 { 13 | printf("Matched Number %d\n", name); 14 | } 15 | default { 16 | printf("Default case: %v\n", name ); 17 | } 18 | } 19 | } 20 | 21 | switchTest( "welcome" ); 22 | switchTest( "WelCOME" ); 23 | switchTest( "HuangHaiFeng" ); 24 | switchTest( 3 ); 25 | switchTest( "Bob" ); 26 | switchTest( false ); -------------------------------------------------------------------------------- /42/examples/try2.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | } -------------------------------------------------------------------------------- /42/examples/try3.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | try { 11 | throw [1,2,3] 12 | } catch ex { 13 | printf("ex=%s\n", ex) 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /42/examples/varargs.mp: -------------------------------------------------------------------------------- 1 | let sum = fn(x, y, args...) { 2 | w = x + y 3 | for i in args { 4 | w = w + i 5 | } 6 | return w 7 | }(2,3,4,5,6,7) 8 | println(sum) 9 | 10 | let add2 = fn(x, args...) { 11 | w = x 12 | for i in args { 13 | w = w + i 14 | } 15 | return w 16 | } 17 | 18 | let add1 = fn(x,y, args...) { 19 | return add2(x+y, args...) 20 | } 21 | println(add1(1, 2, 3, 4, 5)) 22 | 23 | 24 | plus = fn(nums...) { 25 | sum = 0 26 | for n in nums { 27 | sum = sum + n 28 | } 29 | return sum 30 | } 31 | println(plus(1, 2, 3)) 32 | lst = [4, 5, 6] 33 | println(plus(lst...)) -------------------------------------------------------------------------------- /42/readme.txt: -------------------------------------------------------------------------------- 1 | Variadic Functions -------------------------------------------------------------------------------- /42/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /42/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /43/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /43/examples/compound_assign_operators.mp: -------------------------------------------------------------------------------- 1 | a = 5 2 | a += 12 3 | 4 | b = 8 5 | b -= 3 6 | 7 | c = 12 8 | c *= 2 9 | 10 | d = 16 11 | d /= 2 12 | 13 | printf("a=%d, b=%d, c=%d, d=%d\n", a, b, c, d) 14 | 15 | s = "hello" 16 | s += " world" 17 | println(s) -------------------------------------------------------------------------------- /43/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /43/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /43/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | math = Math(2,3) 6 | printf("math.Add() = %g\n", math.Add()) 7 | 8 | printf("Math.add() = %g\n", Math(2,3).Add()) 9 | 10 | # error, '_add' not exported 11 | # println(_add(2,3)) 12 | -------------------------------------------------------------------------------- /43/examples/misc.mp: -------------------------------------------------------------------------------- 1 | fn Person(name, age) { 2 | self_ = {} 3 | self_["name"] = name 4 | self_["age"] = age 5 | self_["str"] = fn() { 6 | return self_["name"] + ", aged " + self_["age"] 7 | } 8 | return self_ 9 | } 10 | p = Person("Bob", "42") 11 | print(p["str"]()) -------------------------------------------------------------------------------- /43/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /43/examples/other2.mp: -------------------------------------------------------------------------------- 1 | a=[1,3,"hello"] 2 | a[0] += 10 3 | a[2] += " world" 4 | a[5] += 12.4 5 | println(a[0]) 6 | println(a[2]) 7 | println(a[5]) -------------------------------------------------------------------------------- /43/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /43/examples/struct4.mp: -------------------------------------------------------------------------------- 1 | struct math 2 | { 3 | let Name = "MATH" 4 | let arr = [1,2,3] 5 | let hs ={ "a": "hello", "b" : (x,y) => { x + y} } 6 | fn Add(x,y) { return x + y } 7 | fn Demo() { println(self.arr[2]) } 8 | fn Demo2() { println(self.hs["b"](4,4)) } 9 | 10 | } 11 | 12 | m1 = math() 13 | printf("name=%s\n", m1.Name) # 这里m1.Name中的Name就是一个Identifier 14 | printf("2 + 3 = %d\n", m1.Add(2,3)) # 这里m1.Add()中的Add()就是一个函数调用 15 | m1.Demo() # 这里会打印'3' 16 | m1.Demo2() -------------------------------------------------------------------------------- /43/examples/struct5.mp: -------------------------------------------------------------------------------- 1 | # 测试结构的可变参数 2 | struct math 3 | { 4 | let name = "math" 5 | 6 | # 构造函数 7 | fn init(x, y, args...) { 8 | self.x = x 9 | self.y= y 10 | printf("Hello %s\n", self.name) 11 | for i in args { 12 | printf("In init, i=%d\n", i) 13 | } 14 | } 15 | 16 | fn Sum(x, y, args...) { 17 | w = x + y 18 | for i in args { 19 | w = w + i 20 | } 21 | return w 22 | } 23 | 24 | } 25 | 26 | m1 = math(10, 12, 4,5,6,7) 27 | printf("sum = %d\n", m1.Sum(2,3,4,5,6,7)) 28 | -------------------------------------------------------------------------------- /43/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /43/examples/switch.mp: -------------------------------------------------------------------------------- 1 | fn switchTest(name ) { 2 | switch name { 3 | case "welcome" { 4 | printf("Matched welcome: literal\n"); 5 | } 6 | case /^Welcome$/ , /^WELCOME$/i { 7 | printf("Matched welcome: regular-expression\n"); 8 | } 9 | case "Huang" + "HaiFeng" { 10 | printf("Matched HuangHaiFeng\n" ); 11 | } 12 | case 3, 6, 9 { 13 | printf("Matched Number %d\n", name); 14 | } 15 | default { 16 | printf("Default case: %v\n", name ); 17 | } 18 | } 19 | } 20 | 21 | switchTest( "welcome" ); 22 | switchTest( "WelCOME" ); 23 | switchTest( "HuangHaiFeng" ); 24 | switchTest( 3 ); 25 | switchTest( "Bob" ); 26 | switchTest( false ); -------------------------------------------------------------------------------- /43/examples/try2.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | } -------------------------------------------------------------------------------- /43/examples/try3.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | try { 11 | throw [1,2,3] 12 | } catch ex { 13 | printf("ex=%s\n", ex) 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /43/examples/varargs.mp: -------------------------------------------------------------------------------- 1 | let sum = fn(x, y, args...) { 2 | w = x + y 3 | for i in args { 4 | w = w + i 5 | } 6 | return w 7 | }(2,3,4,5,6,7) 8 | println(sum) 9 | 10 | let add2 = fn(x, args...) { 11 | w = x 12 | for i in args { 13 | w = w + i 14 | } 15 | return w 16 | } 17 | 18 | let add1 = fn(x,y, args...) { 19 | return add2(x+y, args...) 20 | } 21 | println(add1(1, 2, 3, 4, 5)) 22 | 23 | 24 | plus = fn(nums...) { 25 | sum = 0 26 | for n in nums { 27 | sum = sum + n 28 | } 29 | return sum 30 | } 31 | println(plus(1, 2, 3)) 32 | lst = [4, 5, 6] 33 | println(plus(lst...)) -------------------------------------------------------------------------------- /43/readme.txt: -------------------------------------------------------------------------------- 1 | Compound assignment operators(+=, -=, etc) -------------------------------------------------------------------------------- /43/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /43/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /44/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /44/examples/compound_assign_operators.mp: -------------------------------------------------------------------------------- 1 | a = 5 2 | a += 12 3 | 4 | b = 8 5 | b -= 3 6 | 7 | c = 12 8 | c *= 2 9 | 10 | d = 16 11 | d /= 2 12 | 13 | printf("a=%d, b=%d, c=%d, d=%d\n", a, b, c, d) 14 | 15 | s = "hello" 16 | s += " world" 17 | println(s) -------------------------------------------------------------------------------- /44/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /44/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /44/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | math = Math(2,3) 6 | printf("math.Add() = %g\n", math.Add()) 7 | 8 | printf("Math.add() = %g\n", Math(2,3).Add()) 9 | 10 | # error, '_add' not exported 11 | # println(_add(2,3)) 12 | -------------------------------------------------------------------------------- /44/examples/misc.mp: -------------------------------------------------------------------------------- 1 | fn Person(name, age) { 2 | self_ = {} 3 | self_["name"] = name 4 | self_["age"] = age 5 | self_["str"] = fn() { 6 | return self_["name"] + ", aged " + self_["age"] 7 | } 8 | return self_ 9 | } 10 | p = Person("Bob", "42") 11 | print(p["str"]()) -------------------------------------------------------------------------------- /44/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /44/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /44/examples/struct4.mp: -------------------------------------------------------------------------------- 1 | struct math 2 | { 3 | let Name = "MATH" 4 | let arr = [1,2,3] 5 | let hs ={ "a": "hello", "b" : (x,y) => { x + y} } 6 | fn Add(x,y) { return x + y } 7 | fn Demo() { println(self.arr[2]) } 8 | fn Demo2() { println(self.hs["b"](4,4)) } 9 | 10 | } 11 | 12 | m1 = math() 13 | printf("name=%s\n", m1.Name) # 这里m1.Name中的Name就是一个Identifier 14 | printf("2 + 3 = %d\n", m1.Add(2,3)) # 这里m1.Add()中的Add()就是一个函数调用 15 | m1.Demo() # 这里会打印'3' 16 | m1.Demo2() -------------------------------------------------------------------------------- /44/examples/struct5.mp: -------------------------------------------------------------------------------- 1 | # 测试结构的可变参数 2 | struct math 3 | { 4 | let name = "math" 5 | 6 | # 构造函数 7 | fn init(x, y, args...) { 8 | self.x = x 9 | self.y= y 10 | printf("Hello %s\n", self.name) 11 | for i in args { 12 | printf("In init, i=%d\n", i) 13 | } 14 | } 15 | 16 | fn Sum(x, y, args...) { 17 | w = x + y 18 | for i in args { 19 | w = w + i 20 | } 21 | return w 22 | } 23 | 24 | } 25 | 26 | m1 = math(10, 12, 4,5,6,7) 27 | printf("sum = %d\n", m1.Sum(2,3,4,5,6,7)) 28 | -------------------------------------------------------------------------------- /44/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /44/examples/switch.mp: -------------------------------------------------------------------------------- 1 | fn switchTest(name ) { 2 | switch name { 3 | case "welcome" { 4 | printf("Matched welcome: literal\n"); 5 | } 6 | case /^Welcome$/ , /^WELCOME$/i { 7 | printf("Matched welcome: regular-expression\n"); 8 | } 9 | case "Huang" + "HaiFeng" { 10 | printf("Matched HuangHaiFeng\n" ); 11 | } 12 | case 3, 6, 9 { 13 | printf("Matched Number %d\n", name); 14 | } 15 | default { 16 | printf("Default case: %v\n", name ); 17 | } 18 | } 19 | } 20 | 21 | switchTest( "welcome" ); 22 | switchTest( "WelCOME" ); 23 | switchTest( "HuangHaiFeng" ); 24 | switchTest( 3 ); 25 | switchTest( "Bob" ); 26 | switchTest( false ); -------------------------------------------------------------------------------- /44/examples/tco.mp: -------------------------------------------------------------------------------- 1 | fn testTCO(n) { 2 | if n == 0 { 3 | println("-> success! we are tail call optimized") 4 | } else { 5 | printf("n=%d\n", n) 6 | return testTCO(n - 1) 7 | } 8 | } 9 | testTCO(2000000) 10 | 11 | fn factorial(n, total) { 12 | if n == 1 { return total } 13 | return factorial(n - 1, n * total) 14 | } 15 | 16 | println(factorial(500000, 1)) // 120 -------------------------------------------------------------------------------- /44/examples/try2.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | } -------------------------------------------------------------------------------- /44/examples/try3.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | try { 11 | throw [1,2,3] 12 | } catch ex { 13 | printf("ex=%s\n", ex) 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /44/examples/varargs.mp: -------------------------------------------------------------------------------- 1 | let sum = fn(x, y, args...) { 2 | w = x + y 3 | for i in args { 4 | w = w + i 5 | } 6 | return w 7 | }(2,3,4,5,6,7) 8 | println(sum) 9 | 10 | let add2 = fn(x, args...) { 11 | w = x 12 | for i in args { 13 | w = w + i 14 | } 15 | return w 16 | } 17 | 18 | let add1 = fn(x,y, args...) { 19 | return add2(x+y, args...) 20 | } 21 | println(add1(1, 2, 3, 4, 5)) 22 | 23 | 24 | plus = fn(nums...) { 25 | sum = 0 26 | for n in nums { 27 | sum = sum + n 28 | } 29 | return sum 30 | } 31 | println(plus(1, 2, 3)) 32 | lst = [4, 5, 6] 33 | println(plus(lst...)) -------------------------------------------------------------------------------- /44/readme.txt: -------------------------------------------------------------------------------- 1 | True multiple assignment -------------------------------------------------------------------------------- /44/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /44/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /45/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /45/examples/compound_assign_operators.mp: -------------------------------------------------------------------------------- 1 | a = 5 2 | a += 12 3 | 4 | b = 8 5 | b -= 3 6 | 7 | c = 12 8 | c *= 2 9 | 10 | d = 16 11 | d /= 2 12 | 13 | printf("a=%d, b=%d, c=%d, d=%d\n", a, b, c, d) 14 | 15 | s = "hello" 16 | s += " world" 17 | println(s) -------------------------------------------------------------------------------- /45/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /45/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /45/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | math = Math(2,3) 6 | printf("math.Add() = %g\n", math.Add()) 7 | 8 | printf("Math.add() = %g\n", Math(2,3).Add()) 9 | 10 | # error, '_add' not exported 11 | # println(_add(2,3)) 12 | -------------------------------------------------------------------------------- /45/examples/misc.mp: -------------------------------------------------------------------------------- 1 | fn Person(name, age) { 2 | self_ = {} 3 | self_["name"] = name 4 | self_["age"] = age 5 | self_["str"] = fn() { 6 | return self_["name"] + ", aged " + self_["age"] 7 | } 8 | return self_ 9 | } 10 | p = Person("Bob", "42") 11 | print(p["str"]()) -------------------------------------------------------------------------------- /45/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /45/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /45/examples/struct4.mp: -------------------------------------------------------------------------------- 1 | struct math 2 | { 3 | let Name = "MATH" 4 | let arr = [1,2,3] 5 | let hs ={ "a": "hello", "b" : (x,y) => { x + y} } 6 | fn Add(x,y) { return x + y } 7 | fn Demo() { println(self.arr[2]) } 8 | fn Demo2() { println(self.hs["b"](4,4)) } 9 | 10 | } 11 | 12 | m1 = math() 13 | printf("name=%s\n", m1.Name) # 这里m1.Name中的Name就是一个Identifier 14 | printf("2 + 3 = %d\n", m1.Add(2,3)) # 这里m1.Add()中的Add()就是一个函数调用 15 | m1.Demo() # 这里会打印'3' 16 | m1.Demo2() -------------------------------------------------------------------------------- /45/examples/struct5.mp: -------------------------------------------------------------------------------- 1 | # 测试结构的可变参数 2 | struct math 3 | { 4 | let name = "math" 5 | 6 | # 构造函数 7 | fn init(x, y, args...) { 8 | self.x = x 9 | self.y= y 10 | printf("Hello %s\n", self.name) 11 | for i in args { 12 | printf("In init, i=%d\n", i) 13 | } 14 | } 15 | 16 | fn Sum(x, y, args...) { 17 | w = x + y 18 | for i in args { 19 | w = w + i 20 | } 21 | return w 22 | } 23 | 24 | } 25 | 26 | //m1 = math(10, 12, 4,5,6,7) 27 | printf("sum = %d\n", math(10, 12, 4,5,6,7).Sum(2,3,4,5,6,7)) 28 | -------------------------------------------------------------------------------- /45/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /45/examples/switch.mp: -------------------------------------------------------------------------------- 1 | fn switchTest(name ) { 2 | switch name { 3 | case "welcome" { 4 | printf("Matched welcome: literal\n"); 5 | } 6 | case /^Welcome$/ , /^WELCOME$/i { 7 | printf("Matched welcome: regular-expression\n"); 8 | } 9 | case "Huang" + "HaiFeng" { 10 | printf("Matched HuangHaiFeng\n" ); 11 | } 12 | case 3, 6, 9 { 13 | printf("Matched Number %d\n", name); 14 | } 15 | default { 16 | printf("Default case: %v\n", name ); 17 | } 18 | } 19 | } 20 | 21 | switchTest( "welcome" ); 22 | switchTest( "WelCOME" ); 23 | switchTest( "HuangHaiFeng" ); 24 | switchTest( 3 ); 25 | switchTest( "Bob" ); 26 | switchTest( false ); -------------------------------------------------------------------------------- /45/examples/try2.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | } -------------------------------------------------------------------------------- /45/examples/try3.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | try { 11 | throw [1,2,3] 12 | } catch ex { 13 | printf("ex=%s\n", ex) 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /45/examples/varargs.mp: -------------------------------------------------------------------------------- 1 | let sum = fn(x, y, args...) { 2 | w = x + y 3 | for i in args { 4 | w = w + i 5 | } 6 | return w 7 | }(2,3,4,5,6,7) 8 | println(sum) 9 | 10 | let add2 = fn(x, args...) { 11 | w = x 12 | for i in args { 13 | w = w + i 14 | } 15 | return w 16 | } 17 | 18 | let add1 = fn(x,y, args...) { 19 | return add2(x+y, args...) 20 | } 21 | println(add1(1, 2, 3, 4, 5)) 22 | 23 | 24 | plus = fn(nums...) { 25 | sum = 0 26 | for n in nums { 27 | sum = sum + n 28 | } 29 | return sum 30 | } 31 | println(plus(1, 2, 3)) 32 | lst = [4, 5, 6] 33 | println(plus(lst...)) -------------------------------------------------------------------------------- /45/readme.txt: -------------------------------------------------------------------------------- 1 | TCO(tail call optimization) support -------------------------------------------------------------------------------- /45/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /45/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /46/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /46/examples/compound_assign_operators.mp: -------------------------------------------------------------------------------- 1 | a = 5 2 | a += 12 3 | 4 | b = 8 5 | b -= 3 6 | 7 | c = 12 8 | c *= 2 9 | 10 | d = 16 11 | d /= 2 12 | 13 | printf("a=%d, b=%d, c=%d, d=%d\n", a, b, c, d) 14 | 15 | s = "hello" 16 | s += " world" 17 | println(s) -------------------------------------------------------------------------------- /46/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /46/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /46/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | math = Math(2,3) 6 | printf("math.Add() = %g\n", math.Add()) 7 | 8 | printf("Math.add() = %g\n", Math(2,3).Add()) 9 | 10 | # error, '_add' not exported 11 | # println(_add(2,3)) 12 | -------------------------------------------------------------------------------- /46/examples/interpolateString.mp: -------------------------------------------------------------------------------- 1 | ax = "hello" 2 | bx = 1024 3 | println("\\$ax = ${ax}, bx = $bx, ${ax") -------------------------------------------------------------------------------- /46/examples/misc.mp: -------------------------------------------------------------------------------- 1 | fn Person(name, age) { 2 | self_ = {} 3 | self_["name"] = name 4 | self_["age"] = age 5 | self_["str"] = fn() { 6 | return self_["name"] + ", aged " + self_["age"] 7 | } 8 | return self_ 9 | } 10 | p = Person("Bob", "42") 11 | print(p["str"]()) -------------------------------------------------------------------------------- /46/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /46/examples/other.mp: -------------------------------------------------------------------------------- 1 | let sum = fn(a, b, x...) { 2 | for arg in @_ { 3 | println(arg) 4 | } 5 | }(2,3, 4, 5) -------------------------------------------------------------------------------- /46/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /46/examples/struct4.mp: -------------------------------------------------------------------------------- 1 | struct math 2 | { 3 | let Name = "MATH" 4 | let arr = [1,2,3] 5 | let hs ={ "a": "hello", "b" : (x,y) => { x + y} } 6 | fn Add(x,y) { return x + y } 7 | fn Demo() { println(self.arr[2]) } 8 | fn Demo2() { println(self.hs["b"](4,4)) } 9 | 10 | } 11 | 12 | m1 = math() 13 | printf("name=%s\n", m1.Name) # 这里m1.Name中的Name就是一个Identifier 14 | printf("2 + 3 = %d\n", m1.Add(2,3)) # 这里m1.Add()中的Add()就是一个函数调用 15 | m1.Demo() # 这里会打印'3' 16 | m1.Demo2() -------------------------------------------------------------------------------- /46/examples/struct5.mp: -------------------------------------------------------------------------------- 1 | # 测试结构的可变参数 2 | struct math 3 | { 4 | let name = "math" 5 | 6 | # 构造函数 7 | fn init(x, y, args...) { 8 | self.x = x 9 | self.y= y 10 | printf("Hello %s\n", self.name) 11 | for i in args { 12 | printf("In init, i=%d\n", i) 13 | } 14 | } 15 | 16 | fn Sum(x, y, args...) { 17 | w = x + y 18 | for i in args { 19 | w = w + i 20 | } 21 | return w 22 | } 23 | 24 | } 25 | 26 | //m1 = math(10, 12, 4,5,6,7) 27 | printf("sum = %d\n", math(10, 12, 4,5,6,7).Sum(2,3,4,5,6,7)) 28 | -------------------------------------------------------------------------------- /46/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /46/examples/switch.mp: -------------------------------------------------------------------------------- 1 | fn switchTest(name ) { 2 | switch name { 3 | case "welcome" { 4 | printf("Matched welcome: literal\n"); 5 | } 6 | case /^Welcome$/ , /^WELCOME$/i { 7 | printf("Matched welcome: regular-expression\n"); 8 | } 9 | case "Huang" + "HaiFeng" { 10 | printf("Matched HuangHaiFeng\n" ); 11 | } 12 | case 3, 6, 9 { 13 | printf("Matched Number %d\n", name); 14 | } 15 | default { 16 | printf("Default case: %v\n", name ); 17 | } 18 | } 19 | } 20 | 21 | switchTest( "welcome" ); 22 | switchTest( "WelCOME" ); 23 | switchTest( "HuangHaiFeng" ); 24 | switchTest( 3 ); 25 | switchTest( "Bob" ); 26 | switchTest( false ); -------------------------------------------------------------------------------- /46/examples/try2.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | } -------------------------------------------------------------------------------- /46/examples/try3.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | try { 11 | throw [1,2,3] 12 | } catch ex { 13 | printf("ex=%s\n", ex) 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /46/examples/varargs.mp: -------------------------------------------------------------------------------- 1 | let sum = fn(x, y, args...) { 2 | w = x + y 3 | for i in args { 4 | w = w + i 5 | } 6 | return w 7 | }(2,3,4,5,6,7) 8 | println(sum) 9 | 10 | let add2 = fn(x, args...) { 11 | w = x 12 | for i in args { 13 | w = w + i 14 | } 15 | return w 16 | } 17 | 18 | let add1 = fn(x,y, args...) { 19 | return add2(x+y, args...) 20 | } 21 | println(add1(1, 2, 3, 4, 5)) 22 | 23 | 24 | plus = fn(nums...) { 25 | sum = 0 26 | for n in nums { 27 | sum = sum + n 28 | } 29 | return sum 30 | } 31 | println(plus(1, 2, 3)) 32 | lst = [4, 5, 6] 33 | println(plus(lst...)) -------------------------------------------------------------------------------- /46/readme.txt: -------------------------------------------------------------------------------- 1 | 'Interpolated String' support -------------------------------------------------------------------------------- /46/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /46/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /47/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /47/examples/compound_assign_operators.mp: -------------------------------------------------------------------------------- 1 | a = 5 2 | a += 12 3 | 4 | b = 8 5 | b -= 3 6 | 7 | c = 12 8 | c *= 2 9 | 10 | d = 16 11 | d /= 2 12 | 13 | printf("a=%d, b=%d, c=%d, d=%d\n", a, b, c, d) 14 | 15 | s = "hello" 16 | s += " world" 17 | println(s) -------------------------------------------------------------------------------- /47/examples/decorator.mp: -------------------------------------------------------------------------------- 1 | fn timer(otherfn) { 2 | return fn() { 3 | println("timer start") 4 | otherfn($_) 5 | println("timer end") 6 | } 7 | } 8 | 9 | fn log(otherfn) { 10 | return fn() { 11 | println("otherfn start") 12 | otherfn($_) 13 | println("otherfn end") 14 | } 15 | } 16 | 17 | @log 18 | @timer 19 | fn sum(x, y) { 20 | printf("%d + %d = %d\n", x, y, x+y) 21 | } 22 | 23 | sum(1,2) 24 | 25 | //test $_ usage 26 | fn www2(x,y) { 27 | return x + y 28 | } 29 | fn www1(x,y) { 30 | return www2($_) 31 | } 32 | printf("www1 result=%d\n", www1(7,3)) 33 | -------------------------------------------------------------------------------- /47/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /47/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /47/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | math = Math(2,3) 6 | printf("math.Add() = %g\n", math.Add()) 7 | 8 | printf("Math.add() = %g\n", Math(2,3).Add()) 9 | 10 | # error, '_add' not exported 11 | # println(_add(2,3)) 12 | -------------------------------------------------------------------------------- /47/examples/interpolateString.mp: -------------------------------------------------------------------------------- 1 | ax = "hello" 2 | bx = 1024 3 | println("\\$ax = ${ax}, bx = $bx, ${ax") -------------------------------------------------------------------------------- /47/examples/misc.mp: -------------------------------------------------------------------------------- 1 | fn Person(name, age) { 2 | self_ = {} 3 | self_["name"] = name 4 | self_["age"] = age 5 | self_["str"] = fn() { 6 | return self_["name"] + ", aged " + self_["age"] 7 | } 8 | return self_ 9 | } 10 | p = Person("Bob", "42") 11 | print(p["str"]()) -------------------------------------------------------------------------------- /47/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /47/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /47/examples/struct4.mp: -------------------------------------------------------------------------------- 1 | struct math 2 | { 3 | let Name = "MATH" 4 | let arr = [1,2,3] 5 | let hs ={ "a": "hello", "b" : (x,y) => { x + y} } 6 | fn Add(x,y) { return x + y } 7 | fn Demo() { println(self.arr[2]) } 8 | fn Demo2() { println(self.hs["b"](4,4)) } 9 | 10 | } 11 | 12 | m1 = math() 13 | printf("name=%s\n", m1.Name) # 这里m1.Name中的Name就是一个Identifier 14 | printf("2 + 3 = %d\n", m1.Add(2,3)) # 这里m1.Add()中的Add()就是一个函数调用 15 | m1.Demo() # 这里会打印'3' 16 | m1.Demo2() -------------------------------------------------------------------------------- /47/examples/struct5.mp: -------------------------------------------------------------------------------- 1 | # 测试结构的可变参数 2 | struct math 3 | { 4 | let name = "math" 5 | 6 | # 构造函数 7 | fn init(x, y, args...) { 8 | self.x = x 9 | self.y= y 10 | printf("Hello %s\n", self.name) 11 | for i in args { 12 | printf("In init, i=%d\n", i) 13 | } 14 | } 15 | 16 | fn Sum(x, y, args...) { 17 | w = x + y 18 | for i in args { 19 | w = w + i 20 | } 21 | return w 22 | } 23 | 24 | } 25 | 26 | //m1 = math(10, 12, 4,5,6,7) 27 | printf("sum = %d\n", math(10, 12, 4,5,6,7).Sum(2,3,4,5,6,7)) 28 | -------------------------------------------------------------------------------- /47/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /47/examples/switch.mp: -------------------------------------------------------------------------------- 1 | fn switchTest(name ) { 2 | switch name { 3 | case "welcome" { 4 | printf("Matched welcome: literal\n"); 5 | } 6 | case /^Welcome$/ , /^WELCOME$/i { 7 | printf("Matched welcome: regular-expression\n"); 8 | } 9 | case "Huang" + "HaiFeng" { 10 | printf("Matched HuangHaiFeng\n" ); 11 | } 12 | case 3, 6, 9 { 13 | printf("Matched Number %d\n", name); 14 | } 15 | default { 16 | printf("Default case: %v\n", name ); 17 | } 18 | } 19 | } 20 | 21 | switchTest( "welcome" ); 22 | switchTest( "WelCOME" ); 23 | switchTest( "HuangHaiFeng" ); 24 | switchTest( 3 ); 25 | switchTest( "Bob" ); 26 | switchTest( false ); -------------------------------------------------------------------------------- /47/examples/try2.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | } -------------------------------------------------------------------------------- /47/examples/try3.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | try { 11 | throw [1,2,3] 12 | } catch ex { 13 | printf("ex=%s\n", ex) 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /47/examples/varargs.mp: -------------------------------------------------------------------------------- 1 | let sum = fn(x, y, args...) { 2 | w = x + y 3 | for i in args { 4 | w = w + i 5 | } 6 | return w 7 | }(2,3,4,5,6,7) 8 | println(sum) 9 | 10 | let add2 = fn(x, args...) { 11 | w = x 12 | for i in args { 13 | w = w + i 14 | } 15 | return w 16 | } 17 | 18 | let add1 = fn(x,y, args...) { 19 | return add2(x+y, args...) 20 | } 21 | println(add1(1, 2, 3, 4, 5)) 22 | 23 | 24 | plus = fn(nums...) { 25 | sum = 0 26 | for n in nums { 27 | sum = sum + n 28 | } 29 | return sum 30 | } 31 | println(plus(1, 2, 3)) 32 | lst = [4, 5, 6] 33 | println(plus(lst...)) -------------------------------------------------------------------------------- /47/readme.txt: -------------------------------------------------------------------------------- 1 | Decorator support -------------------------------------------------------------------------------- /47/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /47/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /48/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /48/examples/compound_assign_operators.mp: -------------------------------------------------------------------------------- 1 | a = 5 2 | a += 12 3 | 4 | b = 8 5 | b -= 3 6 | 7 | c = 12 8 | c *= 2 9 | 10 | d = 16 11 | d /= 2 12 | 13 | printf("a=%d, b=%d, c=%d, d=%d\n", a, b, c, d) 14 | 15 | s = "hello" 16 | s += " world" 17 | println(s) -------------------------------------------------------------------------------- /48/examples/decorator.mp: -------------------------------------------------------------------------------- 1 | fn timer(otherfn) { 2 | return fn() { 3 | println("timer start") 4 | otherfn($_) 5 | println("timer end") 6 | } 7 | } 8 | 9 | fn log(otherfn) { 10 | return fn() { 11 | println("otherfn start") 12 | otherfn($_) 13 | println("otherfn end") 14 | } 15 | } 16 | 17 | @log 18 | @timer 19 | fn sum(x, y) { 20 | printf("%d + %d = %d\n", x, y, x+y) 21 | } 22 | 23 | sum(1,2) -------------------------------------------------------------------------------- /48/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /48/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /48/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | math = Math(2,3) 6 | printf("math.Add() = %g\n", math.Add()) 7 | 8 | printf("Math.add() = %g\n", Math(2,3).Add()) 9 | 10 | # error, '_add' not exported 11 | # println(_add(2,3)) 12 | -------------------------------------------------------------------------------- /48/examples/interpolateString.mp: -------------------------------------------------------------------------------- 1 | ax = "hello" 2 | bx = 1024 3 | println("\\$ax = ${ax}, bx = $bx, ${ax") -------------------------------------------------------------------------------- /48/examples/misc.mp: -------------------------------------------------------------------------------- 1 | fn Person(name, age) { 2 | self_ = {} 3 | self_["name"] = name 4 | self_["age"] = age 5 | self_["str"] = fn() { 6 | return self_["name"] + ", aged " + self_["age"] 7 | } 8 | return self_ 9 | } 10 | p = Person("Bob", "42") 11 | print(p["str"]()) -------------------------------------------------------------------------------- /48/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /48/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /48/examples/struct4.mp: -------------------------------------------------------------------------------- 1 | struct math 2 | { 3 | let Name = "MATH" 4 | let arr = [1,2,3] 5 | let hs ={ "a": "hello", "b" : (x,y) => { x + y} } 6 | fn Add(x,y) { return x + y } 7 | fn Demo() { println(self.arr[2]) } 8 | fn Demo2() { println(self.hs["b"](4,4)) } 9 | 10 | } 11 | 12 | m1 = math() 13 | printf("name=%s\n", m1.Name) # 这里m1.Name中的Name就是一个Identifier 14 | printf("2 + 3 = %d\n", m1.Add(2,3)) # 这里m1.Add()中的Add()就是一个函数调用 15 | m1.Demo() # 这里会打印'3' 16 | m1.Demo2() -------------------------------------------------------------------------------- /48/examples/struct5.mp: -------------------------------------------------------------------------------- 1 | # 测试结构的可变参数 2 | struct math 3 | { 4 | let name = "math" 5 | 6 | # 构造函数 7 | fn init(x, y, args...) { 8 | self.x = x 9 | self.y= y 10 | printf("Hello %s\n", self.name) 11 | for i in args { 12 | printf("In init, i=%d\n", i) 13 | } 14 | } 15 | 16 | fn Sum(x, y, args...) { 17 | w = x + y 18 | for i in args { 19 | w = w + i 20 | } 21 | return w 22 | } 23 | 24 | } 25 | 26 | //m1 = math(10, 12, 4,5,6,7) 27 | printf("sum = %d\n", math(10, 12, 4,5,6,7).Sum(2,3,4,5,6,7)) 28 | -------------------------------------------------------------------------------- /48/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /48/examples/switch.mp: -------------------------------------------------------------------------------- 1 | fn switchTest(name ) { 2 | switch name { 3 | case "welcome" { 4 | printf("Matched welcome: literal\n"); 5 | } 6 | case /^Welcome$/ , /^WELCOME$/i { 7 | printf("Matched welcome: regular-expression\n"); 8 | } 9 | case "Huang" + "HaiFeng" { 10 | printf("Matched HuangHaiFeng\n" ); 11 | } 12 | case 3, 6, 9 { 13 | printf("Matched Number %d\n", name); 14 | } 15 | default { 16 | printf("Default case: %v\n", name ); 17 | } 18 | } 19 | } 20 | 21 | switchTest( "welcome" ); 22 | switchTest( "WelCOME" ); 23 | switchTest( "HuangHaiFeng" ); 24 | switchTest( 3 ); 25 | switchTest( "Bob" ); 26 | switchTest( false ); -------------------------------------------------------------------------------- /48/examples/try2.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | } -------------------------------------------------------------------------------- /48/examples/try3.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | try { 11 | throw [1,2,3] 12 | } catch ex { 13 | printf("ex=%s\n", ex) 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /48/examples/varargs.mp: -------------------------------------------------------------------------------- 1 | let sum = fn(x, y, args...) { 2 | w = x + y 3 | for i in args { 4 | w = w + i 5 | } 6 | return w 7 | }(2,3,4,5,6,7) 8 | println(sum) 9 | 10 | let add2 = fn(x, args...) { 11 | w = x 12 | for i in args { 13 | w = w + i 14 | } 15 | return w 16 | } 17 | 18 | let add1 = fn(x,y, args...) { 19 | return add2(x+y, args...) 20 | } 21 | println(add1(1, 2, 3, 4, 5)) 22 | 23 | 24 | plus = fn(nums...) { 25 | sum = 0 26 | for n in nums { 27 | sum = sum + n 28 | } 29 | return sum 30 | } 31 | println(plus(1, 2, 3)) 32 | lst = [4, 5, 6] 33 | println(plus(lst...)) -------------------------------------------------------------------------------- /48/readme.txt: -------------------------------------------------------------------------------- 1 | command execution -------------------------------------------------------------------------------- /48/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /48/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /49/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /49/examples/compound_assign_operators.mp: -------------------------------------------------------------------------------- 1 | a = 5 2 | a += 12 3 | 4 | b = 8 5 | b -= 3 6 | 7 | c = 12 8 | c *= 2 9 | 10 | d = 16 11 | d /= 2 12 | 13 | printf("a=%d, b=%d, c=%d, d=%d\n", a, b, c, d) 14 | 15 | s = "hello" 16 | s += " world" 17 | println(s) -------------------------------------------------------------------------------- /49/examples/decorator.mp: -------------------------------------------------------------------------------- 1 | fn timer(otherfn) { 2 | return fn() { 3 | println("timer start") 4 | otherfn($_) 5 | println("timer end") 6 | } 7 | } 8 | 9 | fn log(otherfn) { 10 | return fn() { 11 | println("otherfn start") 12 | otherfn($_) 13 | println("otherfn end") 14 | } 15 | } 16 | 17 | @log 18 | @timer 19 | fn sum(x, y) { 20 | printf("%d + %d = %d\n", x, y, x+y) 21 | } 22 | 23 | sum(1,2) -------------------------------------------------------------------------------- /49/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /49/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /49/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | math = Math(2,3) 6 | printf("math.Add() = %g\n", math.Add()) 7 | 8 | printf("Math.add() = %g\n", Math(2,3).Add()) 9 | 10 | # error, '_add' not exported 11 | # println(_add(2,3)) 12 | -------------------------------------------------------------------------------- /49/examples/interpolateString.mp: -------------------------------------------------------------------------------- 1 | ax = "hello" 2 | bx = 1024 3 | println("\\$ax = ${ax}, bx = $bx, ${ax") -------------------------------------------------------------------------------- /49/examples/misc.mp: -------------------------------------------------------------------------------- 1 | fn Person(name, age) { 2 | self_ = {} 3 | self_.name = name 4 | self_.age = age 5 | self_.str = fn() { 6 | return self_.name + ", aged " + self_.age 7 | } 8 | return self_ 9 | } 10 | p = Person("Bob", "42") 11 | print(p.str()) -------------------------------------------------------------------------------- /49/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /49/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /49/examples/struct4.mp: -------------------------------------------------------------------------------- 1 | struct math 2 | { 3 | let Name = "MATH" 4 | let arr = [1,2,3] 5 | let hs ={ "a": "hello", "b" : (x,y) => { x + y} } 6 | fn Add(x,y) { return x + y } 7 | fn Demo() { println(self.arr[2]) } 8 | fn Demo2() { println(self.hs["b"](4,4)) } 9 | 10 | } 11 | 12 | m1 = math() 13 | printf("name=%s\n", m1.Name) # 这里m1.Name中的Name就是一个Identifier 14 | printf("2 + 3 = %d\n", m1.Add(2,3)) # 这里m1.Add()中的Add()就是一个函数调用 15 | m1.Demo() # 这里会打印'3' 16 | m1.Demo2() -------------------------------------------------------------------------------- /49/examples/struct5.mp: -------------------------------------------------------------------------------- 1 | # 测试结构的可变参数 2 | struct math 3 | { 4 | let name = "math" 5 | 6 | # 构造函数 7 | fn init(x, y, args...) { 8 | self.x = x 9 | self.y= y 10 | printf("Hello %s\n", self.name) 11 | for i in args { 12 | printf("In init, i=%d\n", i) 13 | } 14 | } 15 | 16 | fn Sum(x, y, args...) { 17 | w = x + y 18 | for i in args { 19 | w = w + i 20 | } 21 | return w 22 | } 23 | 24 | } 25 | 26 | //m1 = math(10, 12, 4,5,6,7) 27 | printf("sum = %d\n", math(10, 12, 4,5,6,7).Sum(2,3,4,5,6,7)) 28 | -------------------------------------------------------------------------------- /49/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /49/examples/switch.mp: -------------------------------------------------------------------------------- 1 | fn switchTest(name ) { 2 | switch name { 3 | case "welcome" { 4 | printf("Matched welcome: literal\n"); 5 | } 6 | case /^Welcome$/ , /^WELCOME$/i { 7 | printf("Matched welcome: regular-expression\n"); 8 | } 9 | case "Huang" + "HaiFeng" { 10 | printf("Matched HuangHaiFeng\n" ); 11 | } 12 | case 3, 6, 9 { 13 | printf("Matched Number %d\n", name); 14 | } 15 | default { 16 | printf("Default case: %v\n", name ); 17 | } 18 | } 19 | } 20 | 21 | switchTest( "welcome" ); 22 | switchTest( "WelCOME" ); 23 | switchTest( "HuangHaiFeng" ); 24 | switchTest( 3 ); 25 | switchTest( "Bob" ); 26 | switchTest( false ); -------------------------------------------------------------------------------- /49/examples/try2.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | } -------------------------------------------------------------------------------- /49/examples/try3.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | try { 11 | throw [1,2,3] 12 | } catch ex { 13 | printf("ex=%s\n", ex) 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /49/examples/varargs.mp: -------------------------------------------------------------------------------- 1 | let sum = fn(x, y, args...) { 2 | w = x + y 3 | for i in args { 4 | w = w + i 5 | } 6 | return w 7 | }(2,3,4,5,6,7) 8 | println(sum) 9 | 10 | let add2 = fn(x, args...) { 11 | w = x 12 | for i in args { 13 | w = w + i 14 | } 15 | return w 16 | } 17 | 18 | let add1 = fn(x,y, args...) { 19 | return add2(x+y, args...) 20 | } 21 | println(add1(1, 2, 3, 4, 5)) 22 | 23 | 24 | plus = fn(nums...) { 25 | sum = 0 26 | for n in nums { 27 | sum = sum + n 28 | } 29 | return sum 30 | } 31 | println(plus(1, 2, 3)) 32 | lst = [4, 5, 6] 33 | println(plus(lst...)) -------------------------------------------------------------------------------- /49/readme.txt: -------------------------------------------------------------------------------- 1 | enhanced hash support -------------------------------------------------------------------------------- /49/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /49/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /50/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /50/examples/compound_assign_operators.mp: -------------------------------------------------------------------------------- 1 | a = 5 2 | a += 12 3 | 4 | b = 8 5 | b -= 3 6 | 7 | c = 12 8 | c *= 2 9 | 10 | d = 16 11 | d /= 2 12 | 13 | printf("a=%d, b=%d, c=%d, d=%d\n", a, b, c, d) 14 | 15 | s = "hello" 16 | s += " world" 17 | println(s) -------------------------------------------------------------------------------- /50/examples/decorator.mp: -------------------------------------------------------------------------------- 1 | fn timer(otherfn) { 2 | return fn() { 3 | println("timer start") 4 | otherfn($_) 5 | println("timer end") 6 | } 7 | } 8 | 9 | fn log(otherfn) { 10 | return fn() { 11 | println("otherfn start") 12 | otherfn($_) 13 | println("otherfn end") 14 | } 15 | } 16 | 17 | @log 18 | @timer 19 | fn sum(x, y) { 20 | printf("%d + %d = %d\n", x, y, x+y) 21 | } 22 | 23 | sum(1,2) -------------------------------------------------------------------------------- /50/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /50/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /50/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | math = Math(2,3) 6 | printf("math.Add() = %g\n", math.Add()) 7 | 8 | printf("Math.add() = %g\n", Math(2,3).Add()) 9 | 10 | # error, '_add' not exported 11 | # println(_add(2,3)) 12 | -------------------------------------------------------------------------------- /50/examples/interpolateString.mp: -------------------------------------------------------------------------------- 1 | ax = "hello" 2 | bx = 1024 3 | println("\\$ax = ${ax}, bx = $bx, ${ax") -------------------------------------------------------------------------------- /50/examples/misc.mp: -------------------------------------------------------------------------------- 1 | fn Person(name, age) { 2 | self_ = {} 3 | self_.name = name 4 | self_.age = age 5 | self_.str = fn() { 6 | return self_.name + ", aged " + self_.age 7 | } 8 | return self_ 9 | } 10 | p = Person("Bob", "42") 11 | print(p.str()) -------------------------------------------------------------------------------- /50/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /50/examples/pipe.mp: -------------------------------------------------------------------------------- 1 | struct demo { 2 | fn Uppercase(s) { 3 | return s.upper() 4 | } 5 | } 6 | 7 | fn uppercase(s) { 8 | return s.upper() 9 | } 10 | 11 | //函数调用 12 | upper_str1 = "hello, world" |> uppercase 13 | println(upper_str1) 14 | 15 | upper_str2 = "hello, world" |> uppercase() 16 | println(upper_str2) 17 | 18 | //方法调用 19 | demo_struct = demo() 20 | upper_str1 = "hello, world" |> demo_struct.Uppercase() 21 | println(upper_str1) 22 | 23 | upper_str2 = "hello, world" |> demo_struct.Uppercase 24 | println(upper_str2) 25 | 26 | -------------------------------------------------------------------------------- /50/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /50/examples/struct4.mp: -------------------------------------------------------------------------------- 1 | struct math 2 | { 3 | let Name = "MATH" 4 | let arr = [1,2,3] 5 | let hs ={ "a": "hello", "b" : (x,y) => { x + y} } 6 | fn Add(x,y) { return x + y } 7 | fn Demo() { println(self.arr[2]) } 8 | fn Demo2() { println(self.hs["b"](4,4)) } 9 | 10 | } 11 | 12 | m1 = math() 13 | printf("name=%s\n", m1.Name) # 这里m1.Name中的Name就是一个Identifier 14 | printf("2 + 3 = %d\n", m1.Add(2,3)) # 这里m1.Add()中的Add()就是一个函数调用 15 | m1.Demo() # 这里会打印'3' 16 | m1.Demo2() -------------------------------------------------------------------------------- /50/examples/struct5.mp: -------------------------------------------------------------------------------- 1 | # 测试结构的可变参数 2 | struct math 3 | { 4 | let name = "math" 5 | 6 | # 构造函数 7 | fn init(x, y, args...) { 8 | self.x = x 9 | self.y= y 10 | printf("Hello %s\n", self.name) 11 | for i in args { 12 | printf("In init, i=%d\n", i) 13 | } 14 | } 15 | 16 | fn Sum(x, y, args...) { 17 | w = x + y 18 | for i in args { 19 | w = w + i 20 | } 21 | return w 22 | } 23 | 24 | } 25 | 26 | //m1 = math(10, 12, 4,5,6,7) 27 | printf("sum = %d\n", math(10, 12, 4,5,6,7).Sum(2,3,4,5,6,7)) 28 | -------------------------------------------------------------------------------- /50/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /50/examples/switch.mp: -------------------------------------------------------------------------------- 1 | fn switchTest(name ) { 2 | switch name { 3 | case "welcome" { 4 | printf("Matched welcome: literal\n"); 5 | } 6 | case /^Welcome$/ , /^WELCOME$/i { 7 | printf("Matched welcome: regular-expression\n"); 8 | } 9 | case "Huang" + "HaiFeng" { 10 | printf("Matched HuangHaiFeng\n" ); 11 | } 12 | case 3, 6, 9 { 13 | printf("Matched Number %d\n", name); 14 | } 15 | default { 16 | printf("Default case: %v\n", name ); 17 | } 18 | } 19 | } 20 | 21 | switchTest( "welcome" ); 22 | switchTest( "WelCOME" ); 23 | switchTest( "HuangHaiFeng" ); 24 | switchTest( 3 ); 25 | switchTest( "Bob" ); 26 | switchTest( false ); -------------------------------------------------------------------------------- /50/examples/try2.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | } -------------------------------------------------------------------------------- /50/examples/try3.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | try { 11 | throw [1,2,3] 12 | } catch ex { 13 | printf("ex=%s\n", ex) 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /50/examples/varargs.mp: -------------------------------------------------------------------------------- 1 | let sum = fn(x, y, args...) { 2 | w = x + y 3 | for i in args { 4 | w = w + i 5 | } 6 | return w 7 | }(2,3,4,5,6,7) 8 | println(sum) 9 | 10 | let add2 = fn(x, args...) { 11 | w = x 12 | for i in args { 13 | w = w + i 14 | } 15 | return w 16 | } 17 | 18 | let add1 = fn(x,y, args...) { 19 | return add2(x+y, args...) 20 | } 21 | println(add1(1, 2, 3, 4, 5)) 22 | 23 | 24 | plus = fn(nums...) { 25 | sum = 0 26 | for n in nums { 27 | sum = sum + n 28 | } 29 | return sum 30 | } 31 | println(plus(1, 2, 3)) 32 | lst = [4, 5, 6] 33 | println(plus(lst...)) -------------------------------------------------------------------------------- /50/readme.txt: -------------------------------------------------------------------------------- 1 | pipe operator(|>) -------------------------------------------------------------------------------- /50/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /50/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /51/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /51/examples/compound_assign_operators.mp: -------------------------------------------------------------------------------- 1 | a = 5 2 | a += 12 3 | 4 | b = 8 5 | b -= 3 6 | 7 | c = 12 8 | c *= 2 9 | 10 | d = 16 11 | d /= 2 12 | 13 | printf("a=%d, b=%d, c=%d, d=%d\n", a, b, c, d) 14 | 15 | s = "hello" 16 | s += " world" 17 | println(s) -------------------------------------------------------------------------------- /51/examples/decorator.mp: -------------------------------------------------------------------------------- 1 | fn timer(otherfn) { 2 | return fn() { 3 | println("timer start") 4 | otherfn($_) 5 | println("timer end") 6 | } 7 | } 8 | 9 | fn log(otherfn) { 10 | return fn() { 11 | println("otherfn start") 12 | otherfn($_) 13 | println("otherfn end") 14 | } 15 | } 16 | 17 | @log 18 | @timer 19 | fn sum(x, y) { 20 | printf("%d + %d = %d\n", x, y, x+y) 21 | } 22 | 23 | sum(1,2) -------------------------------------------------------------------------------- /51/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /51/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /51/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | math = Math(2,3) 6 | printf("math.Add() = %g\n", math.Add()) 7 | 8 | printf("Math.add() = %g\n", Math(2,3).Add()) 9 | 10 | # error, '_add' not exported 11 | # println(_add(2,3)) 12 | -------------------------------------------------------------------------------- /51/examples/interpolateString.mp: -------------------------------------------------------------------------------- 1 | ax = "hello" 2 | bx = 1024 3 | println("\\$ax = ${ax}, bx = $bx, ${ax") -------------------------------------------------------------------------------- /51/examples/misc.mp: -------------------------------------------------------------------------------- 1 | fn Person(name, age) { 2 | self_ = {} 3 | self_.name = name 4 | self_.age = age 5 | self_.str = fn() { 6 | return self_.name + ", aged " + self_.age 7 | } 8 | return self_ 9 | } 10 | p = Person("Bob", "42") 11 | print(p.str()) -------------------------------------------------------------------------------- /51/examples/orderedhash.mp: -------------------------------------------------------------------------------- 1 | # ordered hash 2 | println("ordered hash") 3 | h1 = @{"a": 1, 4 | "b": 2, 5 | "c": 3, 6 | "d": 4, 7 | "e": 5, 8 | "f": 6, 9 | "g": 7, 10 | } 11 | println(h1) 12 | 13 | println() 14 | println("un-ordered hash") 15 | # un-ordered hash 16 | h2 = {"a": 1, 17 | "b": 2, 18 | "c": 3, 19 | "d": 4, 20 | "e": 5, 21 | "f": 6, 22 | "g": 7, 23 | } 24 | println(h2) -------------------------------------------------------------------------------- /51/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /51/examples/pipe.mp: -------------------------------------------------------------------------------- 1 | struct demo { 2 | fn Uppercase(s) { 3 | return s.upper() 4 | } 5 | } 6 | 7 | fn uppercase(s) { 8 | return s.upper() 9 | } 10 | 11 | //函数调用 12 | upper_str1 = "hello, world" |> uppercase 13 | println(upper_str1) 14 | 15 | upper_str2 = "hello, world" |> uppercase() 16 | println(upper_str2) 17 | 18 | //方法调用 19 | demo_struct = demo() 20 | upper_str1 = "hello, world" |> demo_struct.Uppercase() 21 | println(upper_str1) 22 | 23 | upper_str2 = "hello, world" |> demo_struct.Uppercase 24 | println(upper_str2) 25 | 26 | -------------------------------------------------------------------------------- /51/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /51/examples/struct4.mp: -------------------------------------------------------------------------------- 1 | struct math 2 | { 3 | let Name = "MATH" 4 | let arr = [1,2,3] 5 | let hs ={ "a": "hello", "b" : (x,y) => { x + y} } 6 | fn Add(x,y) { return x + y } 7 | fn Demo() { println(self.arr[2]) } 8 | fn Demo2() { println(self.hs["b"](4,4)) } 9 | 10 | } 11 | 12 | m1 = math() 13 | printf("name=%s\n", m1.Name) # 这里m1.Name中的Name就是一个Identifier 14 | printf("2 + 3 = %d\n", m1.Add(2,3)) # 这里m1.Add()中的Add()就是一个函数调用 15 | m1.Demo() # 这里会打印'3' 16 | m1.Demo2() -------------------------------------------------------------------------------- /51/examples/struct5.mp: -------------------------------------------------------------------------------- 1 | # 测试结构的可变参数 2 | struct math 3 | { 4 | let name = "math" 5 | 6 | # 构造函数 7 | fn init(x, y, args...) { 8 | self.x = x 9 | self.y= y 10 | printf("Hello %s\n", self.name) 11 | for i in args { 12 | printf("In init, i=%d\n", i) 13 | } 14 | } 15 | 16 | fn Sum(x, y, args...) { 17 | w = x + y 18 | for i in args { 19 | w = w + i 20 | } 21 | return w 22 | } 23 | 24 | } 25 | 26 | //m1 = math(10, 12, 4,5,6,7) 27 | printf("sum = %d\n", math(10, 12, 4,5,6,7).Sum(2,3,4,5,6,7)) 28 | -------------------------------------------------------------------------------- /51/examples/sub_package2/calc.mp: -------------------------------------------------------------------------------- 1 | fn Divide(x, y) { 2 | return x / y 3 | } 4 | -------------------------------------------------------------------------------- /51/examples/try2.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | } -------------------------------------------------------------------------------- /51/examples/try3.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | try { 11 | throw [1,2,3] 12 | } catch ex { 13 | printf("ex=%s\n", ex) 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /51/examples/varargs.mp: -------------------------------------------------------------------------------- 1 | let sum = fn(x, y, args...) { 2 | w = x + y 3 | for i in args { 4 | w = w + i 5 | } 6 | return w 7 | }(2,3,4,5,6,7) 8 | println(sum) 9 | 10 | let add2 = fn(x, args...) { 11 | w = x 12 | for i in args { 13 | w = w + i 14 | } 15 | return w 16 | } 17 | 18 | let add1 = fn(x,y, args...) { 19 | return add2(x+y, args...) 20 | } 21 | println(add1(1, 2, 3, 4, 5)) 22 | 23 | 24 | plus = fn(nums...) { 25 | sum = 0 26 | for n in nums { 27 | sum = sum + n 28 | } 29 | return sum 30 | } 31 | println(plus(1, 2, 3)) 32 | lst = [4, 5, 6] 33 | println(plus(lst...)) -------------------------------------------------------------------------------- /51/readme.txt: -------------------------------------------------------------------------------- 1 | ordered hash -------------------------------------------------------------------------------- /51/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /51/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /52/embed/attachments.json: -------------------------------------------------------------------------------- 1 | { 2 | "main": "embed/linq_demo.mp", 3 | "linq/linq": "embed/linq/linq.mp" 4 | } -------------------------------------------------------------------------------- /52/embed/embedder.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haifenghuang/magpie-language-design/9cba4488e73394620289fff856125885502e9cbc/52/embed/embedder.exe -------------------------------------------------------------------------------- /52/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /52/examples/compound_assign_operators.mp: -------------------------------------------------------------------------------- 1 | a = 5 2 | a += 12 3 | 4 | b = 8 5 | b -= 3 6 | 7 | c = 12 8 | c *= 2 9 | 10 | d = 16 11 | d /= 2 12 | 13 | printf("a=%d, b=%d, c=%d, d=%d\n", a, b, c, d) 14 | 15 | s = "hello" 16 | s += " world" 17 | println(s) -------------------------------------------------------------------------------- /52/examples/decorator.mp: -------------------------------------------------------------------------------- 1 | fn timer(otherfn) { 2 | return fn() { 3 | println("timer start") 4 | otherfn($_) 5 | println("timer end") 6 | } 7 | } 8 | 9 | fn log(otherfn) { 10 | return fn() { 11 | println("otherfn start") 12 | otherfn($_) 13 | println("otherfn end") 14 | } 15 | } 16 | 17 | @log 18 | @timer 19 | fn sum(x, y) { 20 | printf("%d + %d = %d\n", x, y, x+y) 21 | } 22 | 23 | sum(1,2) -------------------------------------------------------------------------------- /52/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /52/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /52/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | math = Math(2,3) 6 | printf("math.Add() = %g\n", math.Add()) 7 | 8 | printf("Math.add() = %g\n", Math(2,3).Add()) 9 | 10 | # error, '_add' not exported 11 | # println(_add(2,3)) 12 | -------------------------------------------------------------------------------- /52/examples/interpolateString.mp: -------------------------------------------------------------------------------- 1 | ax = "hello" 2 | bx = 1024 3 | println("\\$ax = ${ax}, bx = $bx, ${ax") -------------------------------------------------------------------------------- /52/examples/misc.mp: -------------------------------------------------------------------------------- 1 | fn Person(name, age) { 2 | self_ = {} 3 | self_.name = name 4 | self_.age = age 5 | self_.str = fn() { 6 | return self_.name + ", aged " + self_.age 7 | } 8 | return self_ 9 | } 10 | p = Person("Bob", "42") 11 | print(p.str()) -------------------------------------------------------------------------------- /52/examples/orderedhash.mp: -------------------------------------------------------------------------------- 1 | # ordered hash 2 | println("ordered hash") 3 | h1 = @{"a": 1, 4 | "b": 2, 5 | "c": 3, 6 | "d": 4, 7 | "e": 5, 8 | "f": 6, 9 | "g": 7, 10 | } 11 | println(h1) 12 | 13 | println() 14 | println("un-ordered hash") 15 | # un-ordered hash 16 | h2 = {"a": 1, 17 | "b": 2, 18 | "c": 3, 19 | "d": 4, 20 | "e": 5, 21 | "f": 6, 22 | "g": 7, 23 | } 24 | println(h2) -------------------------------------------------------------------------------- /52/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /52/examples/pipe.mp: -------------------------------------------------------------------------------- 1 | struct demo { 2 | fn Uppercase(s) { 3 | return s.upper() 4 | } 5 | } 6 | 7 | fn uppercase(s) { 8 | return s.upper() 9 | } 10 | 11 | //函数调用 12 | upper_str1 = "hello, world" |> uppercase 13 | println(upper_str1) 14 | 15 | upper_str2 = "hello, world" |> uppercase() 16 | println(upper_str2) 17 | 18 | //方法调用 19 | demo_struct = demo() 20 | upper_str1 = "hello, world" |> demo_struct.Uppercase() 21 | println(upper_str1) 22 | 23 | upper_str2 = "hello, world" |> demo_struct.Uppercase 24 | println(upper_str2) 25 | 26 | -------------------------------------------------------------------------------- /52/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /52/examples/struct4.mp: -------------------------------------------------------------------------------- 1 | struct math 2 | { 3 | let Name = "MATH" 4 | let arr = [1,2,3] 5 | let hs ={ "a": "hello", "b" : (x,y) => { x + y} } 6 | fn Add(x,y) { return x + y } 7 | fn Demo() { println(self.arr[2]) } 8 | fn Demo2() { println(self.hs["b"](4,4)) } 9 | 10 | } 11 | 12 | m1 = math() 13 | printf("name=%s\n", m1.Name) # 这里m1.Name中的Name就是一个Identifier 14 | printf("2 + 3 = %d\n", m1.Add(2,3)) # 这里m1.Add()中的Add()就是一个函数调用 15 | m1.Demo() # 这里会打印'3' 16 | m1.Demo2() -------------------------------------------------------------------------------- /52/examples/struct5.mp: -------------------------------------------------------------------------------- 1 | # 测试结构的可变参数 2 | struct math 3 | { 4 | let name = "math" 5 | 6 | # 构造函数 7 | fn init(x, y, args...) { 8 | self.x = x 9 | self.y= y 10 | printf("Hello %s\n", self.name) 11 | for i in args { 12 | printf("In init, i=%d\n", i) 13 | } 14 | } 15 | 16 | fn Sum(x, y, args...) { 17 | w = x + y 18 | for i in args { 19 | w = w + i 20 | } 21 | return w 22 | } 23 | 24 | } 25 | 26 | //m1 = math(10, 12, 4,5,6,7) 27 | printf("sum = %d\n", math(10, 12, 4,5,6,7).Sum(2,3,4,5,6,7)) 28 | -------------------------------------------------------------------------------- /52/examples/try2.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | } -------------------------------------------------------------------------------- /52/examples/try3.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | try { 11 | throw [1,2,3] 12 | } catch ex { 13 | printf("ex=%s\n", ex) 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /52/examples/varargs.mp: -------------------------------------------------------------------------------- 1 | let sum = fn(x, y, args...) { 2 | w = x + y 3 | for i in args { 4 | w = w + i 5 | } 6 | return w 7 | }(2,3,4,5,6,7) 8 | println(sum) 9 | 10 | let add2 = fn(x, args...) { 11 | w = x 12 | for i in args { 13 | w = w + i 14 | } 15 | return w 16 | } 17 | 18 | let add1 = fn(x,y, args...) { 19 | return add2(x+y, args...) 20 | } 21 | println(add1(1, 2, 3, 4, 5)) 22 | 23 | 24 | plus = fn(nums...) { 25 | sum = 0 26 | for n in nums { 27 | sum = sum + n 28 | } 29 | return sum 30 | } 31 | println(plus(1, 2, 3)) 32 | lst = [4, 5, 6] 33 | println(plus(lst...)) -------------------------------------------------------------------------------- /52/readme.txt: -------------------------------------------------------------------------------- 1 | singe binary executable -------------------------------------------------------------------------------- /52/run_embed.sh: -------------------------------------------------------------------------------- 1 | ./run.sh 2 | rm -f ./linq_demo.exe 3 | ./embed/embedder.exe -attachments ./embed/attachments.json -exe ./magpie-windows-amd64.exe -out ./linq_demo.exe -------------------------------------------------------------------------------- /52/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /52/src/github.com/maja42/ember/errors.go: -------------------------------------------------------------------------------- 1 | package ember 2 | 3 | import "fmt" 4 | 5 | // AttErr reports problems with embedded attachments. 6 | type AttErr string 7 | 8 | func (o *AttErr) Error() string { 9 | return string(*o) 10 | } 11 | 12 | func newAttErr(format string, a ...interface{}) *AttErr { 13 | err := AttErr(fmt.Sprintf(format, a...)) 14 | return &err 15 | } 16 | -------------------------------------------------------------------------------- /52/src/github.com/maja42/ember/go.mod: -------------------------------------------------------------------------------- 1 | module github.com/maja42/ember 2 | 3 | go 1.15 4 | 5 | require github.com/stretchr/testify v1.6.1 6 | -------------------------------------------------------------------------------- /52/src/github.com/maja42/ember/internal/toc.go: -------------------------------------------------------------------------------- 1 | package internal 2 | 3 | // TOC (=table of content) lists all attachments of an executable. 4 | // The order of attachments in the TOC reflects the order of attachment data afterwards. 5 | // The TOC is embedded as json prior to the first attachment, guarded by a boundary byte-pattern on both sides. 6 | type TOC []Attachment 7 | 8 | // Attachment represents a single embedded resource. 9 | type Attachment struct { 10 | Name string // Resource name 11 | Data string //Resource content 12 | } 13 | -------------------------------------------------------------------------------- /52/src/github.com/maja42/ember/marker.go: -------------------------------------------------------------------------------- 1 | package ember 2 | 3 | import ( 4 | "fmt" 5 | "time" 6 | ) 7 | 8 | // marker is compiled into executables which accept attachments. 9 | // This allows the embedder to verify that the target file is compatible. 10 | var marker = "~~MagicMarker for maja42/ember/v1~~" 11 | 12 | func init() { 13 | // Dead code that uses 'marker' and is not eliminated by the compiler. 14 | if time.Now().Nanosecond() == -42 { 15 | fmt.Print(marker) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /52/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /53/embed/attachments.json: -------------------------------------------------------------------------------- 1 | { 2 | "main": "embed/linq_demo.mp" 3 | } -------------------------------------------------------------------------------- /53/embed/embedder.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haifenghuang/magpie-language-design/9cba4488e73394620289fff856125885502e9cbc/53/embed/embedder.exe -------------------------------------------------------------------------------- /53/examples/Cfor.mp: -------------------------------------------------------------------------------- 1 | for (i = 0; i < 5; i++) { # 类似c语言的for循环, '()'必须要有 2 | if (i > 4) { break } 3 | if (i == 2) { continue } 4 | printf("i is %d\n", i) 5 | } 6 | 7 | i = 0 8 | for (; i < 5; i++) { # 无初期化语句 9 | if (i > 4) { break } 10 | if (i == 2) { continue } 11 | printf("i is %d\n", i) 12 | } 13 | 14 | i = 0 15 | for (; i < 5;;) { # 无初期化和更新语句 16 | if (i > 4) { break } 17 | if (i == 2) { i++ continue } 18 | printf("i is %d\n", i) 19 | i++ # 更新语句 20 | } 21 | 22 | i = 0 23 | for (;;;) { # 等价于'for { block }'语句 24 | if (i > 4) { break } 25 | printf("i is %d\n", i) 26 | i++ # 更新语句 27 | } -------------------------------------------------------------------------------- /53/examples/compound_assign_operators.mp: -------------------------------------------------------------------------------- 1 | a = 5 2 | a += 12 3 | 4 | b = 8 5 | b -= 3 6 | 7 | c = 12 8 | c *= 2 9 | 10 | d = 16 11 | d /= 2 12 | 13 | printf("a=%d, b=%d, c=%d, d=%d\n", a, b, c, d) 14 | 15 | s = "hello" 16 | s += " world" 17 | println(s) -------------------------------------------------------------------------------- /53/examples/decorator.mp: -------------------------------------------------------------------------------- 1 | fn timer(otherfn) { 2 | return fn() { 3 | println("timer start") 4 | otherfn($_) 5 | println("timer end") 6 | } 7 | } 8 | 9 | fn log(otherfn) { 10 | return fn() { 11 | println("otherfn start") 12 | otherfn($_) 13 | println("otherfn end") 14 | } 15 | } 16 | 17 | @log 18 | @timer 19 | fn sum(x, y) { 20 | printf("%d + %d = %d\n", x, y, x+y) 21 | } 22 | 23 | sum(1,2) -------------------------------------------------------------------------------- /53/examples/file.mp: -------------------------------------------------------------------------------- 1 | file, err = open("./file.log", "w+") 2 | if err { 3 | println(err) 4 | os.exit(1) 5 | } 6 | 7 | file.writeLine("This is the first line") 8 | file.writeLine("This is the second line") 9 | file.writeString("这是第三行\n") 10 | file.close() 11 | 12 | 13 | printf("=====Reading file=====\n") 14 | file, err = open("./file.log", "r") 15 | if err { 16 | println(err) 17 | os.exit(1) 18 | } 19 | 20 | println(file.readLine()) 21 | println(file.readLine()) 22 | println(file.readLine()) 23 | file.close() 24 | 25 | # stdin, stdout 26 | print("Please type your name:") 27 | name = stdin.readLine() 28 | stdout.writeLine("Hello " + name + "!") 29 | -------------------------------------------------------------------------------- /53/examples/goObj.mp: -------------------------------------------------------------------------------- 1 | # using go's Printf 2 | fmt.Printf("Hello %s!\n", "go function") 3 | 4 | # using go's Sprintf 5 | s = fmt.Sprintf("Hello %s!", "World") 6 | # print with magpie's builtin function `print` 7 | println(s) 8 | 9 | fmt.Println(runtime.GOOS) 10 | fmt.Println(runtime.GOARCH) -------------------------------------------------------------------------------- /53/examples/import.mp: -------------------------------------------------------------------------------- 1 | import sub_package.calc 2 | 3 | println(Add(2,3)) 4 | 5 | math = Math(2,3) 6 | printf("math.Add() = %g\n", math.Add()) 7 | 8 | printf("Math.add() = %g\n", Math(2,3).Add()) 9 | 10 | # error, '_add' not exported 11 | # println(_add(2,3)) 12 | -------------------------------------------------------------------------------- /53/examples/interpolateString.mp: -------------------------------------------------------------------------------- 1 | ax = "hello" 2 | bx = 1024 3 | println("\\$ax = ${ax}, bx = $bx, ${ax") -------------------------------------------------------------------------------- /53/examples/misc.mp: -------------------------------------------------------------------------------- 1 | fn Person(name, age) { 2 | self_ = {} 3 | self_.name = name 4 | self_.age = age 5 | self_.str = fn() { 6 | return self_.name + ", aged " + self_.age 7 | } 8 | return self_ 9 | } 10 | p = Person("Bob", "42") 11 | print(p.str()) -------------------------------------------------------------------------------- /53/examples/orderedhash.mp: -------------------------------------------------------------------------------- 1 | # ordered hash 2 | println("ordered hash") 3 | h1 = @{"a": 1, 4 | "b": 2, 5 | "c": 3, 6 | "d": 4, 7 | "e": 5, 8 | "f": 6, 9 | "g": 7, 10 | } 11 | println(h1) 12 | 13 | println() 14 | println("un-ordered hash") 15 | # un-ordered hash 16 | h2 = {"a": 1, 17 | "b": 2, 18 | "c": 3, 19 | "d": 4, 20 | "e": 5, 21 | "f": 6, 22 | "g": 7, 23 | } 24 | println(h2) -------------------------------------------------------------------------------- /53/examples/os.mp: -------------------------------------------------------------------------------- 1 | println("====ENVIRONMENT[PATH]====") 2 | println(os.getenv("PATH")) 3 | os.exit(0) -------------------------------------------------------------------------------- /53/examples/pipe.mp: -------------------------------------------------------------------------------- 1 | struct demo { 2 | fn Uppercase(s) { 3 | return s.upper() 4 | } 5 | } 6 | 7 | fn uppercase(s) { 8 | return s.upper() 9 | } 10 | 11 | //函数调用 12 | upper_str1 = "hello, world" |> uppercase 13 | println(upper_str1) 14 | 15 | upper_str2 = "hello, world" |> uppercase() 16 | println(upper_str2) 17 | 18 | //方法调用 19 | demo_struct = demo() 20 | upper_str1 = "hello, world" |> demo_struct.Uppercase() 21 | println(upper_str1) 22 | 23 | upper_str2 = "hello, world" |> demo_struct.Uppercase 24 | println(upper_str2) 25 | 26 | -------------------------------------------------------------------------------- /53/examples/regexp.mp: -------------------------------------------------------------------------------- 1 | name = "Huang HaiFeng" 2 | if name =~ /huang/i { 3 | println("Hello Huang"); 4 | } 5 | 6 | if ( name !~ /xxx/ ) { 7 | println( "Hello xxx" ); 8 | } 9 | 10 | if name =~ /Huang/ { 11 | println("Hello Huang"); 12 | } 13 | 14 | regex = /\d+\t/.match("abc 123 mnj") 15 | if (regex) { 16 | println("regex matched") 17 | } 18 | 19 | let arr = / /.split("ba na za") 20 | if (len(arr) > 0) { 21 | printf("/ /.split('ba na za')[1]=%s\n", arr[1]) 22 | } 23 | else { 24 | println("Not splitted") 25 | } -------------------------------------------------------------------------------- /53/examples/struct4.mp: -------------------------------------------------------------------------------- 1 | struct math 2 | { 3 | let Name = "MATH" 4 | let arr = [1,2,3] 5 | let hs ={ "a": "hello", "b" : (x,y) => { x + y} } 6 | fn Add(x,y) { return x + y } 7 | fn Demo() { println(self.arr[2]) } 8 | fn Demo2() { println(self.hs["b"](4,4)) } 9 | 10 | } 11 | 12 | m1 = math() 13 | printf("name=%s\n", m1.Name) # 这里m1.Name中的Name就是一个Identifier 14 | printf("2 + 3 = %d\n", m1.Add(2,3)) # 这里m1.Add()中的Add()就是一个函数调用 15 | m1.Demo() # 这里会打印'3' 16 | m1.Demo2() -------------------------------------------------------------------------------- /53/examples/struct5.mp: -------------------------------------------------------------------------------- 1 | # 测试结构的可变参数 2 | struct math 3 | { 4 | let name = "math" 5 | 6 | # 构造函数 7 | fn init(x, y, args...) { 8 | self.x = x 9 | self.y= y 10 | printf("Hello %s\n", self.name) 11 | for i in args { 12 | printf("In init, i=%d\n", i) 13 | } 14 | } 15 | 16 | fn Sum(x, y, args...) { 17 | w = x + y 18 | for i in args { 19 | w = w + i 20 | } 21 | return w 22 | } 23 | 24 | } 25 | 26 | //m1 = math(10, 12, 4,5,6,7) 27 | printf("sum = %d\n", math(10, 12, 4,5,6,7).Sum(2,3,4,5,6,7)) 28 | -------------------------------------------------------------------------------- /53/examples/try2.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | } -------------------------------------------------------------------------------- /53/examples/try3.mp: -------------------------------------------------------------------------------- 1 | # nesting 2 | try { 3 | try { 4 | throw "inner catch error" 5 | } finally { 6 | println("finally") 7 | } 8 | } catch ex { 9 | println(ex) 10 | try { 11 | throw [1,2,3] 12 | } catch ex { 13 | printf("ex=%s\n", ex) 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /53/examples/varargs.mp: -------------------------------------------------------------------------------- 1 | let sum = fn(x, y, args...) { 2 | w = x + y 3 | for i in args { 4 | w = w + i 5 | } 6 | return w 7 | }(2,3,4,5,6,7) 8 | println(sum) 9 | 10 | let add2 = fn(x, args...) { 11 | w = x 12 | for i in args { 13 | w = w + i 14 | } 15 | return w 16 | } 17 | 18 | let add1 = fn(x,y, args...) { 19 | return add2(x+y, args...) 20 | } 21 | println(add1(1, 2, 3, 4, 5)) 22 | 23 | 24 | plus = fn(nums...) { 25 | sum = 0 26 | for n in nums { 27 | sum = sum + n 28 | } 29 | return sum 30 | } 31 | println(plus(1, 2, 3)) 32 | lst = [4, 5, 6] 33 | println(plus(lst...)) -------------------------------------------------------------------------------- /53/readme.txt: -------------------------------------------------------------------------------- 1 | standard library -------------------------------------------------------------------------------- /53/run_embed.sh: -------------------------------------------------------------------------------- 1 | ./run.sh 2 | rm -f ./linq_demo.exe 3 | ./embed/embedder.exe -attachments ./embed/attachments.json -exe ./magpie-windows-amd64.exe -out ./linq_demo.exe -------------------------------------------------------------------------------- /53/run_wasm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export GOPATH=$(pwd) 3 | 4 | # for newer go version's build error: "package XXX is not in GOROOT" 5 | export GO111MODULE=off 6 | 7 | olddir=$(pwd) 8 | # build-wasm 9 | cd wasm/cmd/wasm 10 | echo "Building wasm..." 11 | GOOS=js GOARCH=wasm go build -o ../../assets/magpie.wasm 12 | 13 | # run server 14 | cd ../server 15 | echo "Running server..." 16 | echo " Now open the browser, and type 'http://localhost:9090'" 17 | go run main.go 18 | 19 | 20 | -------------------------------------------------------------------------------- /53/src/github.com/maja42/ember/errors.go: -------------------------------------------------------------------------------- 1 | package ember 2 | 3 | import "fmt" 4 | 5 | // AttErr reports problems with embedded attachments. 6 | type AttErr string 7 | 8 | func (o *AttErr) Error() string { 9 | return string(*o) 10 | } 11 | 12 | func newAttErr(format string, a ...interface{}) *AttErr { 13 | err := AttErr(fmt.Sprintf(format, a...)) 14 | return &err 15 | } 16 | -------------------------------------------------------------------------------- /53/src/github.com/maja42/ember/go.mod: -------------------------------------------------------------------------------- 1 | module github.com/maja42/ember 2 | 3 | go 1.15 4 | 5 | require github.com/stretchr/testify v1.6.1 6 | -------------------------------------------------------------------------------- /53/src/github.com/maja42/ember/internal/toc.go: -------------------------------------------------------------------------------- 1 | package internal 2 | 3 | // TOC (=table of content) lists all attachments of an executable. 4 | // The order of attachments in the TOC reflects the order of attachment data afterwards. 5 | // The TOC is embedded as json prior to the first attachment, guarded by a boundary byte-pattern on both sides. 6 | type TOC []Attachment 7 | 8 | // Attachment represents a single embedded resource. 9 | type Attachment struct { 10 | Name string // Resource name 11 | Data string //Resource content 12 | } 13 | -------------------------------------------------------------------------------- /53/src/github.com/maja42/ember/marker.go: -------------------------------------------------------------------------------- 1 | package ember 2 | 3 | import ( 4 | "fmt" 5 | "time" 6 | ) 7 | 8 | // marker is compiled into executables which accept attachments. 9 | // This allows the embedder to verify that the target file is compatible. 10 | var marker = "~~MagicMarker for maja42/ember/v1~~" 11 | 12 | func init() { 13 | // Dead code that uses 'marker' and is not eliminated by the compiler. 14 | if time.Now().Nanosecond() == -42 { 15 | fmt.Print(marker) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /53/wasm/cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | err := http.ListenAndServe(":9090", http.FileServer(http.Dir("../../assets"))) 10 | if err != nil { 11 | fmt.Println("Failed to start server", err) 12 | return 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /doc/01/AST.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haifenghuang/magpie-language-design/9cba4488e73394620289fff856125885502e9cbc/doc/01/AST.png -------------------------------------------------------------------------------- /doc/01/AST2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haifenghuang/magpie-language-design/9cba4488e73394620289fff856125885502e9cbc/doc/01/AST2.png -------------------------------------------------------------------------------- /doc/01/expr_func_map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haifenghuang/magpie-language-design/9cba4488e73394620289fff856125885502e9cbc/doc/01/expr_func_map.png -------------------------------------------------------------------------------- /doc/01/language-flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haifenghuang/magpie-language-design/9cba4488e73394620289fff856125885502e9cbc/doc/01/language-flow.png -------------------------------------------------------------------------------- /doc/01/token.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haifenghuang/magpie-language-design/9cba4488e73394620289fff856125885502e9cbc/doc/01/token.png -------------------------------------------------------------------------------- /doc/22/ScreenHunter 45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haifenghuang/magpie-language-design/9cba4488e73394620289fff856125885502e9cbc/doc/22/ScreenHunter 45.png -------------------------------------------------------------------------------- /doc/22/html.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haifenghuang/magpie-language-design/9cba4488e73394620289fff856125885502e9cbc/doc/22/html.png -------------------------------------------------------------------------------- /doc/22/webAssembly1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haifenghuang/magpie-language-design/9cba4488e73394620289fff856125885502e9cbc/doc/22/webAssembly1.png -------------------------------------------------------------------------------- /doc/22/webAssembly2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haifenghuang/magpie-language-design/9cba4488e73394620289fff856125885502e9cbc/doc/22/webAssembly2.png -------------------------------------------------------------------------------- /doc/26/format0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haifenghuang/magpie-language-design/9cba4488e73394620289fff856125885502e9cbc/doc/26/format0.png -------------------------------------------------------------------------------- /doc/26/formatter1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haifenghuang/magpie-language-design/9cba4488e73394620289fff856125885502e9cbc/doc/26/formatter1.png -------------------------------------------------------------------------------- /doc/26/formatter2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haifenghuang/magpie-language-design/9cba4488e73394620289fff856125885502e9cbc/doc/26/formatter2.png -------------------------------------------------------------------------------- /doc/26/printf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haifenghuang/magpie-language-design/9cba4488e73394620289fff856125885502e9cbc/doc/26/printf.png -------------------------------------------------------------------------------- /doc/31/go_magpie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haifenghuang/magpie-language-design/9cba4488e73394620289fff856125885502e9cbc/doc/31/go_magpie.png -------------------------------------------------------------------------------- /doc/40/in_operator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haifenghuang/magpie-language-design/9cba4488e73394620289fff856125885502e9cbc/doc/40/in_operator.png -------------------------------------------------------------------------------- /doc/41/dot_operator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haifenghuang/magpie-language-design/9cba4488e73394620289fff856125885502e9cbc/doc/41/dot_operator.png -------------------------------------------------------------------------------- /run_clean.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | OLD_PWD=$PWD 4 | for path in `seq -w 1 53` 5 | do 6 | cd $OLD_PWD/$path 7 | echo "clean dir $path ..." 8 | rm -rf magpie-* 9 | rm -f *.exe 10 | done 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /run_format.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | OLD_PWD=$PWD 4 | 5 | for path in `seq -w 1 53` 6 | do 7 | cd $OLD_PWD/$path 8 | echo "In $path..." 9 | export GOPATH=$(pwd) 10 | # for newer go version's build error: "package XXX is not in GOROOT" 11 | export GO111MODULE=off 12 | 13 | # format each go file 14 | echo "Formatting go file..." 15 | go fmt ./main.go > /dev/null 16 | echo " main.go" 17 | 18 | for file in `find ./src/magpie -name "*.go"`; do 19 | echo " `basename $file`" 20 | go fmt $file > /dev/null 21 | done 22 | done 23 | --------------------------------------------------------------------------------