[gambit-list] lambdanative and remote repl
tcl super dude
tcleval at gmail.com
Mon Sep 2 00:44:11 EDT 2013
Hi,
I started a remote repl with the demoredsquare app but the repl get too
slow, somehow the app takes forever to process the repl events
main.scm:
(include "repl.scm")
(define gui #f)
(start-repl-server)
(main
;; initialization
(lambda (w h)
(make-window 320 480)
(glgui-orientation-set! GUI_PORTRAIT)
(set! gui (make-glgui))
(let* ((w (glgui-width-get))
(h (glgui-height-get))
(dim (min (/ w 2) (/ h 2))))
(glgui-box gui (/ (- w dim) 2) (/ (- h dim) 2) dim dim Red))
)
;; events
(lambda (t x y)
(if (= t EVENT_KEYPRESS) (begin
(if (= x EVENT_KEYESCAPE) (terminate))))
(glgui-event gui t x y))
;; termination
(lambda () #t)
;; suspend
(lambda () (glgui-suspend))
;; resume
(lambda () (glgui-resume))
)
;; eof
repl.scm:
;;; $Id: repl.scm,v 1.1 2013/03/10 16:24:54 daniel Exp daniel $;;; $Name: $
;; ------------------remote REPL
-------------------------------------------------------------(define
(ide-repl-pump ide-repl-connection in-port out-port tgroup)
(define m (make-mutex))
(define (process-input) (let loop ((state 'normal)) (let ((c (read-char
ide-repl-connection))) (if (not (eof-object? c)) (case state ((normal) (if
(char=? c #\xff) ;; telnet IAC (interpret as command) code? (loop c)
(begin(mutex-lock! m)(if (char=? c #\x04) ;; ctrl-d
?(close-output-port out-port)(begin(write-char c
out-port)(force-output out-port)))(mutex-unlock! m)(loop
state))))((#\xfb) ;; after WILL command?(loop 'normal))((#\xfc) ;;
after WONT command?(loop 'normal))((#\xfd) ;; after DO command?(if
(char=? c #\x06) ;; timing-mark option?(begin ;; send back WILL
timing-mark(mutex-lock! m)(write-char #\xff
ide-repl-connection)(write-char #\xfb ide-repl-connection)(write-char
#\x06 ide-repl-connection)(force-output
ide-repl-connection)(mutex-unlock! m)))(loop 'normal))((#\xfe) ;;
after DONT command?(loop 'normal))((#\xff) ;; after IAC command?(case
c((#\xf4) ;; telnet IP (interrupt process)
command?(for-each##thread-interrupt!(thread-group->thread-list
tgroup))(loop 'normal))((#\xfb #\xfc #\xfd #\xfe) ;; telnet
WILL/WONT/DO/DONT command?(loop c))(else(loop 'normal))))(else(loop
'normal)))))))
(define (process-output) (let loop () (let ((c (read-char in-port))) (if
(not (eof-object? c)) (begin (mutex-lock! m) (write-char c
ide-repl-connection) (force-output ide-repl-connection) (mutex-unlock!
m)(loop))))))
(let ((tgroup (make-thread-group 'repl-pump #f))) (thread-start!
(make-thread process-input #f tgroup)) (thread-start! (make-thread
process-output #f tgroup))))
(define (make-ide-repl-ports ide-repl-connection tgroup) (receive
(in-rd-port in-wr-port) (open-string-pipe '(direction: input
permanent-close: #f)) (receive (out-wr-port out-rd-port) (open-string-pipe
'(direction: output)) (begin
;; Hack... set the names of the ports for usage with
gambit.el(##vector-set! in-rd-port 4 (lambda (port)
'(stdin)))(##vector-set! out-wr-port 4 (lambda (port) '(stdout)))
(ide-repl-pump ide-repl-connection out-rd-port in-wr-port tgroup) (values
in-rd-port out-wr-port)))))
(define repl-channel-table (make-table test: eq?))
(set! ##thread-make-repl-channel (lambda (thread) (let ((tgroup
(thread-thread-group thread))) (or (table-ref repl-channel-table
tgroup #f)(##default-thread-make-repl-channel thread)))))
(define (setup-ide-repl-channel ide-repl-connection tgroup) (receive
(in-port out-port) (make-ide-repl-ports ide-repl-connection tgroup) (let
((repl-channel (##make-repl-channel-ports in-port out-port))) (table-set!
repl-channel-table tgroup repl-channel))))
(define (start-ide-repl) (##repl-debug-main))
(define repl-server-address "*:7000")
(define (repl-server) (let ((server (open-tcp-server (list server-address:
repl-server-address reuse-address: #t)))) (let loop () (let*
((ide-repl-connection (read server)) (tgroup (make-thread-group
'repl-service #f)) (thread (make-thread (lambda () (setup-ide-repl-channel
ide-repl-connection tgroup) (start-ide-repl)) 'repl
tgroup)))(thread-start! thread)(loop)))))
(define (start-repl-server) (thread-start! (make-thread (lambda ()
(repl-server)))))
;-----------------------------------------------------------------------------------------------------------------
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.iro.umontreal.ca/pipermail/gambit-list/attachments/20130902/9989249e/attachment.htm>
More information about the Gambit-list
mailing list