#! /usr/bin/env scheme-script ;; -*- mode: scheme -*- ;; ;; Copyright 2016 Aldo Nicolas Bruno ;; ;; Licensed under the Apache License, Version 2.0 (the "License"); ;; you may not use this file except in compliance with the License. ;; You may obtain a copy of the License at ;; ;; http://www.apache.org/licenses/LICENSE-2.0 ;; ;; Unless required by applicable law or agreed to in writing, software ;; distributed under the License is distributed on an "AS IS" BASIS, ;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ;; See the License for the specific language governing permissions and ;; limitations under the License. ; example of remote REPL ; you can use any transport, tcp:// ipc:// websocket inproc ; see http://nanomsg.org/v1.0.0/nanomsg.7.html ; and nanomsg.sls for details ; ; ./local-repl tcp://127.0.0.1:12345 ; ABC ; ; meanwhile in another terminal... ; ./remote-repl tcp://127.0.0.1:12345 ; > (+ 1 2) ; 3 ; > (printf "ABC~n") --> will print ABC on the local repl process ; ; The nice thing is that you can scale to any protocol and ; that it can be integrated in an event/main loop ; it uses non-blocking (read) and you invoke (my-local-repl) until => #f ; ; TODO: add a command for local exit. #!eof object will only close the remote ; connection.... #!chezscheme (import (chezscheme) (nanomsg)) (nanomsg-library-init) (define argv (command-line-arguments)) (define sock (nn-socket AF_SP NN_REQ)) (define eid (cond [(null? argv) (nn-connect sock "tcp://localhost:9888")] [else (nn-connect sock (car argv))])) (call/cc (lambda (return) (let loop () (guard (e (else (printf "error in remote-repl: on ~d: ~d with irritants ~d~n" (if (who-condition? e) (condition-who e) 'unknown) (if (message-condition? e) (condition-message e) "") (if (irritants-condition? e) (condition-irritants e) "")))) (printf "> ") (nn-send sock (string->utf8 (call-with-string-output-port (lambda (p) (let ([token (read)]) (if (eof-object? token) (return #f) (write token p)))))) 0) (let ([buf (box #t)]) (nn-recv sock buf NN_MSG 0) (let ([s (utf8->string (unbox buf))]) (printf "~d" (if (string=? "#\n" s) "" s))))) (loop))))