on master help sign in
Merge pull request #1 from replit/mc-masonstuff
bd47c67Mason Clayton
Dockerfile+23−8
@@ -1,17 +1,32 @@
1FROM ubuntu:bionic
1FROM ubuntu:bionic
2
2
3RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
3RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
4−build-essential wget golang python-dev python3-dev liblua5.2-dev \
4+ build-essential \
5+ wget \
6+ golang \
7+ python-dev \
8+ python3-dev \
9+ liblua5.2-dev \
10+ ruby2.5-dev \
11+ tcl-dev \
5−ruby2.5-dev tcl-dev libnspr4-dev libffi-dev
12+ libnspr4-dev \
13+ libffi-dev
6
14
15+RUN wget \
16+ http://launchpadlibrarian.net/309343864/libmozjs185-dev_1.8.5-1.0.0+dfsg-7_amd64.deb && \
7−RUN wget http://launchpadlibrarian.net/309343864/libmozjs185-dev_1.8.5-1.0.0+dfsg-7_amd64.deb && wget http://launchpadlibrarian.net/309343863/libmozjs185-1.0_1.8.5-1.0.0+dfsg-7_amd64.deb && dpkg -i libmozjs185*.deb && rm libmozjs185*.deb
17+ wget http://launchpadlibrarian.net/309343863/libmozjs185-1.0_1.8.5-1.0.0+dfsg-7_amd64.deb && \
18+ dpkg -i libmozjs185*.deb && rm libmozjs185*.deb
8
19
9−ADD . /prybar
20+RUN mkdir -p /gocode/src/github.com/replit/prybar
10−RUN cd /prybar && make
11
21
22+ENV GOPATH=/gocode
23+
24+ADD . /gocode/src/github.com/replit/prybar
25+
12−WORKDIR /prybar
26+WORKDIR /gocode/src/github.com/replit/prybar
27+
28+RUN make prybar-python2 prybar-python3 prybar-ruby prybar-lua prybar-spidermonkey
13
29
14ENV LC_ALL=C.UTF-8
30ENV LC_ALL=C.UTF-8
15
31
16−ENTRYPOINT [ "/prybar/prybar" ]
17−CMD [ "-h" ]
32+CMD bash
Makefile+10−14
@@ -1,19 +1,15 @@
1−.PHONY: clean default
1+LANGDIR := ./languages
2−
2+LANGS := $(shell ls $(LANGDIR))
3−default: prybar
3+BINS := $(addprefix prybar-,$(LANGS))
4
4
5−deps.lst: mk-deps.sh
5+.PHONY: clean default
6− ./mk-deps.sh > deps.lst
7−
8−-include deps.lst
9
6
10−prybar: src/*.go $(plugins)
7+default: $(BINS)
11− cd src && go build -o ../prybar
12
8
13−plugins/%.so: src/languages/%/*.*
9+prybar-%: ./languages/$(*) ./utils/* ./linenoise/* ./languages/$(*)/*
10+ cp inject_launch.go ./languages/$(*)/inject_launch.go
14− cd src/languages/$* && CGO_LDFLAGS_ALLOW=".*" go build -buildmode=plugin -o ../../../$@
11+ CGO_LDFLAGS_ALLOW=".*" go build -o prybar-$(*) ./languages/$(*)
12+ rm ./languages/$(*)/inject_launch.go
15
13
16clean:
14clean:
17− @rm deps.lst
18− @rm prybar
15+ @rm ./prybar-*
19− @rm plugins/*
README.md+4−8
@@ -1,6 +1,6 @@
1# ![Prybar](logo.svg)
1# ![Prybar](logo.svg)
2
2
3−Prybar is a universal interpreter front-end. Same interface, same REPL, different languages.
3+Prybar is a universal interpreter front-end. Same interface, same REPL, different languages.
4
4
5## Why
5## Why
6
6
@@ -9,7 +9,7 @@ every language implements them differently. We wanted them to all behave the sam
9
9
10## How it works
10## How it works
11
11
12−Prybar, written in Golang, maintains a common command-line interface that calls into
12+Prybar, written in Golang, maintains a common command-line interface that calls into
13a select language backend. The language backends are implemented using cgo and the langauge's C-bindings.
13a select language backend. The language backends are implemented using cgo and the langauge's C-bindings.
14
14
15## Usage
15## Usage
@@ -23,8 +23,6 @@ Usage of ./prybar:
23 -e string
23 -e string
24 expression to print
24 expression to print
25 -i interactive
25 -i interactive
26− -l string
27− langauge (default "python2")
28 -ps1 string
26 -ps1 string
29 PS1 (default "--> ")
27 PS1 (default "--> ")
30 -ps2 string
28 -ps2 string
@@ -43,7 +41,7 @@ Usage of ./prybar:
43
41
44## Building
42## Building
45
43
46−Prybar uses a unix make file to build prybar along with plugins for the langage libraries `pkg-config` detects on your system.
44+Prybar uses a unix make file to build each Prybar binary with `pkg-config` to find language dependencies on your system.
47
45
48### Linux
46### Linux
49
47
@@ -57,9 +55,7 @@ brew install go r ruby python python@2 lua spidermonkey
57
55
58## Docker
56## Docker
59
57
60−The script `./extract.sh` can be used to compile all plugins and produce a tarball containing a `prybar` binary and supporting `plugin.so` files.
58+The script `./extract.sh` can be used to compile and produce a tarball containing all the Prybar binaries. Each binary will be named `prybar-<language>`. You can build all languages by running `make` in the repo's root or run `make prybar-<language>` to build a specific language.
61−
62−
63
59
64## License
60## License
65
61
extract.sh+1−1
@@ -1,3 +1,3 @@
1#!/bin/sh
1#!/bin/sh
2docker build -t prybar .
2docker build -t prybar .
3−docker run prybar tar -zc prybar plugins > prybar.tar.gz
3+docker run prybar bash -c 'tar -zc prybar-*' > prybar.tar.gz
inject_launch.gonew file+8
@@ -0,0 +1,8 @@
1+// this file will be injected into a language's main package at build.
2+package main
3+
4+import "github.com/replit/prybar/utils"
5+
6+func main() {
7+ utils.DoCli(Instance)
8+}
src/languages/R/main.go → languages/R/main.gorenamed+3−8
@@ -37,12 +37,9 @@ import "C"
37
37
38import (
38import (
39 "unsafe"
39 "unsafe"
40− //"strings"
41)
40)
42
41
43−
44type R struct {
42type R struct {
45−
46}
43}
47
44
48func (p R) Open() {
45func (p R) Open() {
@@ -56,17 +53,15 @@ func (p R) Version() string {
56func (p R) Eval(code string) {
53func (p R) Eval(code string) {
57 ccode := C.CString(code)
54 ccode := C.CString(code)
58 defer C.free(unsafe.Pointer(ccode))
55 defer C.free(unsafe.Pointer(ccode))
59− C.pry_eval(ccode)
56+ C.pry_eval(ccode)
60}
57}
61
58
62−
63func (p R) REPL() {
59func (p R) REPL() {
64− C.pry_repl();
60+ C.pry_repl()
65}
61}
66
62
67func (p R) Close() {
63func (p R) Close() {
68 C.Rf_endEmbeddedR(0)
64 C.Rf_endEmbeddedR(0)
69}
65}
70
66
71−// exported
72−var Instance R
67+var Instance = R{}
src/languages/lua/lua.c → languages/lua/lua.crenamed

The content is the same.

src/languages/lua/main.go → languages/lua/main.gorenamed+8−12
@@ -16,14 +16,11 @@ int pmain (lua_State *L);
16import "C"
16import "C"
17
17
18import (
18import (
19− "unsafe"
20 "strings"
19 "strings"
20+ "unsafe"
21)
21)
22
22
23−
24−type Lua struct {
23+type Lua struct{}
25−
26−}
27
24
28func (p Lua) Open() {
25func (p Lua) Open() {
29 C.pry_init()
26 C.pry_init()
@@ -36,16 +33,16 @@ func (p Lua) Version() string {
36func (p Lua) Eval(code string) {
33func (p Lua) Eval(code string) {
37 ccode := C.CString(code)
34 ccode := C.CString(code)
38 defer C.free(unsafe.Pointer(ccode))
35 defer C.free(unsafe.Pointer(ccode))
39− C.pry_eval(ccode);
36+ C.pry_eval(ccode)
40}
37}
41
38
42func (p Lua) EvalFile(file string, args []string) {
39func (p Lua) EvalFile(file string, args []string) {
43 cfile := C.CString(file)
40 cfile := C.CString(file)
44 defer C.free(unsafe.Pointer(cfile))
41 defer C.free(unsafe.Pointer(cfile))
45−
42+
46 argv := C.CString(file + "\x00" + strings.Join(args, "\x00"))
43 argv := C.CString(file + "\x00" + strings.Join(args, "\x00"))
47 defer C.free(unsafe.Pointer(argv))
44 defer C.free(unsafe.Pointer(argv))
48− C.pry_eval_file(cfile, C.int(len(args) + 1), argv)
45+ C.pry_eval_file(cfile, C.int(len(args)+1), argv)
49}
46}
50
47
51func (p Lua) REPL() {
48func (p Lua) REPL() {
@@ -54,9 +51,8 @@ func (p Lua) REPL() {
54 C.dotty(C.pry_L)
51 C.dotty(C.pry_L)
55}
52}
56
53
57−func (p Lua) Close() {
54+func (p Lua) Close() {
58− C.lua_close(C.pry_L)
55+ C.lua_close(C.pry_L)
59}
56}
60
57
61−// exported
62−var Instance Lua
58+var Instance = Lua{}
src/languages/lua/pry.c → languages/lua/pry.crenamed

The content is the same.

src/languages/lua/pry.h → languages/lua/pry.hrenamed

The content is the same.

src/languages/python2/main.go → languages/python2/main.gorenamed+2−4
@@ -11,8 +11,7 @@ import (
11 "unsafe"
11 "unsafe"
12)
12)
13
13
14−type Python struct {
14+type Python struct{}
15−}
16
15
17func (p Python) Open() {
16func (p Python) Open() {
18 C.Py_Initialize()
17 C.Py_Initialize()
@@ -85,5 +84,4 @@ func (p Python) Close() {
85 C.Py_Finalize()
84 C.Py_Finalize()
86}
85}
87
86
88−// exported
89−var Instance Python
87+var Instance = Python{}
src/languages/python2/pry_python2.c → languages/python2/pry_python2.crenamed

The content is the same.

src/languages/python2/pry_python2.h → languages/python2/pry_python2.hrenamed

The content is the same.

src/languages/python3/main.go → languages/python3/main.gorenamed+2−4
@@ -12,8 +12,7 @@ import (
12 "unsafe"
12 "unsafe"
13)
13)
14
14
15−type Python struct {
15+type Python struct{}
16−}
17
16
18func (p Python) Open() {
17func (p Python) Open() {
19 C.Py_Initialize()
18 C.Py_Initialize()
@@ -80,5 +79,4 @@ func (p Python) Close() {
80 C.Py_Finalize()
79 C.Py_Finalize()
81}
80}
82
81
83−// exported
84−var Instance Python
82+var Instance = Python{}
src/languages/python3/pry_python3.c → languages/python3/pry_python3.crenamed

The content is the same.

src/languages/python3/pry_python3.h → languages/python3/pry_python3.hrenamed

The content is the same.

src/languages/ruby/main.go → languages/ruby/main.gorenamed+1−4
@@ -10,7 +10,6 @@ import (
10 "unsafe"
10 "unsafe"
11)
11)
12
12
13−/* */
14type Ruby struct {
13type Ruby struct {
15}
14}
16
15
@@ -42,10 +41,8 @@ func (p Ruby) EvalFile(file string, args []string) {
42func (p Ruby) REPL() {
41func (p Ruby) REPL() {
43 p.Eval("require 'irb'\nbinding.irb")
42 p.Eval("require 'irb'\nbinding.irb")
44}
43}
45−
46func (p Ruby) Close() {
44func (p Ruby) Close() {
47 C.ruby_cleanup(0)
45 C.ruby_cleanup(0)
48}
46}
49
47
50−// exported
51−var Instance Ruby
48+var Instance = Ruby{}
src/languages/ruby/pry_ruby.c → languages/ruby/pry_ruby.crenamed

The content is the same.

src/languages/ruby/pry_ruby.h → languages/ruby/pry_ruby.hrenamed

The content is the same.

src/languages/spidermonkey/main.go → languages/spidermonkey/main.gorenamed+8−15
@@ -1,6 +1,5 @@
1package main
1package main
2
2
3−
4/*
3/*
5#cgo pkg-config: mozjs185
4#cgo pkg-config: mozjs185
6#include "jsapi.h"
5#include "jsapi.h"
@@ -66,30 +65,24 @@ import (
66 "unsafe"
65 "unsafe"
67)
66)
68
67
68+type SpiderMonkey struct{}
69
69
70−type Language struct {
71−
72−}
73−
74−func (p Language) Open() {
70+func (p SpiderMonkey) Open() {
75 C.pry_open()
71 C.pry_open()
76}
72}
77
73
78−func (p Language) Version() string {
74+func (p SpiderMonkey) Version() string {
79 return C.GoString(C.JS_GetImplementationVersion())
75 return C.GoString(C.JS_GetImplementationVersion())
80− //return "JS";
81}
76}
82
77
83−func (p Language) Eval(code string) {
78+func (p SpiderMonkey) Eval(code string) {
84 ccode := C.CString(code)
79 ccode := C.CString(code)
85 defer C.free(unsafe.Pointer(ccode))
80 defer C.free(unsafe.Pointer(ccode))
86− C.pry_eval(ccode)
81+ C.pry_eval(ccode)
87}
82}
88
83
89−
90−func (p Language) Close() {
84+func (p SpiderMonkey) Close() {
91− C.pry_close()
85+ C.pry_close()
92}
86}
93
87
94−// exported
95−var Instance Language
88+var Instance = SpiderMonkey{}
src/languages/tcl/main.go → languages/tcl/main.gorenamed+7−9
@@ -11,35 +11,33 @@ import (
11 "unsafe"
11 "unsafe"
12)
12)
13
13
14−type Python struct {
14+type Tcl struct{}
15−}
16
15
17−func (p Python) Open() {
16+func (p Tcl) Open() {
18 C.pry_open()
17 C.pry_open()
19}
18}
20
19
21−func (p Python) Version() string {
20+func (p Tcl) Version() string {
22 cver := C.pry_version()
21 cver := C.pry_version()
23 ver := C.GoString(cver)
22 ver := C.GoString(cver)
24 C.free(unsafe.Pointer(cver))
23 C.free(unsafe.Pointer(cver))
25 return "TCL " + ver
24 return "TCL " + ver
26}
25}
27
26
28−func (p Python) Eval(code string) {
27+func (p Tcl) Eval(code string) {
29 ccode := C.CString(code)
28 ccode := C.CString(code)
30 defer C.free(unsafe.Pointer(ccode))
29 defer C.free(unsafe.Pointer(ccode))
31 C.pry_eval(ccode)
30 C.pry_eval(ccode)
32}
31}
33
32
34−func (p Python) EvalExpression(code string) string {
33+func (p Tcl) EvalExpression(code string) string {
35 ccode := C.CString(code)
34 ccode := C.CString(code)
36 defer C.free(unsafe.Pointer(ccode))
35 defer C.free(unsafe.Pointer(ccode))
37 return C.GoString(C.pry_eval(ccode))
36 return C.GoString(C.pry_eval(ccode))
38}
37}
39
38
40−func (p Python) Close() {
39+func (p Tcl) Close() {
41 C.pry_close()
40 C.pry_close()
42}
41}
43
42
44−// exported
45−var Instance Python
43+var Instance = Tcl{}
src/languages/tcl/pry_tcl.c → languages/tcl/pry_tcl.crenamed

The content is the same.

src/languages/tcl/pry_tcl.h → languages/tcl/pry_tcl.hrenamed

The content is the same.

src/linenoise-helper.c → linenoise/linenoise-helper.crenamed+2−3
@@ -4,8 +4,7 @@
4void linenoiseCompletionStub(const char *, linenoiseCompletions *);
4void linenoiseCompletionStub(const char *, linenoiseCompletions *);
5void linenoiseHintsStub(const char *, int *color, int *bold);
5void linenoiseHintsStub(const char *, int *color, int *bold);
6
6
7−
8void linenoise_setup() {
7void linenoise_setup() {
9− linenoiseSetCompletionCallback(linenoiseCompletionStub);
8+ linenoiseSetCompletionCallback(linenoiseCompletionStub);
10− linenoiseSetHintsCallback(linenoiseHintsStub);
9+ linenoiseSetHintsCallback(linenoiseHintsStub);
11}
10}
src/linenoise.c → linenoise/linenoise.crenamed+1−1
@@ -1198,4 +1198,4 @@ int linenoiseHistoryLoad(const char *filename) {
1198 }
1198 }
1199 fclose(fp);
1199 fclose(fp);
1200 return 0;
1200 return 0;
1201−}
1201+}
src/linenoise.go → linenoise/linenoise.gorenamed+5−7
@@ -1,24 +1,23 @@
1−package main
1+package linenoise
2
2
3/*
3/*
4−#include <stdlib.h>
5#include <linenoise.h>
4#include <linenoise.h>
5+#include <stdlib.h>
6
6
7−void linenoise_setup();
7+void linenoise_setup();
8
8
9
9
10*/
10*/
11import "C"
11import "C"
12
12
13import (
13import (
14− "unsafe"
15 "fmt"
14 "fmt"
15+ "unsafe"
16)
16)
17
17
18type Completer func(line string) []string
18type Completer func(line string) []string
19type Hinter func(line string) string
19type Hinter func(line string) string
20
20
21−
22var completer Completer
21var completer Completer
23var hinter Hinter
22var hinter Hinter
24
23
@@ -52,7 +51,7 @@ func linenoiseHintsStub(input *C.char, color *C.int, bold *C.int) *C.char {
52 return C.CString(hinter(C.GoString(input)))
51 return C.CString(hinter(C.GoString(input)))
53}
52}
54
53
55−func Linenoise(prompt string) (string,error) {
54+func Linenoise(prompt string) (string, error) {
56 C.linenoise_setup()
55 C.linenoise_setup()
57 cprompt := C.CString(prompt)
56 cprompt := C.CString(prompt)
58 defer C.free(unsafe.Pointer(cprompt))
57 defer C.free(unsafe.Pointer(cprompt))
@@ -78,4 +77,3 @@ func LinenoiseSetCompleter(newCompleter Completer) {
78func LinenoiseSetHinter(newHinter Hinter) {
77func LinenoiseSetHinter(newHinter Hinter) {
79 hinter = newHinter
78 hinter = newHinter
80}
79}
81−
src/linenoise.h → linenoise/linenoise.hrenamed

The content is the same.

mk-deps.shdeleted−22
@@ -1,22 +0,0 @@
1−#/bin/bash
2−
3−FOUND=""
4−check() {
5− pkg-config --exists $2
6− if [ $? -eq 0 ]; then
7− echo "Found plugin $1 => $2" 1>&2
8− FOUND="$FOUND plugins/$1.so"
9− else
10− echo "Couldnt find $1" 1>&2
11− fi
12−}
13−
14−for plugin in $(ls -1 src/languages/); do
15− PKG=$(grep cgo.*pkg-config src/languages/$plugin/main.go | cut -d ':' -f 2)
16− check $plugin $PKG
17−done
18−
19−
20−echo "plugins = $FOUND"
21−
22−
src/language.go → utils/language.gorenamed+15−61
@@ -1,12 +1,10 @@
1−package main
1+package utils
2
2
3import (
3import (
4 "fmt"
4 "fmt"
5 "io/ioutil"
5 "io/ioutil"
6− "os"
6+
7− "path/filepath"
7+ "github.com/replit/prybar/linenoise"
8− "plugin"
9− "runtime"
10)
8)
11
9
12type PluginBase interface {
10type PluginBase interface {
@@ -45,64 +43,20 @@ type PluginSetPrompts interface {
45 SetPrompts(ps1, ps2 string)
43 SetPrompts(ps1, ps2 string)
46}
44}
47
45
48−type Langauge struct {
46+type Language struct {
49 ptr PluginBase
47 ptr PluginBase
48+ ps1 string
50}
49}
51
50
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 {
98 return lang.ptr.Version()
52 return lang.ptr.Version()
99}
53}
100
54
101−func (lang Langauge) Eval(code string) {
55+func (lang Language) Eval(code string) {
102 lang.ptr.(PluginEval).Eval(code)
56 lang.ptr.(PluginEval).Eval(code)
103}
57}
104
58
105−func (lang Langauge) EvalAndTryToPrint(code string) {
59+func (lang Language) EvalAndTryToPrint(code string) {
106 ee, ok := lang.ptr.(PluginEvalExpression)
60 ee, ok := lang.ptr.(PluginEvalExpression)
107 if ok {
61 if ok {
108 fmt.Println(ee.EvalExpression(code))
62 fmt.Println(ee.EvalExpression(code))
@@ -111,7 +65,7 @@ func (lang Langauge) EvalAndTryToPrint(code string) {
111 }
65 }
112}
66}
113
67
114−func (lang Langauge) REPLLikeEval(code string) {
68+func (lang Language) REPLLikeEval(code string) {
115 rle, ok := lang.ptr.(PluginREPLLikeEval)
69 rle, ok := lang.ptr.(PluginREPLLikeEval)
116 if ok {
70 if ok {
117 rle.REPLLikeEval(code)
71 rle.REPLLikeEval(code)
@@ -126,7 +80,7 @@ func (lang Langauge) REPLLikeEval(code string) {
126 }
80 }
127}
81}
128
82
129−func (lang Langauge) EvalFile(file string, args []string) {
83+func (lang Language) EvalFile(file string, args []string) {
130 pef, ok := lang.ptr.(PluginEvalFile)
84 pef, ok := lang.ptr.(PluginEvalFile)
131 if ok {
85 if ok {
132 pef.EvalFile(file, args)
86 pef.EvalFile(file, args)
@@ -139,7 +93,7 @@ func (lang Langauge) EvalFile(file string, args []string) {
139 }
93 }
140}
94}
141
95
142−func (lang Langauge) REPL() {
96+func (lang Language) REPL() {
143 repl, ok := lang.ptr.(PluginREPL)
97 repl, ok := lang.ptr.(PluginREPL)
144 if ok {
98 if ok {
145 repl.REPL()
99 repl.REPL()
@@ -148,18 +102,18 @@ func (lang Langauge) REPL() {
148 }
102 }
149}
103}
150
104
151−func (lang Langauge) InternalREPL() {
105+func (lang Language) InternalREPL() {
152 for {
106 for {
153− line, err := Linenoise(ps1)
107+ line, err := linenoise.Linenoise(lang.ps1)
154 if err != nil {
108 if err != nil {
155 break
109 break
156 }
110 }
157 lang.REPLLikeEval(line)
111 lang.REPLLikeEval(line)
158− LinenoiseHistoryAdd(line)
112+ linenoise.LinenoiseHistoryAdd(line)
159 }
113 }
160}
114}
161
115
162−func (lang Langauge) SetPrompts(ps1, ps2 string) {
116+func (lang Language) SetPrompts(ps1, ps2 string) {
163 ee, ok := lang.ptr.(PluginSetPrompts)
117 ee, ok := lang.ptr.(PluginSetPrompts)
164 if ok {
118 if ok {
165 ee.SetPrompts(ps1, ps2)
119 ee.SetPrompts(ps1, ps2)
src/main.go → utils/utils.gorenamed+5−19
@@ -1,16 +1,13 @@
1−package main
1+package utils
2
2
3import (
3import (
4 "flag"
4 "flag"
5 "fmt"
5 "fmt"
6 "io"
6 "io"
7 "os"
7 "os"
8− "strings"
9 "syscall"
8 "syscall"
10)
9)
11
10
12−var ps1, ps2 string
13−
14type Red struct {
11type Red struct {
15 parent io.Writer
12 parent io.Writer
16}
13}
@@ -22,20 +19,14 @@ func (r *Red) Write(p []byte) (n int, err error) {
22 return n, err
19 return n, err
23}
20}
24
21
25−func main() {
22+func DoCli(p PluginBase) {
26− var language string
27 var interactive, ourInteractive bool
23 var interactive, ourInteractive bool
28 var code string
24 var code string
29 var quiet bool
25 var quiet bool
30 var exp string
26 var exp string
31 var colorizeStderr bool
27 var colorizeStderr bool
28+ var ps1, ps2 string
32
29
33− defaultLangague := os.Args[0]
34− if defaultLangague == "prybar" || strings.ContainsAny(defaultLangague, "./") {
35− defaultLangague = "python2"
36− }
37−
38− flag.StringVar(&language, "l", defaultLangague, "langauge")
39 flag.StringVar(&code, "c", "", "code to run")
30 flag.StringVar(&code, "c", "", "code to run")
40 flag.StringVar(&exp, "e", "", "expression to print")
31 flag.StringVar(&exp, "e", "", "expression to print")
41
32
@@ -52,14 +43,9 @@ func main() {
52
43
53 args := flag.Args()
44 args := flag.Args()
54
45
55− switch language {
46+ p.Open()
56− case "python":
47+ lang := &Language{ptr: p, ps1: ps1}
57− language = "python3"
58− case "javascript":
59− language = "spidermonkey"
60− }
61
48
62− lang := GetLanguage(language)
63 if !quiet {
49 if !quiet {
64 fmt.Println(lang.Version())
50 fmt.Println(lang.Version())
65 }
51 }