@@ -1,12 +1,10 @@
1−package main
1+package utils
22
33import (
44 "fmt"
55 "io/ioutil"
6− "os"
7− "path/filepath"
8− "plugin"
9− "runtime"
6+
7+ "github.com/replit/prybar/linenoise"
108)
119
1210type PluginBase interface {
@@ -45,64 +43,20 @@ type PluginSetPrompts interface {
4543 SetPrompts(ps1, ps2 string)
4644}
4745
48−type Langauge struct {
46+type Language struct {
4947 ptr PluginBase
48+ ps1 string
5049}
5150
52−func finalizer(f *Langauge) {
53− fmt.Println("a finalizer has run.")
54−}
55−
56−func GetLanguage(name string) *Langauge {
57− base := "."
58− exe, err := os.Executable()
59− for {
60− o, err := os.Readlink(exe)
61− if err == nil {
62− exe = o
63− } else {
64− break
65− }
66− }
67−
68− base = filepath.Dir(exe)
69− plug, err := plugin.Open(base + "/plugins/" + name + ".so")
70−
71− if err != nil {
72− fmt.Println(err)
73− os.Exit(1)
74− }
75−
76− sym, err := plug.Lookup("Instance")
77− if err != nil {
78− fmt.Println(err)
79− os.Exit(1)
80− }
81−
82− var lang PluginBase
83− lang, ok := sym.(PluginBase)
84− if !ok {
85− fmt.Println("module did not export Language interface")
86− os.Exit(1)
87− }
88−
89− result := &Langauge{
90− ptr: lang,
91− }
92− lang.Open()
93− runtime.SetFinalizer(result, finalizer)
94− return result
95−}
96−
97−func (lang Langauge) Version() string {
51+func (lang Language) Version() string {
9852 return lang.ptr.Version()
9953}
10054
101−func (lang Langauge) Eval(code string) {
55+func (lang Language) Eval(code string) {
10256 lang.ptr.(PluginEval).Eval(code)
10357}
10458
105−func (lang Langauge) EvalAndTryToPrint(code string) {
59+func (lang Language) EvalAndTryToPrint(code string) {
10660 ee, ok := lang.ptr.(PluginEvalExpression)
10761 if ok {
10862 fmt.Println(ee.EvalExpression(code))
@@ -111,7 +65,7 @@ func (lang Langauge) EvalAndTryToPrint(code string) {
11165 }
11266}
11367
114−func (lang Langauge) REPLLikeEval(code string) {
68+func (lang Language) REPLLikeEval(code string) {
11569 rle, ok := lang.ptr.(PluginREPLLikeEval)
11670 if ok {
11771 rle.REPLLikeEval(code)
@@ -126,7 +80,7 @@ func (lang Langauge) REPLLikeEval(code string) {
12680 }
12781}
12882
129−func (lang Langauge) EvalFile(file string, args []string) {
83+func (lang Language) EvalFile(file string, args []string) {
13084 pef, ok := lang.ptr.(PluginEvalFile)
13185 if ok {
13286 pef.EvalFile(file, args)
@@ -139,7 +93,7 @@ func (lang Langauge) EvalFile(file string, args []string) {
13993 }
14094}
14195
142−func (lang Langauge) REPL() {
96+func (lang Language) REPL() {
14397 repl, ok := lang.ptr.(PluginREPL)
14498 if ok {
14599 repl.REPL()
@@ -148,18 +102,18 @@ func (lang Langauge) REPL() {
148102 }
149103}
150104
151−func (lang Langauge) InternalREPL() {
105+func (lang Language) InternalREPL() {
152106 for {
153− line, err := Linenoise(ps1)
107+ line, err := linenoise.Linenoise(lang.ps1)
154108 if err != nil {
155109 break
156110 }
157111 lang.REPLLikeEval(line)
158− LinenoiseHistoryAdd(line)
112+ linenoise.LinenoiseHistoryAdd(line)
159113 }
160114}
161115
162−func (lang Langauge) SetPrompts(ps1, ps2 string) {
116+func (lang Language) SetPrompts(ps1, ps2 string) {
163117 ee, ok := lang.ptr.(PluginSetPrompts)
164118 if ok {
165119 ee.SetPrompts(ps1, ps2)