i put a tcp server in your lisp interpreter
parent
86eaf0f54e
commit
95fa527b43
@ -0,0 +1,101 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
var tcpAddr = flag.String("tcp", "", "foo")
|
||||||
|
|
||||||
|
func args() {
|
||||||
|
flag.Parse()
|
||||||
|
if *tcpAddr != "" {
|
||||||
|
runTCPServer()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
filename := flag.Args()[1]
|
||||||
|
f, err := os.Open(filename)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintln(os.Stderr, "unable to read file ", filename)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
c := make(chan token, 32)
|
||||||
|
go lex(bufio.NewReader(f), c)
|
||||||
|
evalall(c, universe)
|
||||||
|
}
|
||||||
|
|
||||||
|
func printErrorMsg(message string) {
|
||||||
|
io.WriteString(os.Stderr, message)
|
||||||
|
}
|
||||||
|
|
||||||
|
func die(message string) {
|
||||||
|
printErrorMsg(message)
|
||||||
|
os.Exit(2)
|
||||||
|
}
|
||||||
|
|
||||||
|
func startConnection(conn net.Conn, c, d chan net.Conn) {
|
||||||
|
c <- conn
|
||||||
|
defer func() { d <- conn }()
|
||||||
|
disconnect := func() {
|
||||||
|
fmt.Println("disconnected")
|
||||||
|
}
|
||||||
|
r := bufio.NewReader(conn)
|
||||||
|
for {
|
||||||
|
if _, err := io.WriteString(conn, "> "); err != nil {
|
||||||
|
disconnect()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
line, prefix, err := r.ReadLine()
|
||||||
|
if prefix {
|
||||||
|
fmt.Println("(prefix)")
|
||||||
|
}
|
||||||
|
switch err {
|
||||||
|
case nil:
|
||||||
|
break
|
||||||
|
case io.EOF:
|
||||||
|
disconnect()
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
printErrorMsg(err.Error())
|
||||||
|
disconnect()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
tokens := make(chan token, 32)
|
||||||
|
go lexs(string(line)+"\n", tokens)
|
||||||
|
evalall(tokens, universe)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func manageConnections(connect, disconnect chan net.Conn) {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-connect:
|
||||||
|
|
||||||
|
case <-disconnect:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func runTCPServer() {
|
||||||
|
connect, disconnect := make(chan net.Conn), make(chan net.Conn)
|
||||||
|
go manageConnections(connect, disconnect)
|
||||||
|
ln, err := net.Listen("tcp", *tcpAddr)
|
||||||
|
if err != nil {
|
||||||
|
die(err.Error())
|
||||||
|
}
|
||||||
|
for {
|
||||||
|
conn, err := ln.Accept()
|
||||||
|
if err != nil {
|
||||||
|
printErrorMsg(err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
go startConnection(conn, connect, disconnect)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue