forked from ppaml-op3/iracket
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathiracket-execute.rkt
79 lines (70 loc) · 2.66 KB
/
iracket-execute.rkt
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#lang racket/base
(require racket/string
racket/match
racket/contract
racket/sandbox
file/convertible
(for-syntax racket/base)
json
net/base64
(prefix-in ipy: "./ipython-message.rkt")
(prefix-in ipy: "./ipython-services.rkt"))
(provide make-execute)
;; execute_request
(define (make-display-text v)
(cons 'text/plain (format "~a" v)))
(define (make-display-convertible conversion-type mime-type v
#:encode [encode values])
(define result (and (convertible? v)
(convert v conversion-type)))
(if result
(cons mime-type (bytes->string/latin-1 (encode result)))
#f))
(define (make-display-c3 v)
(match v
[`(c3-data . ,d) (cons 'application/x-c3-data (jsexpr->string d))]
[else #f]))
(define (make-display-results v)
(filter values
(list (or (make-display-convertible 'text 'text/plain v)
(make-display-text v))
(make-display-c3 v)
; svg seems to be broken in tons of browsers
; (make-display-convertible 'svg-bytes 'image/svg+xml v)
(make-display-convertible 'png-bytes 'image/png v #:encode base64-encode)
(make-display-convertible 'gif-bytes 'image/gif v #:encode base64-encode)
(make-display-convertible 'ps-bytes 'application/postscript v #:encode base64-encode)
(make-display-convertible 'pdf-bytes 'application/pdf v #:encode base64-encode))))
(define (make-kill-thread/custodian cust)
(λ (t)
(parameterize ([current-custodian cust])
(kill-thread t))))
(define (make-execute services e)
(define execution-count 0)
(define user-cust (get-user-custodian e))
;; let other cells' threads be killed
(call-in-sandbox-context e
(λ ()
(eval
`(define notebook-kill-thread
,(make-kill-thread/custodian user-cust)))))
(λ (msg)
(set! execution-count (add1 execution-count))
(define code (hash-ref (ipy:message-content msg) 'code))
(call-in-sandbox-context e
(λ ()
(current-output-port (ipy:make-stream-port services 'stdout msg))
(current-error-port (ipy:make-stream-port services 'stderr msg))))
(call-with-values
(λ () (e code))
(λ vs
(match vs
[(list (? void?)) void]
[else (for ([v (in-list vs)])
(define results (make-display-results v))
(ipy:send-exec-result msg services execution-count
(make-hasheq results)))])))
(hasheq
'status "ok"
'execution_count execution-count
'user_expressions (hasheq))))