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
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)) |