You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

31 lines
1.0 KiB

#lang racket
(require racket/tcp)
(provide make-server)
(define-syntax do-forever
(syntax-rules ()
((do-forever thing)
(let loop () thing (loop)))))
(define (make-server port)
(read-case-sensitive #f)
(define (accept-and-process listener)
(let-values ([(in _out) (tcp-accept listener)])
(log-and-eval (read in) (read in))
(tcp-abandon-port in)
(tcp-abandon-port _out)))
(define namespaces (make-hash))
(define (get-or-create-namespace name)
(hash-ref namespaces name (lambda() (let ([ns (make-base-namespace)]) (hash-set! namespaces name ns) ns))))
(define (log-and-eval namespace-name msg)
(printf "[~A]: ~A~%" namespace-name msg)
(with-handlers ([exn? (lambda(x) (printf "eval error: ~A~%" x))])
(printf "=> ~A~%" (eval msg (get-or-create-namespace namespace-name)))))
(let ([listener (tcp-listen port 1 #f "localhost")])
(printf "Scheme evaluation server up and running on port ~A~%" port)
(lambda ()
(do-forever (accept-and-process listener)))))
((make-server 47474))