Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
marvel
GitHub Repository: marvel/qnf
Path: blob/master/elisp/slime/contrib/swank-ikarus.ss
990 views
1
;; swank-larceny.scm --- Swank server for Ikarus
2
;;
3
;; License: Public Domain
4
;; Author: Helmut Eller
5
;;
6
;; In a shell execute:
7
;; ikarus swank-ikarus.ss
8
;; and then `M-x slime-connect' in Emacs.
9
;;
10
11
(library (swank os)
12
(export getpid make-server-socket accept local-port close-socket)
13
(import (rnrs)
14
(only (ikarus foreign) make-c-callout dlsym dlopen
15
pointer-set-c-long! pointer-ref-c-unsigned-short
16
malloc free pointer-size)
17
(rename (only (ikarus ipc) tcp-server-socket accept-connection
18
close-tcp-server-socket)
19
(tcp-server-socket make-server-socket)
20
(close-tcp-server-socket close-socket))
21
(only (ikarus)
22
struct-type-descriptor
23
struct-type-field-names
24
struct-field-accessor)
25
)
26
27
(define libc (dlopen))
28
(define (cfun name return-type arg-types)
29
((make-c-callout return-type arg-types) (dlsym libc name)))
30
31
(define getpid (cfun "getpid" 'signed-int '()))
32
33
(define (accept socket codec)
34
(let-values (((in out) (accept-connection socket)))
35
(values (transcoded-port in (make-transcoder codec))
36
(transcoded-port out (make-transcoder codec)))))
37
38
(define (socket-fd socket)
39
(let ((rtd (struct-type-descriptor socket)))
40
(do ((i 0 (+ i 1))
41
(names (struct-type-field-names rtd) (cdr names)))
42
((eq? (car names) 'fd) ((struct-field-accessor rtd i) socket)))))
43
44
(define sockaddr_in/size 16)
45
(define sockaddr_in/sin_family 0)
46
(define sockaddr_in/sin_port 2)
47
(define sockaddr_in/sin_addr 4)
48
49
(define (local-port socket)
50
(let* ((fd (socket-fd socket))
51
(addr (malloc sockaddr_in/size))
52
(size (malloc (pointer-size))))
53
(pointer-set-c-long! size 0 sockaddr_in/size)
54
(let ((code (getsockname fd addr size))
55
(port (ntohs (pointer-ref-c-unsigned-short
56
addr sockaddr_in/sin_port))))
57
(free addr)
58
(free size)
59
(cond ((= code -1) (error "getsockname failed"))
60
(#t port)))))
61
62
(define getsockname
63
(cfun "getsockname" 'signed-int '(signed-int pointer pointer)))
64
65
(define ntohs (cfun "ntohs" 'unsigned-short '(unsigned-short)))
66
67
)
68
69
70
(library (swank sys)
71
(export implementation-name eval-in-interaction-environment)
72
(import (rnrs)
73
(rnrs eval)
74
(only (ikarus) interaction-environment))
75
76
(define (implementation-name) "ikarus")
77
78
(define (eval-in-interaction-environment form)
79
(eval form (interaction-environment)))
80
81
)
82
83
(import (only (ikarus) load))
84
(load "swank-r6rs.scm")
85
(import (swank))
86
(start-server #f)
87
88