[Openmcl-devel] remote repl
Chris Dean
ctdean at sokitomi.com
Wed Mar 11 14:21:32 PDT 2009
Perfect, thanks.
Cheers,
Chris Dean
Gary Byers <gb at clozure.com> writes:
> CCL::LISTENER-FUNCTION ordinarily prints the "Welcome!" greeting, then
> calls CCL::TOPLEVEL-LOOP, which runs the REPL.
>
> When a thread starts up, most of the standard CL stream variables
> are synonym streams to *TERMINAL-IO*; *TERMINAL-IO* is bound to
> its static value (which is basically a TWO-WAY-STREAM connected
> to the process-wide standard input/output. So, the general idea
> would be something like:
>
> (defun run-listener (tcp-stream)
> (let* ((*terminal-io* tcp-stream))
> (ccl::listener-function)))
>
> ...
> (let* ((tcp-stream (accept-connection listener-socket)))
> (process-run-function "remote-listener" #'run-listener tcp-stream))
>
> Unless I'm forgetting something (which is certainly possible), that'd
> give you at least some basic functionality. There may be some additional
> issues: the telnet client may want to negotiate options, it'd be good
> to have some way of sending and handling keyboard interrupts, etc.
> If the client closes the telnet connection, the server thread should
> probably clean up after itself and quietly die (and not just keep
> writing messages to *ERROR-OUTPUT*, complaining that the stream
> to which *ERROR-OUTPUT* is a synonym-stream closed unexpecedly ...)
>
> CCL::ECHOING-TWO-WAY-STREAM is a (misleadingly-named) subclass
> of TWO-WAY-STREAM that's apropriate to use when input is echoed
> (as it ordinarily is in a shell or Emacs buffer.) E,g, if you
> read "(fact 100)<newline>", the newline is generally echoed, so
> a subsequent FRESH-LINE should realize that output will be written
> at the beginning of a line.
>
> The rest is left as an excercise ...
>
> On Wed, 11 Mar 2009, Chris Dean wrote:
>
>>
>> I'm new to Clozure and trying to port some code to it. I would like to
>> write my own repl that a user can telnet into for debugging purposes.
>>
>> I think I can handle all the socket bookkeeping, but I was wondering if
>> there is an existing repl function I can hook into? I could of course
>> right my own (or use swank), but I'm looking for something that already
>> exists and handles the debugger properly.
>>
>> Thanks! I have some sample code below to give an idea of what I'm using
>> now.
>>
>> We're using Version 1.3-RC1-r11804M (DarwinX8632).
>>
>> Cheers,
>> Chris Dean
>>
>> (defun run-listener (stream id)
>> "Run a top-level listener"
>> (unwind-protect
>> (let ((*terminal-io* stream)
>> ;; ...
>> (*standard-output* stream)
>> (*standard-input* stream))
>> (format t "~&Welcome to ~a ~a~%"
>> (lisp-implementation-type)
>> (lisp-implementation-version))
>> (format t "This is remote read-eval-print loop ~d, " id)
>> (MAGIC-LISTENER-FUNCTION))
>> (format *terminal-io* "~&End of top level listener ~d, " id)
>> (format *terminal-io* "closing stream, ending process.~%")
>> (close stream)))
>>
>> _______________________________________________
>> Openmcl-devel mailing list
>> Openmcl-devel at clozure.com
>> http://clozure.com/mailman/listinfo/openmcl-devel
>>
>>
More information about the Openmcl-devel
mailing list