2024-07-11 23:58:35 -04:00
|
|
|
//go:build js && wasm
|
|
|
|
// +build js,wasm
|
|
|
|
|
2022-09-03 23:15:35 -04:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bufio"
|
2024-07-11 23:58:35 -04:00
|
|
|
"bytes"
|
2022-09-03 23:15:35 -04:00
|
|
|
"fmt"
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
2024-07-11 23:58:35 -04:00
|
|
|
"runtime"
|
|
|
|
"syscall/js"
|
2022-09-03 23:15:35 -04:00
|
|
|
"varaq/varaq"
|
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
2024-07-11 23:58:35 -04:00
|
|
|
if runtime.GOARCH == "wasm" {
|
|
|
|
done := make(chan struct{}, 0)
|
|
|
|
js.Global().Set("varaq", js.FuncOf(jsInterpret))
|
|
|
|
fmt.Println("varaq WASM init, Qa'pla!")
|
|
|
|
<-done
|
2022-09-03 23:15:35 -04:00
|
|
|
} else {
|
2024-07-11 23:58:35 -04:00
|
|
|
argsCount := len(os.Args[1:])
|
|
|
|
if argsCount >= 1 {
|
|
|
|
runFile(os.Args[1])
|
|
|
|
} else {
|
|
|
|
repl()
|
|
|
|
}
|
|
|
|
os.Exit(0)
|
2022-09-03 23:15:35 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func repl() {
|
|
|
|
scanner := bufio.NewScanner(os.Stdin)
|
2024-07-06 21:15:21 -04:00
|
|
|
for fmt.Print("> "); scanner.Scan(); fmt.Print("> ") {
|
2022-09-03 23:15:35 -04:00
|
|
|
line := scanner.Text()
|
|
|
|
if len(line) == 0 {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
err := interpret(line)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("%v\n", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func runFile(path string) {
|
|
|
|
code, err := ioutil.ReadFile(path) // the file is inside the local directory
|
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("%v\n", err)
|
|
|
|
os.Exit(65)
|
|
|
|
}
|
|
|
|
|
|
|
|
err = interpret(string(code))
|
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("%v\n", err)
|
|
|
|
os.Exit(65)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func interpret(src string) error {
|
|
|
|
tokens, err := varaq.Tokenize(src)
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("%v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
code := varaq.Parse(tokens)
|
2023-03-18 22:26:32 -04:00
|
|
|
err = varaq.Interpret(code, os.Args[1:], os.Stdout)
|
2022-09-03 23:15:35 -04:00
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("%v\n", err)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
2024-07-11 23:58:35 -04:00
|
|
|
|
|
|
|
func jsInterpret(this js.Value, args []js.Value) interface{} {
|
|
|
|
if len(args) < 1 {
|
|
|
|
return js.ValueOf("no input")
|
|
|
|
}
|
|
|
|
input := args[0].String()
|
|
|
|
|
|
|
|
tokens, err := varaq.Tokenize(input)
|
|
|
|
if err != nil {
|
|
|
|
return js.ValueOf(fmt.Errorf("%v", err))
|
|
|
|
}
|
|
|
|
|
|
|
|
code := varaq.Parse(tokens)
|
|
|
|
buf := bytes.NewBufferString("")
|
|
|
|
|
|
|
|
strings := make([]string, len(args[1:]))
|
|
|
|
for i, jsVal := range args[1:] {
|
|
|
|
strings[i] = jsVal.String()
|
|
|
|
}
|
|
|
|
|
|
|
|
err = varaq.Interpret(code, strings, buf)
|
|
|
|
if err != nil {
|
|
|
|
return js.ValueOf(fmt.Errorf("%v", err))
|
|
|
|
}
|
|
|
|
|
|
|
|
return js.ValueOf(buf.String())
|
|
|
|
}
|