summaryrefslogtreecommitdiff
path: root/scheme/gambit/geiser/gambit.scm
blob: a33f7cccb86ff8652b897811f1e944b0825960a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
;;;gambit.scm gambit geiser interaction

(define-macro (geiser:capture-output x . xs)
  (let ((out (gensym))
        (result (gensym)))
    `(let* ((,out (open-output-string))
            (,result (parameterize ((current-output-port ,out))
                       ,(cons 'begin (cons x xs)))))
       (write `((result ,(object->string ,result))
                (out  ,(get-output-string ,out))))
       (newline))))

(define (geiser:load-file filename)
  (geiser:capture-output (load filename)))

(define (geiser:eval2 module form) ;; module is not yet supported in gambit
  (geiser:capture-output (eval form)))

(define-macro (geiser:eval module form . rest)
  `(geiser:eval2 ,module ,(quote form)))

(define (geiser:newline)
  (newline))

(define (geiser:no-values)
  (values))

;; Spawn a server for remote repl access TODO make it works with remote repl

;;(define (geiser-start-server . rest)
;;  (let* ((listener (tcp-listen 0))
;;         (port (tcp-listener-port listener)))
;;    (define (remote-repl)
;;        (receive (in out) (tcp-accept listener)
;;          (current-input-port in)
;;          (current-output-port out)
;;          (current-error-port out)
;;          
;;          (repl)))
;;    
;;    (thread-start! (make-thread remote-repl))
;;    
;;    (write-to-log `(geiser-start-server . ,rest))
;;    (write-to-log `(port ,port))
;; 
;;    (write `(port ,port))
;;    (newline)))