Sfoglia il codice sorgente

mhh... let's try evaluating some code

Lucas Stadler 11 anni fa
parent
commit
73f1e3ade0
1 ha cambiato i file con 60 aggiunte e 0 eliminazioni
  1. 60 0
      go/linguaevalia.go

+ 60 - 0
go/linguaevalia.go

@ -0,0 +1,60 @@
1
package main
2
3
import (
4
	"fmt"
5
	"os"
6
	"os/exec"
7
)
8
9
type Language interface {
10
	Eval(code string) (result []byte, err error)
11
}
12
13
type LanguageGo struct{}
14
15
var Go = LanguageGo{}
16
17
func (g LanguageGo) Eval(code string) ([]byte, error) {
18
	// write code to temp file
19
	f, err := writeCode(code)
20
	defer f.Close()
21
	if err != nil {
22
		return nil, err
23
	}
24
	// `go run` it
25
	res, err := runCode(f)
26
	if err != nil {
27
		return nil, err
28
	}
29
	// remove the file
30
	os.Remove(f.Name())
31
	// return output
32
	return res, nil
33
}
34
35
func writeCode(code string) (*os.File, error) {
36
	// create tmp file
37
	f, err := os.Create("/tmp/linguaevalia-go.go") // FIXME: actually create a tmpfile
38
	if err != nil {
39
		return f, err
40
	}
41
	// write code to it
42
	_, err = f.Write([]byte(code))
43
	if err != nil {
44
		return f, err
45
	}
46
	return f, nil
47
}
48
49
func runCode(f *os.File) ([]byte, error) {
50
	cmd := exec.Command("go", "run", f.Name())
51
	return cmd.CombinedOutput()
52
}
53
54
func main() {
55
	res, err := Go.Eval("package main\n\nimport (\n\t\"fmt\"\n)\n\nfunc main() {\n\tfmt.Println(\"Hello, World!\")\n}\n")
56
	if err != nil {
57
		fmt.Println("Error evaluating: ", err)
58
	}
59
	os.Stdout.Write(res)
60
}