values and errors go to appropriate clients now

master
Jordan Orelli 12 years ago
parent 10021eaa6d
commit 58da2f16bc

@ -25,9 +25,12 @@ func args() {
} }
defer f.Close() defer f.Close()
out, errors := make(chan interface{}), make(chan error)
go defaultInterpreter(out, errors)
c := make(chan token, 32) c := make(chan token, 32)
go lex(bufio.NewReader(f), c) go lex(bufio.NewReader(f), c)
evalall(c, universe) evalall(c, out, errors, universe)
} }
func printErrorMsg(message string) { func printErrorMsg(message string) {
@ -39,12 +42,27 @@ func die(message string) {
os.Exit(2) os.Exit(2)
} }
func tcpInterpreter(conn net.Conn, out chan interface{}, errors chan error) {
for {
select {
case v := <-out:
fmt.Fprintln(conn, v)
case err := <-errors:
fmt.Fprintf(conn, "error: %v", err)
}
}
}
func startConnection(conn net.Conn, c, d chan net.Conn) { func startConnection(conn net.Conn, c, d chan net.Conn) {
c <- conn c <- conn
defer func() { d <- conn }() defer func() { d <- conn }()
disconnect := func() { disconnect := func() {
fmt.Println("disconnected") fmt.Println("disconnected")
} }
out, errors := make(chan interface{}), make(chan error)
go tcpInterpreter(conn, out, errors)
r := bufio.NewReader(conn) r := bufio.NewReader(conn)
for { for {
if _, err := io.WriteString(conn, "> "); err != nil { if _, err := io.WriteString(conn, "> "); err != nil {
@ -69,16 +87,28 @@ func startConnection(conn net.Conn, c, d chan net.Conn) {
tokens := make(chan token, 32) tokens := make(chan token, 32)
go lexs(string(line)+"\n", tokens) go lexs(string(line)+"\n", tokens)
evalall(tokens, universe) evalall(tokens, out, errors, universe)
}
}
var activeConnections = make([]net.Conn, 0, 10)
func removeConnection(conn net.Conn) {
for i, other := range activeConnections {
if conn.RemoteAddr() == other.RemoteAddr() {
activeConnections = append(activeConnections[:i], activeConnections[i+1:]...)
return
}
} }
} }
func manageConnections(connect, disconnect chan net.Conn) { func manageConnections(connect, disconnect chan net.Conn) {
for { for {
select { select {
case <-connect: case conn := <-connect:
activeConnections = append(activeConnections, conn)
case <-disconnect: case conn := <-disconnect:
removeConnection(conn)
} }
} }
} }

@ -202,7 +202,7 @@ func eval(v interface{}, env *environment) (interface{}, error) {
panic("not reached") panic("not reached")
} }
func evalall(c chan token, env *environment) { func evalall(c chan token, out chan interface{}, e chan error, env *environment) {
for { for {
v, err := parse(c) v, err := parse(c)
switch err { switch err {
@ -210,15 +210,24 @@ func evalall(c chan token, env *environment) {
return return
case nil: case nil:
if v, err := eval(v, env); err != nil { if v, err := eval(v, env); err != nil {
fmt.Println("error:", err) e <- err
return return
} else { } else {
if v != nil { out <- v
fmt.Println(v)
}
} }
default: default:
fmt.Printf("error in eval: %v\n", err) e <- err
}
}
}
func defaultInterpreter(out chan interface{}, errors chan error) {
for {
select {
case v := <-out:
fmt.Println(v)
case err := <-errors:
fmt.Printf("error: %v", err)
} }
} }
} }
@ -232,6 +241,9 @@ func main() {
return return
} }
out, errors := make(chan interface{}), make(chan error)
go defaultInterpreter(out, errors)
r := bufio.NewReader(os.Stdin) r := bufio.NewReader(os.Stdin)
for { for {
fmt.Print("> ") fmt.Print("> ")
@ -252,6 +264,6 @@ func main() {
c := make(chan token, 32) c := make(chan token, 32)
go lexs(string(line)+"\n", c) go lexs(string(line)+"\n", c)
evalall(c, universe) evalall(c, out, errors, universe)
} }
} }

Loading…
Cancel
Save