Commit1f6fdd1cRecorded25 Feb 2026Repositorysigil-socket
Add procedure specs to sqlite and socket modules
Message
sigil-sqlite: 20 specs (16 native, 4 Scheme high-level API) sigil-socket: 30 specs (23 native, 7 Scheme utilities)
Changed
src/sigil/socket.sgl | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)Diff
src/sigil/socket.sglmodified
@@ -98,6 +98,7 @@
98
;;; (socket? "not a socket") ; => #f 99
;;; ``` 100
(%set-docstring! socket?)+101
(%set-spec! socket? '(any? -> boolean?)) 102
103
;;; Connect to a TCP server. 104
;;;@@ -107,6 +108,7 @@
108
;;; (tcp-connect "example.com" 80) ; => #<socket> 109
;;; ``` 110
(%set-docstring! tcp-connect)+111
(%set-spec! tcp-connect '(string? integer? -> (maybe socket?))) 112
113
;;; Create a listening TCP server socket. 114
;;;@@ -116,6 +118,7 @@
118
;;; (tcp-listen 8080) ; => #<socket> 119
;;; ``` 120
(%set-docstring! tcp-listen)+121
(%set-spec! tcp-listen '(integer? -> (maybe socket?))) 122
123
;;; Accept an incoming connection on a listening socket. 124
;;;@@ -127,6 +130,7 @@
130
;;; (socket-write-line client "Hello!")) 131
;;; ``` 132
(%set-docstring! tcp-accept)+133
(%set-spec! tcp-accept '(socket? -> (maybe socket?))) 134
135
;;; Create a UDP socket. 136
;;;@@ -134,6 +138,7 @@
138
;;; (udp-socket) ; => #<socket> 139
;;; ``` 140
(%set-docstring! udp-socket)+141
(%set-spec! udp-socket '(-> (maybe socket?))) 142
143
;;; Bind a UDP socket to a local port. 144
;;;@@ -141,6 +146,7 @@
146
;;; (udp-bind sock 5000) 147
;;; ``` 148
(%set-docstring! udp-bind)+149
(%set-spec! udp-bind '(socket? integer? -> boolean?)) 150
151
;;; Send data via UDP to a host and port. 152
;;;@@ -148,11 +154,13 @@
154
;;; (udp-send sock "127.0.0.1" 5000 "Hello") 155
;;; ``` 156
(%set-docstring! udp-send)+157
(%set-spec! udp-send '(socket? string? integer? string? -> boolean?)) 158
159
;;; Receive data from a UDP socket. 160
;;; 161
;;; Returns a list `(data host port)` or `#f` on error. 162
(%set-docstring! udp-receive)+163
(%set-spec! udp-receive '(socket? -> (maybe list?))) 164
165
;;; Close a socket. 166
;;;@@ -160,6 +168,7 @@
168
;;; (socket-close sock) 169
;;; ``` 170
(%set-docstring! socket-close)+171
(%set-spec! socket-close '(socket? -> void?)) 172
173
;;; Check if a socket has been closed. 174
;;;@@ -167,23 +176,28 @@
176
;;; (socket-closed? sock) ; => #t or #f 177
;;; ``` 178
(%set-docstring! socket-closed?)+179
(%set-spec! socket-closed? '(socket? -> boolean?)) 180
181
;;; Read data from a socket. 182
;;; 183
;;; Returns a string, empty string (no data in non-blocking mode), 184
;;; or eof-object when connection is closed. 185
(%set-docstring! socket-read)+186
(%set-spec! socket-read '(socket? -> any?)) 187
188
;;; Read a line from a socket (up to newline). 189
(%set-docstring! socket-read-line)+190
(%set-spec! socket-read-line '(socket? -> any?)) 191
192
;;; Write data to a socket. 193
;;; 194
;;; Returns the number of bytes written, or `#f` on error. 195
(%set-docstring! socket-write)+196
(%set-spec! socket-write '(socket? string? -> (maybe integer?))) 197
198
;;; Write a line to a socket (appends newline). 199
(%set-docstring! socket-write-line)+200
(%set-spec! socket-write-line '(socket? string? -> (maybe integer?))) 201
202
;;; Set a socket to non-blocking mode. 203
;;;@@ -191,19 +205,23 @@
205
;;; (socket-set-non-blocking! sock #t) 206
;;; ``` 207
(%set-docstring! socket-set-non-blocking!)+208
(%set-spec! socket-set-non-blocking! '(socket? boolean? -> void?)) 209
210
;;; Check if a socket is in non-blocking mode. 211
(%set-docstring! socket-non-blocking?)+212
(%set-spec! socket-non-blocking? '(socket? -> boolean?)) 213
214
;;; Check if a socket has data ready to read. 215
;;; 216
;;; Returns `#t` if data is available without blocking. 217
(%set-docstring! socket-ready?)+218
(%set-spec! socket-ready? '(socket? -> boolean?)) 219
220
;;; Wait for activity on multiple sockets. 221
;;; 222
;;; Returns a list of sockets that are ready. 223
(%set-docstring! socket-select)+224
(%set-spec! socket-select '(list? list? number? -> list?)) 225
226
;;; Disable Nagle's algorithm for lower latency. 227
;;;@@ -211,6 +229,7 @@
229
;;; (socket-set-tcp-nodelay! sock #t) 230
;;; ``` 231
(%set-docstring! socket-set-tcp-nodelay!)+232
(%set-spec! socket-set-tcp-nodelay! '(socket? boolean? -> void?)) 233
234
;;; Get the local hostname. 235
;;;@@ -218,6 +237,7 @@
237
;;; (gethostname) ; => "my-computer" 238
;;; ``` 239
(%set-docstring! gethostname)+240
(%set-spec! gethostname '(-> string?)) 241
242
;;; Resolve a hostname to an IP address. 243
;;;@@ -225,16 +245,19 @@
245
;;; (resolve-hostname "localhost") ; => "127.0.0.1" 246
;;; ``` 247
(%set-docstring! resolve-hostname)+248
(%set-spec! resolve-hostname '(string? -> (maybe string?))) 249
250
;;; Get the local address and port of a socket. 251
;;; 252
;;; Returns `(host . port)`. 253
(%set-docstring! socket-local-address)+254
(%set-spec! socket-local-address '(socket? -> pair?)) 255
256
;;; Get the remote address and port of a connected socket. 257
;;; 258
;;; Returns `(host . port)`. 259
(%set-docstring! socket-remote-address)+260
(%set-spec! socket-remote-address '(socket? -> pair?)) 261
262
;;; Connect to a Unix domain socket. 263
;;;@@ -245,6 +268,7 @@
268
;;; (unix-connect "/var/run/docker.sock") ; => #<socket> 269
;;; ``` 270
(%set-docstring! unix-connect)+271
(%set-spec! unix-connect '(string? -> (maybe socket?))) 272
273
;; ========== Higher-Level Utilities ========== 274
@@ -259,6 +283,7 @@
283
;;; (socket-read-all sock))) 284
;;; ``` 285
(define (call-with-tcp-connection host port proc)+286
(: string? integer? procedure? -> any?) 287
(let ((sock (tcp-connect host port))) 288
(if sock 289
(let ((result (proc sock)))@@ -279,6 +304,7 @@
304
;;; (socket-close client)))) 305
;;; ``` 306
(define (call-with-tcp-server port proc)+307
(: integer? procedure? -> any?) 308
(let ((server (tcp-listen port))) 309
(if server 310
(let ((result (proc server)))@@ -294,6 +320,7 @@
320
;;; (socket-send-all sock "Hello, world!") ; => #t 321
;;; ``` 322
(define (socket-send-all sock data)+323
(: socket? (any-of string? bytevector?) -> boolean?) 324
(let ((len (if (string? data) 325
(string-length data) 326
(bytevector-length data))))@@ -316,6 +343,7 @@
343
;;; (socket-read-all sock) ; => "HTTP/1.0 200 OK\r\n..." 344
;;; ``` 345
(define (socket-read-all sock)+346
(: socket? -> (maybe string?)) 347
(let loop ((chunks '())) 348
(let ((chunk (socket-read sock))) 349
(cond@@ -343,6 +371,7 @@
371
;;; (read-line) ; => "world" 372
;;; ``` 373
(define (make-line-reader sock)+374
(: socket? -> procedure?) 375
(let ((buffer "")) 376
(define (newline? c) (char=? c #\newline)) 377
(define (read-next)