diff --git a/global.go b/global.go new file mode 100644 index 0000000..8394e21 --- /dev/null +++ b/global.go @@ -0,0 +1,51 @@ +package main + +import ( + "context" + "io" + + "github.com/hymkor/gmnlisp" +) + +type Global struct { + w *Watcher + term *Term + closer []func() +} + +func (g *Global) Close() { + for i := len(g.closer) - 1; i >= 0; i-- { + g.closer[i]() + } + g.closer = nil +} + +func (g *Global) sendln(ctx context.Context, w *gmnlisp.World, arg gmnlisp.Node) (gmnlisp.Node, error) { + io.WriteString(g.term, arg.String()) + g.term.Write([]byte{'\r'}) + return gmnlisp.Null, nil +} + +func (g *Global) spawn(ctx context.Context, w *gmnlisp.World, args []gmnlisp.Node) (gmnlisp.Node, error) { + + argStrings := make([]string, 0, len(args)) + for _, s := range args { + argStrings = append(argStrings, s.String()) + } + + sh := g.term.Command(argStrings[0], argStrings[1:]...) + if err := sh.Start(); err != nil { + return nil, err + } + g.closer = append(g.closer, func() { sh.Wait() }) + return gmnlisp.Null, nil +} + +func (g *Global) expect(ctx context.Context, w *gmnlisp.World, args []gmnlisp.Node) (gmnlisp.Node, error) { + patterns := make([]string, 0, len(args)) + for _, arg := range args { + patterns = append(patterns, arg.String()) + } + result := g.w.Expect(patterns...) + return gmnlisp.Integer(result), nil +} diff --git a/main.go b/main.go index a79e3ff..9619d96 100644 --- a/main.go +++ b/main.go @@ -4,55 +4,11 @@ import ( "context" "errors" "fmt" - "io" "os" "github.com/hymkor/gmnlisp" ) -type Global struct { - w *Watcher - term *Term - closer []func() -} - -func (g *Global) Close() { - for i := len(g.closer) - 1; i >= 0; i-- { - g.closer[i]() - } - g.closer = nil -} - -func (g *Global) sendln(ctx context.Context, w *gmnlisp.World, arg gmnlisp.Node) (gmnlisp.Node, error) { - io.WriteString(g.term, arg.String()) - g.term.Write([]byte{'\r'}) - return gmnlisp.Null, nil -} - -func (g *Global) spawn(ctx context.Context, w *gmnlisp.World, args []gmnlisp.Node) (gmnlisp.Node, error) { - - argStrings := make([]string, 0, len(args)) - for _, s := range args { - argStrings = append(argStrings, s.String()) - } - - sh := g.term.Command(argStrings[0], argStrings[1:]...) - if err := sh.Start(); err != nil { - return nil, err - } - g.closer = append(g.closer, func() { sh.Wait() }) - return gmnlisp.Null, nil -} - -func (g *Global) expect(ctx context.Context, w *gmnlisp.World, args []gmnlisp.Node) (gmnlisp.Node, error) { - patterns := make([]string, 0, len(args)) - for _, arg := range args { - patterns = append(patterns, arg.String()) - } - result := g.w.Expect(patterns...) - return gmnlisp.Integer(result), nil -} - func mains(args []string) error { term, err := NewTerm() if err != nil {