|
7 | 7 |
|
8 | 8 | (define-struct MathLink (ep lp (ref #:mutable) sema phantom)) |
9 | 9 |
|
10 | | -(define warning |
11 | | - (get-ffi-obj 'scheme_warning #f |
12 | | - (_fun (_bytes = #"%T") _scheme -> _void))) |
13 | | - |
14 | 10 | (define-struct (exn:fail:mathlink exn:fail) () #:transparent) |
15 | 11 | (define-syntax-rule (mathlink-error str) |
16 | 12 | (raise (make-exn:fail:mathlink str (current-continuation-marks)))) |
17 | 13 |
|
18 | 14 | (define mathlink |
19 | 15 | (ffi-lib (case (system-type 'os) |
20 | 16 | ((unix) |
21 | | - (string-append "libML" |
| 17 | + (string-append "libWSTP" |
22 | 18 | (number->string (* (compiler-sizeof '*) 8)) |
23 | | - "i3")) |
| 19 | + "i4")) |
24 | 20 | ((windows) |
25 | | - (string-append "ml" |
| 21 | + (string-append "wstp" |
26 | 22 | (number->string (* (compiler-sizeof '*) 8)) |
27 | | - "i3")) |
| 23 | + "i4")) |
28 | 24 | ((macosx) |
29 | | - "mathlink.framework/mathlink")))) |
| 25 | + "wstp.framework/wstp")))) |
30 | 26 |
|
31 | 27 | (define MLOpen |
32 | 28 | (let ((MLInitialize |
33 | | - (get-ffi-obj 'MLInitialize mathlink |
| 29 | + (get-ffi-obj 'WSInitialize mathlink |
34 | 30 | (_fun (_pointer = #f) -> (p : _pointer) |
35 | 31 | -> (or p (mathlink-error "MathKernel: MathLink Initialize Error")))))) |
36 | | - (get-ffi-obj 'MLOpenArgcArgv mathlink |
| 32 | + (get-ffi-obj 'WSOpenArgcArgv mathlink |
37 | 33 | (_fun args :: |
38 | 34 | (ep : _pointer = (MLInitialize)) |
39 | 35 | (_int = (add1 (length args))) |
|
47 | 43 | (mathlink-error "MathKernel: MathLink Open Error")))))) |
48 | 44 |
|
49 | 45 | (define MLClose |
50 | | - (let ((MLClose (get-ffi-obj 'MLClose mathlink |
| 46 | + (let ((MLClose (get-ffi-obj 'WSClose mathlink |
51 | 47 | (_fun _pointer -> _void))) |
52 | 48 | (MLDeinitialize |
53 | | - (get-ffi-obj 'MLDeinitialize mathlink |
| 49 | + (get-ffi-obj 'WSDeinitialize mathlink |
54 | 50 | (_fun _pointer -> _void)))) |
55 | 51 | (lambda (link) |
56 | 52 | (MLPutMessage (MathLink-lp link) 1) |
57 | 53 | (MLClose (MathLink-lp link)) |
58 | 54 | (MLDeinitialize (MathLink-ep link))))) |
59 | 55 |
|
60 | 56 | (define MLPutFunction |
61 | | - (get-ffi-obj 'MLPutFunction mathlink |
| 57 | + (get-ffi-obj 'WSPutFunction mathlink |
62 | 58 | (_fun _pointer _bytes _int -> _bool))) |
63 | 59 |
|
64 | 60 | (define MLPutArgCount |
65 | | - (get-ffi-obj 'MLPutArgCount mathlink |
| 61 | + (get-ffi-obj 'WSPutArgCount mathlink |
66 | 62 | (_fun _pointer _int -> _bool))) |
67 | 63 |
|
68 | 64 | (define MLPutString |
69 | | - (get-ffi-obj 'MLPutUTF32String mathlink |
70 | | - (_fun _pointer (s : _string/ucs-4) (_int = (string-length s)) -> _bool))) |
| 65 | + (get-ffi-obj 'WSPutUTF32String mathlink |
| 66 | + (_fun (l s) :: |
| 67 | + (l : _pointer) |
| 68 | + (_string/ucs-4 = (string-append "\uFEFF" s)) |
| 69 | + (_int = (add1 (string-length s))) |
| 70 | + -> _bool))) |
71 | 71 |
|
72 | 72 | (define MLPutReal |
73 | | - (get-ffi-obj 'MLPutReal mathlink |
| 73 | + (get-ffi-obj 'WSPutReal mathlink |
74 | 74 | (_fun _pointer _double -> _bool))) |
75 | 75 |
|
76 | 76 | (define MLPutNext |
77 | | - (get-ffi-obj 'MLPutNext mathlink |
| 77 | + (get-ffi-obj 'WSPutNext mathlink |
78 | 78 | (_fun _pointer _int -> _bool))) |
79 | 79 |
|
80 | 80 | (define MLNextPacket |
81 | | - (get-ffi-obj 'MLNextPacket mathlink |
| 81 | + (get-ffi-obj 'WSNextPacket mathlink |
82 | 82 | (_fun _pointer -> _int))) |
83 | 83 |
|
84 | 84 | (define MLEndPacket |
85 | | - (get-ffi-obj 'MLEndPacket mathlink |
| 85 | + (get-ffi-obj 'WSEndPacket mathlink |
86 | 86 | (_fun _pointer -> _bool))) |
87 | 87 |
|
88 | 88 | (define MLNewPacket |
89 | | - (get-ffi-obj 'MLNewPacket mathlink |
| 89 | + (get-ffi-obj 'WSNewPacket mathlink |
90 | 90 | (_fun _pointer -> _bool))) |
91 | 91 |
|
92 | 92 | (define MLGetString |
93 | | - (let ((release (get-ffi-obj 'MLReleaseUTF32String mathlink |
94 | | - (_fun _pointer _pointer _int -> _void))) |
95 | | - (make (get-ffi-obj 'scheme_make_sized_char_string #f |
96 | | - (_fun _pointer _intptr _bool -> _scheme)))) |
97 | | - (get-ffi-obj 'MLGetUTF32String mathlink |
98 | | - (_fun (l : _pointer) (s : (_ptr o _pointer)) (len : (_ptr o _int)) -> _bool |
99 | | - -> (begin0 (make s len #t) |
100 | | - (release l s len)))))) |
101 | | - |
102 | | -(define MLGetSymbol |
103 | | - (let ((release (get-ffi-obj 'MLReleaseUTF8Symbol mathlink |
104 | | - (_fun _pointer _pointer _int -> _void))) |
105 | | - (make (get-ffi-obj 'scheme_intern_exact_symbol #f |
106 | | - (_fun _pointer _int -> _scheme)))) |
107 | | - (get-ffi-obj 'MLGetUTF8Symbol mathlink |
108 | | - (_fun (l : _pointer) (s : (_ptr o _pointer)) (b : (_ptr o _int)) (_ptr o _int) -> _bool |
109 | | - -> (begin0 (make s b) |
110 | | - (release l s b)))))) |
111 | | - |
112 | | -(define MLGetInteger |
113 | | - (let ((release (get-ffi-obj 'MLReleaseString mathlink |
114 | | - (_fun _pointer _pointer -> _void))) |
115 | | - (make (get-ffi-obj 'scheme_read_bignum_bytes #f |
116 | | - (_fun _pointer (_int = 0) (_int = 10) -> _scheme)))) |
117 | | - (get-ffi-obj 'MLGetString mathlink |
118 | | - (_fun (l : _pointer) (s : (_ptr o _pointer)) -> _bool |
119 | | - -> (begin0 (make s) |
120 | | - (release l s)))))) |
| 93 | + (case (system-type 'vm) |
| 94 | + ((racket) |
| 95 | + (let ((release (get-ffi-obj 'WSReleaseUTF32String mathlink |
| 96 | + (_fun _pointer _pointer _int -> _void))) |
| 97 | + (make (get-ffi-obj 'scheme_make_sized_char_string #f |
| 98 | + (_fun _pointer _intptr _bool -> _scheme)))) |
| 99 | + (get-ffi-obj 'WSGetUTF32String mathlink |
| 100 | + (_fun (l : _pointer) (s : (_ptr o _pointer)) (len : (_ptr o _int)) -> _bool |
| 101 | + -> (begin0 (make (ptr-add s 4) (sub1 len) #t) |
| 102 | + (release l s len)))))) |
| 103 | + ((chez-scheme) |
| 104 | + (let ((release (get-ffi-obj 'WSReleaseUTF8String mathlink |
| 105 | + (_fun _pointer _pointer _int -> _void))) |
| 106 | + (make (get-ffi-obj 'Sstring_utf8 #f |
| 107 | + (_fun _pointer _intptr -> _scheme)))) |
| 108 | + (get-ffi-obj 'WSGetUTF8String mathlink |
| 109 | + (_fun (l : _pointer) (s : (_ptr o _pointer)) (len : (_ptr o _int)) (_ptr o _int) -> _bool |
| 110 | + -> (begin0 (make s len) |
| 111 | + (release l s len)))))))) |
121 | 112 |
|
122 | 113 | (define MLGetNext |
123 | | - (get-ffi-obj 'MLGetNext mathlink |
| 114 | + (get-ffi-obj 'WSGetNext mathlink |
124 | 115 | (_fun _pointer -> _int))) |
125 | 116 |
|
126 | 117 | (define MLGetArgCount |
127 | | - (get-ffi-obj 'MLGetArgCount mathlink |
| 118 | + (get-ffi-obj 'WSGetArgCount mathlink |
128 | 119 | (_fun _pointer (n : (_ptr o _int)) -> _bool |
129 | 120 | -> n))) |
130 | 121 |
|
131 | | -(define MLFlush |
132 | | - (get-ffi-obj 'MLFlush mathlink |
133 | | - (_fun _pointer -> _bool))) |
134 | | - |
135 | 122 | (define MLWait |
136 | | - (let ((MLReady (ffi-obj-ref 'MLReady mathlink))) |
137 | | - (get-ffi-obj 'scheme_block_until_enable_break #f |
138 | | - (_fun (_fpointer = MLReady) (_fpointer = #f) _pointer (_float = 0.0) _bool |
139 | | - -> _bool)))) |
| 123 | + (let ((MLFlush (get-ffi-obj 'WSFlush mathlink |
| 124 | + (_fun _pointer -> _bool))) |
| 125 | + (MLReady (get-ffi-obj 'WSReady mathlink |
| 126 | + (_fun _pointer -> _bool)))) |
| 127 | + (lambda (lp) |
| 128 | + (MLFlush lp) |
| 129 | + (let loop () |
| 130 | + (unless (MLReady lp) |
| 131 | + (sleep 0.01) |
| 132 | + (loop)))))) |
140 | 133 |
|
141 | 134 | (define MLPutMessage |
142 | | - (get-ffi-obj 'MLPutMessage mathlink |
| 135 | + (get-ffi-obj 'WSPutMessage mathlink |
143 | 136 | (_fun _pointer _int -> _bool))) |
144 | 137 |
|
145 | 138 | (define MLError |
146 | | - (get-ffi-obj 'MLError mathlink |
| 139 | + (get-ffi-obj 'WSError mathlink |
147 | 140 | (_fun _pointer -> _int))) |
148 | 141 |
|
149 | 142 | (define MLErrorMessage |
150 | | - (get-ffi-obj 'MLErrorMessage mathlink |
| 143 | + (get-ffi-obj 'WSErrorMessage mathlink |
151 | 144 | (_fun _pointer -> _string/latin-1))) |
152 | 145 |
|
153 | 146 | (define MLClearError |
154 | | - (get-ffi-obj 'MLClearError mathlink |
| 147 | + (get-ffi-obj 'WSClearError mathlink |
155 | 148 | (_fun _pointer -> _bool))) |
0 commit comments