Hacked the system to use the new LET-OPT optional argument machinery,
LET-OPTIONAL, LET-OPTIONAL*, and :OPTIONAL. The new macros are faster and easier to read than the old PARSE-OPTIONALS and OPTIONAL-ARG procedures.
This commit is contained in:
parent
6b42e9d7aa
commit
ea45fca8ef
|
@ -82,7 +82,7 @@
|
||||||
(create-file-thing new-fname
|
(create-file-thing new-fname
|
||||||
(lambda (new-fname)
|
(lambda (new-fname)
|
||||||
(create-hard-link/errno old-fname new-fname))
|
(create-hard-link/errno old-fname new-fname))
|
||||||
(optional-arg maybe-override? #f)
|
(:optional maybe-override? #f)
|
||||||
"create-hard-link"
|
"create-hard-link"
|
||||||
create-hard-link))
|
create-hard-link))
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@
|
||||||
(create-file-thing new-fname
|
(create-file-thing new-fname
|
||||||
(lambda (symlink)
|
(lambda (symlink)
|
||||||
(create-symlink/errno old-fname symlink))
|
(create-symlink/errno old-fname symlink))
|
||||||
(optional-arg maybe-override? #f)
|
(:optional maybe-override? #f)
|
||||||
"create-symlink"
|
"create-symlink"
|
||||||
create-symlink))
|
create-symlink))
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@
|
||||||
;;; us not to. That's life in the food chain.
|
;;; us not to. That's life in the food chain.
|
||||||
|
|
||||||
(define (rename-file old-fname new-fname . maybe-override?)
|
(define (rename-file old-fname new-fname . maybe-override?)
|
||||||
(let ((override? (optional-arg maybe-override? #f)))
|
(let ((override? (:optional maybe-override? #f)))
|
||||||
(if (or (and override? (not (eq? override? 'query)))
|
(if (or (and override? (not (eq? override? 'query)))
|
||||||
(file-not-exists? new-fname)
|
(file-not-exists? new-fname)
|
||||||
(and override?
|
(and override?
|
||||||
|
|
|
@ -67,7 +67,7 @@
|
||||||
(define set-lock-region:pid set-%lock-region:pid)
|
(define set-lock-region:pid set-%lock-region:pid)
|
||||||
|
|
||||||
(define (make-lock-region exclusive? start len . maybe-whence)
|
(define (make-lock-region exclusive? start len . maybe-whence)
|
||||||
(let ((whence (optional-arg maybe-whence seek/set)))
|
(let ((whence (:optional maybe-whence seek/set)))
|
||||||
(make-%lock-region exclusive? start len whence 0)))
|
(make-%lock-region exclusive? start len whence 0)))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -98,7 +98,7 @@
|
||||||
|
|
||||||
|
|
||||||
(define (path-list->file-name pathlist . maybe-dir)
|
(define (path-list->file-name pathlist . maybe-dir)
|
||||||
(let ((root (ensure-file-name-is-nondirectory (optional-arg maybe-dir ".")))
|
(let ((root (ensure-file-name-is-nondirectory (:optional maybe-dir ".")))
|
||||||
;; Insert slashes *between* elts of PATHLIST.
|
;; Insert slashes *between* elts of PATHLIST.
|
||||||
(w/slashes (if (pair? pathlist)
|
(w/slashes (if (pair? pathlist)
|
||||||
(let insert-slashes ((pathlist pathlist))
|
(let insert-slashes ((pathlist pathlist))
|
||||||
|
@ -162,7 +162,7 @@
|
||||||
fname)))
|
fname)))
|
||||||
|
|
||||||
(define (resolve-file-name fname . maybe-root)
|
(define (resolve-file-name fname . maybe-root)
|
||||||
(let* ((root (ensure-file-name-is-nondirectory (optional-arg maybe-root ".")))
|
(let* ((root (ensure-file-name-is-nondirectory (:optional maybe-root ".")))
|
||||||
(fname (ensure-file-name-is-nondirectory fname))
|
(fname (ensure-file-name-is-nondirectory fname))
|
||||||
(len (string-length fname)))
|
(len (string-length fname)))
|
||||||
(if (zero? len) "/"
|
(if (zero? len) "/"
|
||||||
|
|
|
@ -141,7 +141,7 @@
|
||||||
;;; Except no MASK for now.
|
;;; Except no MASK for now.
|
||||||
|
|
||||||
(define (%set-interrupt-handler interrupt handler . args)
|
(define (%set-interrupt-handler interrupt handler . args)
|
||||||
(receive (flags) (parse-optionals args 0)
|
(let-optionals args ((flags 0))
|
||||||
(receive (err handler flags)
|
(receive (err handler flags)
|
||||||
(%%set-interrupt-handler interrupt handler flags)
|
(%%set-interrupt-handler interrupt handler flags)
|
||||||
(if err
|
(if err
|
||||||
|
|
114
scsh/network.scm
114
scsh/network.scm
|
@ -143,8 +143,7 @@
|
||||||
;;; socket syscall
|
;;; socket syscall
|
||||||
;;;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
;;;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||||
(define (create-socket pf type . maybe-protocol)
|
(define (create-socket pf type . maybe-protocol)
|
||||||
(receive (protocol)
|
(let ((protocol (:optional maybe-protocol 0)))
|
||||||
(parse-optionals maybe-protocol 0)
|
|
||||||
(if (not (and (integer? pf)
|
(if (not (and (integer? pf)
|
||||||
(integer? type)
|
(integer? type)
|
||||||
(integer? protocol)))
|
(integer? protocol)))
|
||||||
|
@ -366,8 +365,7 @@
|
||||||
;;; recv syscall
|
;;; recv syscall
|
||||||
;;;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
;;;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||||
(define (receive-message socket len . maybe-flags)
|
(define (receive-message socket len . maybe-flags)
|
||||||
(receive (flags)
|
(let ((flags (:optional maybe-flags 0)))
|
||||||
(parse-optionals maybe-flags 0)
|
|
||||||
(cond ((not (socket? socket))
|
(cond ((not (socket? socket))
|
||||||
(error "receive-message: socket expected ~s" socket))
|
(error "receive-message: socket expected ~s" socket))
|
||||||
((or (not (integer? flags))
|
((or (not (integer? flags))
|
||||||
|
@ -383,23 +381,22 @@
|
||||||
(else (substring s 0 nread)))
|
(else (substring s 0 nread)))
|
||||||
from)))))))
|
from)))))))
|
||||||
|
|
||||||
(define (receive-message! socket s . maybe-args)
|
(define (receive-message! socket s . args)
|
||||||
(if (not (string? s))
|
(if (not (string? s))
|
||||||
(error "receive-message!: string expected ~s" s)
|
(error "receive-message!: string expected ~s" s)
|
||||||
(receive (start end flags)
|
(let-optionals args ((start 0) (end (string-length s)) (flags 0))
|
||||||
(parse-optionals maybe-args 0 (string-length s) 0)
|
(cond ((not (socket? socket))
|
||||||
(cond ((not (socket? socket))
|
(error "receive-message!: socket expected ~s" socket))
|
||||||
(error "receive-message!: socket expected ~s" socket))
|
((not (or (integer? flags)
|
||||||
((not (or (integer? flags)
|
(integer? start)
|
||||||
(integer? start)
|
(integer? end)))
|
||||||
(integer? end)))
|
(error "receive-message!: integer expected ~s ~s ~s"
|
||||||
(error "receive-message!: integer expected ~s ~s ~s"
|
flags start end))
|
||||||
flags start end))
|
(else
|
||||||
(else
|
(generic-receive-message! (socket->fdes socket) flags
|
||||||
(generic-receive-message! (socket->fdes socket) flags
|
s start end
|
||||||
s start end
|
recv-substring!/errno
|
||||||
recv-substring!/errno
|
(socket:family socket)))))))
|
||||||
(socket:family socket)))))))
|
|
||||||
|
|
||||||
(define (generic-receive-message! sockfd flags s start end reader from)
|
(define (generic-receive-message! sockfd flags s start end reader from)
|
||||||
(if (bogus-substring-spec? s start end)
|
(if (bogus-substring-spec? s start end)
|
||||||
|
@ -424,8 +421,7 @@
|
||||||
(else (loop (+ i nread)))))))))
|
(else (loop (+ i nread)))))))))
|
||||||
|
|
||||||
(define (receive-message/partial socket len . maybe-flags)
|
(define (receive-message/partial socket len . maybe-flags)
|
||||||
(receive (flags)
|
(let ((flags (:optional maybe-flags 0)))
|
||||||
(parse-optionals maybe-flags 0)
|
|
||||||
(cond ((not (socket? socket))
|
(cond ((not (socket? socket))
|
||||||
(error "receive-message/partial: socket expected ~s" socket))
|
(error "receive-message/partial: socket expected ~s" socket))
|
||||||
((or (not (integer? flags))
|
((or (not (integer? flags))
|
||||||
|
@ -441,23 +437,22 @@
|
||||||
(else (substring s 0 nread)))
|
(else (substring s 0 nread)))
|
||||||
addr)))))))
|
addr)))))))
|
||||||
|
|
||||||
(define (receive-message!/partial socket s . maybe-args)
|
(define (receive-message!/partial socket s . args)
|
||||||
(if (not (string? s))
|
(if (not (string? s))
|
||||||
(error "receive-message!/partial: string expected ~s" s)
|
(error "receive-message!/partial: string expected ~s" s)
|
||||||
(receive (start end flags)
|
(let-optionals args ((start 0) (end (string-length s)) (flags 0))
|
||||||
(parse-optionals maybe-args 0 (string-length s) 0)
|
(cond ((not (socket? socket))
|
||||||
(cond ((not (socket? socket))
|
(error "receive-message!/partial: socket expected ~s"
|
||||||
(error "receive-message!/partial: socket expected ~s"
|
socket))
|
||||||
socket))
|
((not (integer? flags))
|
||||||
((not (integer? flags))
|
(error "receive-message!/partial: integer expected ~s"
|
||||||
(error "receive-message!/partial: integer expected ~s"
|
flags))
|
||||||
flags))
|
(else
|
||||||
(else
|
(generic-receive-message!/partial (socket->fdes socket)
|
||||||
(generic-receive-message!/partial (socket->fdes socket)
|
flags
|
||||||
flags
|
s start end
|
||||||
s start end
|
recv-substring!/errno
|
||||||
recv-substring!/errno
|
(socket:family socket)))))))
|
||||||
(socket:family socket)))))))
|
|
||||||
|
|
||||||
(define (generic-receive-message!/partial sockfd flags s start end reader from)
|
(define (generic-receive-message!/partial sockfd flags s start end reader from)
|
||||||
(if (bogus-substring-spec? s start end)
|
(if (bogus-substring-spec? s start end)
|
||||||
|
@ -493,10 +488,8 @@
|
||||||
;;; send syscall
|
;;; send syscall
|
||||||
;;;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
;;;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||||
|
|
||||||
(define (send-message socket s . maybe-args)
|
(define (send-message socket s . args)
|
||||||
(receive (start end flags addr)
|
(let-optionals args ((start 0) (end (string-length s)) (flags 0) (addr #f))
|
||||||
(parse-optionals maybe-args
|
|
||||||
0 (string-length s) 0 #f)
|
|
||||||
(cond ((not (socket? socket))
|
(cond ((not (socket? socket))
|
||||||
(error "send-message: socket expected ~s" socket))
|
(error "send-message: socket expected ~s" socket))
|
||||||
((not (integer? flags))
|
((not (integer? flags))
|
||||||
|
@ -527,10 +520,8 @@
|
||||||
s start i end writer)))
|
s start i end writer)))
|
||||||
(loop (+ i nwritten))))))))
|
(loop (+ i nwritten))))))))
|
||||||
|
|
||||||
(define (send-message/partial socket s . maybe-args)
|
(define (send-message/partial socket s . args)
|
||||||
(receive (start end flags addr)
|
(let-optionals args ((start 0) (end (string-length s)) (flags 0) (addr #f))
|
||||||
(parse-optionals maybe-args
|
|
||||||
0 (string-length s) 0 #f)
|
|
||||||
(cond ((not (socket? socket))
|
(cond ((not (socket? socket))
|
||||||
(error "send-message/partial: socket expected ~s" socket))
|
(error "send-message/partial: socket expected ~s" socket))
|
||||||
((not (integer? flags))
|
((not (integer? flags))
|
||||||
|
@ -837,13 +828,13 @@
|
||||||
protocol) ; Protocol name
|
protocol) ; Protocol name
|
||||||
|
|
||||||
(define (service-info . args)
|
(define (service-info . args)
|
||||||
(cond ((string? (car args)) (apply name->service-info args))
|
(apply (cond ((string? (car args)) name->service-info)
|
||||||
((integer? (car args)) (apply port->service-info args))
|
((integer? (car args)) port->service-info)
|
||||||
(else (error "service-info: string or integer expected ~s" args))))
|
(else (error "service-info: string or integer expected ~s" args)))
|
||||||
|
args))
|
||||||
|
|
||||||
(define (port->service-info name . maybe-proto)
|
(define (port->service-info name . maybe-proto)
|
||||||
(receive (proto)
|
(let ((proto (:optional maybe-proto "")))
|
||||||
(parse-optionals maybe-proto "")
|
|
||||||
(cond ((not (integer? name))
|
(cond ((not (integer? name))
|
||||||
(error "port->service-info: integer expected ~s" name))
|
(error "port->service-info: integer expected ~s" name))
|
||||||
((not (string? proto))
|
((not (string? proto))
|
||||||
|
@ -851,11 +842,10 @@
|
||||||
(else
|
(else
|
||||||
(receive (result name aliases port protocol)
|
(receive (result name aliases port protocol)
|
||||||
(%service-port->service-info name proto)
|
(%service-port->service-info name proto)
|
||||||
(make-service-info name
|
(make-service-info name
|
||||||
(vector->list
|
(vector->list (C-string-vec->Scheme aliases #f))
|
||||||
(C-string-vec->Scheme aliases #f))
|
port
|
||||||
port
|
protocol))))))
|
||||||
protocol))))))
|
|
||||||
|
|
||||||
(define-foreign %service-port->service-info
|
(define-foreign %service-port->service-info
|
||||||
(scheme_serv_port2serv_info (integer name) (string proto))
|
(scheme_serv_port2serv_info (integer name) (string proto))
|
||||||
|
@ -867,18 +857,10 @@
|
||||||
|
|
||||||
|
|
||||||
(define (name->service-info name . maybe-proto)
|
(define (name->service-info name . maybe-proto)
|
||||||
(receive (proto)
|
(receive (result name aliases port protocol)
|
||||||
(parse-optionals maybe-proto "")
|
(%service-name->service-info name (:optional maybe-proto ""))
|
||||||
(if (or (not (string? name))
|
(make-service-info name (vector->list (C-string-vec->Scheme aliases #f))
|
||||||
(not (string? name)))
|
port protocol)))
|
||||||
(error "name->service-info: string expected ~s" name)
|
|
||||||
(receive (result name aliases port protocol)
|
|
||||||
(%service-name->service-info name proto)
|
|
||||||
(make-service-info name
|
|
||||||
(vector->list
|
|
||||||
(C-string-vec->Scheme aliases #f))
|
|
||||||
port
|
|
||||||
protocol)))))
|
|
||||||
|
|
||||||
(define-foreign %service-name->service-info
|
(define-foreign %service-name->service-info
|
||||||
(scheme_serv_name2serv_info (string name) (string proto))
|
(scheme_serv_name2serv_info (string name) (string proto))
|
||||||
|
|
|
@ -135,7 +135,7 @@
|
||||||
port))
|
port))
|
||||||
|
|
||||||
(define (open-input-file fname . maybe-flags)
|
(define (open-input-file fname . maybe-flags)
|
||||||
(let ((flags (optional-arg maybe-flags 0)))
|
(let ((flags (:optional maybe-flags 0)))
|
||||||
(open-file fname (deposit-bit-field flags open/access-mask open/read))))
|
(open-file fname (deposit-bit-field flags open/access-mask open/read))))
|
||||||
|
|
||||||
(define (open-output-file fname . rest)
|
(define (open-output-file fname . rest)
|
||||||
|
@ -291,7 +291,7 @@
|
||||||
(define-simple-syntax
|
(define-simple-syntax
|
||||||
(define-r4rs-input (name arg ...) stream s48name body ...)
|
(define-r4rs-input (name arg ...) stream s48name body ...)
|
||||||
(define (name arg ... . maybe-i/o)
|
(define (name arg ... . maybe-i/o)
|
||||||
(let ((stream (optional-arg maybe-i/o (current-input-port))))
|
(let ((stream (:optional maybe-i/o (current-input-port))))
|
||||||
(cond ((input-port? stream) (s48name arg ... stream))
|
(cond ((input-port? stream) (s48name arg ... stream))
|
||||||
((integer? stream) body ...)
|
((integer? stream) body ...)
|
||||||
(else (error "Not a port or file descriptor" stream))))))
|
(else (error "Not a port or file descriptor" stream))))))
|
||||||
|
@ -313,7 +313,7 @@
|
||||||
(define-simple-syntax
|
(define-simple-syntax
|
||||||
(define-r4rs-output (name arg ...) stream s48name body ...)
|
(define-r4rs-output (name arg ...) stream s48name body ...)
|
||||||
(define (name arg ... . maybe-i/o)
|
(define (name arg ... . maybe-i/o)
|
||||||
(let ((stream (optional-arg maybe-i/o (current-output-port))))
|
(let ((stream (:optional maybe-i/o (current-output-port))))
|
||||||
(cond ((output-port? stream) (s48name arg ... stream))
|
(cond ((output-port? stream) (s48name arg ... stream))
|
||||||
((integer? stream) body ...)
|
((integer? stream) body ...)
|
||||||
(else (error "Not a port or file descriptor" stream))))))
|
(else (error "Not a port or file descriptor" stream))))))
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
#f)))
|
#f)))
|
||||||
|
|
||||||
(define (pid->proc pid . maybe-probe?)
|
(define (pid->proc pid . maybe-probe?)
|
||||||
(let ((probe? (optional-arg maybe-probe? #f)))
|
(let ((probe? (:optional maybe-probe? #f)))
|
||||||
(or (maybe-pid->proc pid)
|
(or (maybe-pid->proc pid)
|
||||||
(case probe?
|
(case probe?
|
||||||
((#f) (error "Pid has no corresponding process object" pid))
|
((#f) (error "Pid has no corresponding process object" pid))
|
||||||
|
@ -155,7 +155,7 @@
|
||||||
|
|
||||||
(define (wait pid/proc . maybe-flags)
|
(define (wait pid/proc . maybe-flags)
|
||||||
(if (not *autoreap-policy*) (reap-zombies))
|
(if (not *autoreap-policy*) (reap-zombies))
|
||||||
(let ((flags (check-arg integer? (optional-arg maybe-flags 0) wait))
|
(let ((flags (:optional maybe-flags 0))
|
||||||
(proc (->proc pid/proc)))
|
(proc (->proc pid/proc)))
|
||||||
(cond ((proc:%status proc) => ; Already reaped.
|
(cond ((proc:%status proc) => ; Already reaped.
|
||||||
(lambda (status)
|
(lambda (status)
|
||||||
|
@ -176,17 +176,16 @@
|
||||||
;;; (wait-any [flags]) -> [proc status]
|
;;; (wait-any [flags]) -> [proc status]
|
||||||
|
|
||||||
(define (wait-any . maybe-flags)
|
(define (wait-any . maybe-flags)
|
||||||
(let ((flags (check-arg integer? (optional-arg maybe-flags 0) wait-any)))
|
(if (not *autoreap-policy*) (reap-zombies))
|
||||||
(if (not *autoreap-policy*) (reap-zombies))
|
(cond ((get-reaped-proc!) => ; Check internal table.
|
||||||
(cond ((get-reaped-proc!) => ; Check internal table.
|
(lambda (proc) (values proc (proc:%status proc)))) ; Hit.
|
||||||
(lambda (proc) (values proc (proc:%status proc)))) ; Hit.
|
(else
|
||||||
(else
|
(receive (pid status) (%wait-any (:optional maybe-flags 0)) ; Wait.
|
||||||
(receive (pid status) (%wait-any flags) ; Really wait.
|
(if pid
|
||||||
(if pid
|
(let ((proc (pid->proc pid)))
|
||||||
(let ((proc (pid->proc pid)))
|
(cache-wait-status proc status)
|
||||||
(cache-wait-status proc status)
|
(values proc status))
|
||||||
(values proc status))
|
(values pid status)))))) ; pid = #f -- Empty poll.
|
||||||
(values pid status))))))) ; pid = #f -- Empty poll.
|
|
||||||
|
|
||||||
|
|
||||||
;;; (wait-process-group [proc-group flags])
|
;;; (wait-process-group [proc-group flags])
|
||||||
|
@ -195,8 +194,7 @@
|
||||||
;;; early autoreaping, since the reaper loses process-group information.
|
;;; early autoreaping, since the reaper loses process-group information.
|
||||||
|
|
||||||
(define (wait-process-group . args)
|
(define (wait-process-group . args)
|
||||||
(receive (proc-group flags) (parse-optionals args 0 0)
|
(let-optionals args ((proc-group 0) (flags 0))
|
||||||
(check-arg integer? flags wait-process-group)
|
|
||||||
(if (not *autoreap-policy*) (reap-zombies))
|
(if (not *autoreap-policy*) (reap-zombies))
|
||||||
(let ((proc-group (cond ((integer? proc-group) proc-group)
|
(let ((proc-group (cond ((integer? proc-group) proc-group)
|
||||||
((proc? proc-group) (proc:pid proc-group))
|
((proc? proc-group) (proc:pid proc-group))
|
||||||
|
|
|
@ -16,14 +16,14 @@
|
||||||
|
|
||||||
(define (match:start match . maybe-index)
|
(define (match:start match . maybe-index)
|
||||||
(vector-ref (regexp-match:start match)
|
(vector-ref (regexp-match:start match)
|
||||||
(optional-arg maybe-index 0)))
|
(:optional maybe-index 0)))
|
||||||
|
|
||||||
(define (match:end match . maybe-index)
|
(define (match:end match . maybe-index)
|
||||||
(vector-ref (regexp-match:end match)
|
(vector-ref (regexp-match:end match)
|
||||||
(optional-arg maybe-index 0)))
|
(:optional maybe-index 0)))
|
||||||
|
|
||||||
(define (match:substring match . maybe-index)
|
(define (match:substring match . maybe-index)
|
||||||
(let ((i (optional-arg maybe-index 0)))
|
(let ((i (:optional maybe-index 0)))
|
||||||
(substring (regexp-match:string match)
|
(substring (regexp-match:string match)
|
||||||
(match:start match i)
|
(match:start match i)
|
||||||
(match:end match i))))
|
(match:end match i))))
|
||||||
|
@ -38,7 +38,7 @@
|
||||||
(define (make-regexp str) str)
|
(define (make-regexp str) str)
|
||||||
|
|
||||||
(define (regexp-exec regexp str . maybe-start)
|
(define (regexp-exec regexp str . maybe-start)
|
||||||
(let ((start (optional-arg maybe-start 0))
|
(let ((start (:optional maybe-start 0))
|
||||||
(start-vec (make-vector 10))
|
(start-vec (make-vector 10))
|
||||||
(end-vec (make-vector 10)))
|
(end-vec (make-vector 10)))
|
||||||
(and (%regexp-match regexp str start start-vec end-vec)
|
(and (%regexp-match regexp str start start-vec end-vec)
|
||||||
|
|
39
scsh/rw.scm
39
scsh/rw.scm
|
@ -27,10 +27,10 @@
|
||||||
s start start end source)))
|
s start start end source)))
|
||||||
(and (not (zero? nread)) nread))))))
|
(and (not (zero? nread)) nread))))))
|
||||||
|
|
||||||
(define (read-string!/partial s . maybe-args)
|
(define (read-string!/partial s . args)
|
||||||
(receive (fd/port start end)
|
(let-optionals args ((fd/port (current-input-port))
|
||||||
(parse-optionals maybe-args
|
(start 0)
|
||||||
(current-input-port) 0 (string-length s))
|
(end (string-length s)))
|
||||||
(cond ((integer? fd/port)
|
(cond ((integer? fd/port)
|
||||||
(generic-read-string!/partial s start end
|
(generic-read-string!/partial s start end
|
||||||
read-fdes-substring!/errno fd/port))
|
read-fdes-substring!/errno fd/port))
|
||||||
|
@ -61,7 +61,7 @@
|
||||||
|
|
||||||
(define (read-string/partial len . maybe-fd/port)
|
(define (read-string/partial len . maybe-fd/port)
|
||||||
(let* ((s (make-string len))
|
(let* ((s (make-string len))
|
||||||
(fd/port (optional-arg maybe-fd/port (current-input-port)))
|
(fd/port (:optional maybe-fd/port (current-input-port)))
|
||||||
(nread (read-string!/partial s fd/port 0 len)))
|
(nread (read-string!/partial s fd/port 0 len)))
|
||||||
(cond ((not nread) #f) ; EOF
|
(cond ((not nread) #f) ; EOF
|
||||||
((= nread len) s)
|
((= nread len) s)
|
||||||
|
@ -89,10 +89,10 @@
|
||||||
|
|
||||||
(else (loop (+ i nread))))))))
|
(else (loop (+ i nread))))))))
|
||||||
|
|
||||||
(define (read-string! s . maybe-args)
|
(define (read-string! s . args)
|
||||||
(receive (fd/port start end)
|
(let-optionals args ((fd/port (current-input-port))
|
||||||
(parse-optionals maybe-args
|
(start 0)
|
||||||
(current-input-port) 0 (string-length s))
|
(end (string-length s)))
|
||||||
(cond ((integer? fd/port)
|
(cond ((integer? fd/port)
|
||||||
(generic-read-string! s start end
|
(generic-read-string! s start end
|
||||||
read-fdes-substring!/errno fd/port))
|
read-fdes-substring!/errno fd/port))
|
||||||
|
@ -114,7 +114,7 @@
|
||||||
|
|
||||||
(define (read-string len . maybe-fd/port)
|
(define (read-string len . maybe-fd/port)
|
||||||
(let* ((s (make-string len))
|
(let* ((s (make-string len))
|
||||||
(fd/port (optional-arg maybe-fd/port (current-input-port)))
|
(fd/port (:optional maybe-fd/port (current-input-port)))
|
||||||
(nread (read-string! s fd/port 0 len)))
|
(nread (read-string! s fd/port 0 len)))
|
||||||
(cond ((not nread) #f) ; EOF
|
(cond ((not nread) #f) ; EOF
|
||||||
((= nread len) s)
|
((= nread len) s)
|
||||||
|
@ -140,10 +140,10 @@
|
||||||
s start start end target)))
|
s start start end target)))
|
||||||
nwritten)))))
|
nwritten)))))
|
||||||
|
|
||||||
(define (write-string/partial s . maybe-args)
|
(define (write-string/partial s . args)
|
||||||
(receive (fd/port start end)
|
(let-optionals args ((fd/port (current-output-port))
|
||||||
(parse-optionals maybe-args
|
(start 0)
|
||||||
(current-output-port) 0 (string-length s))
|
(end (string-length s)))
|
||||||
(cond ((integer? fd/port)
|
(cond ((integer? fd/port)
|
||||||
(generic-write-string/partial s start end
|
(generic-write-string/partial s start end
|
||||||
write-fdes-substring/errno fd/port))
|
write-fdes-substring/errno fd/port))
|
||||||
|
@ -171,10 +171,10 @@
|
||||||
s start i end target)))
|
s start i end target)))
|
||||||
(loop (+ i nwritten)))))))
|
(loop (+ i nwritten)))))))
|
||||||
|
|
||||||
(define (write-string s . maybe-args)
|
(define (write-string s . args)
|
||||||
(receive (fd/port start end)
|
(let-optionals args ((fd/port (current-output-port))
|
||||||
(parse-optionals maybe-args
|
(start 0)
|
||||||
(current-output-port) 0 (string-length s))
|
(end (string-length s)))
|
||||||
(cond ((integer? fd/port)
|
(cond ((integer? fd/port)
|
||||||
(generic-write-string s start end
|
(generic-write-string s start end
|
||||||
write-fdes-substring/errno fd/port))
|
write-fdes-substring/errno fd/port))
|
||||||
|
@ -193,8 +193,7 @@
|
||||||
(cond ((eof-object? line)
|
(cond ((eof-object? line)
|
||||||
(newline)
|
(newline)
|
||||||
(if (= count 0)
|
(if (= count 0)
|
||||||
(optional-arg* maybe-eof-value
|
(:optional maybe-eof-value (error "EOF in y-or-n?"))
|
||||||
(lambda () (error "EOF in y-or-n?")))
|
|
||||||
(begin (display "I'll only ask another ")
|
(begin (display "I'll only ask another ")
|
||||||
(write count)
|
(write count)
|
||||||
(display " times.")
|
(display " times.")
|
||||||
|
|
|
@ -543,7 +543,6 @@
|
||||||
(define-interface scsh-utilities-interface
|
(define-interface scsh-utilities-interface
|
||||||
(export del delete index rindex reduce filter first any first? nth
|
(export del delete index rindex reduce filter first any first? nth
|
||||||
any? every? mapv mapv! vector-every? copy-vector
|
any? every? mapv mapv! vector-every? copy-vector
|
||||||
optional-arg optional-arg* parse-optionals
|
|
||||||
check-arg conjoin disjoin negate compose reverse! call/cc
|
check-arg conjoin disjoin negate compose reverse! call/cc
|
||||||
deprecated-proc
|
deprecated-proc
|
||||||
deposit-bit-field
|
deposit-bit-field
|
||||||
|
|
|
@ -22,12 +22,16 @@
|
||||||
;;; -Olin
|
;;; -Olin
|
||||||
|
|
||||||
|
|
||||||
|
;;; The LET-OPT package for optional argument parsing & defaulting
|
||||||
|
;;; is found in the let-opt.scm file.
|
||||||
|
|
||||||
|
|
||||||
(define-structure error-package (export error warn)
|
(define-structure error-package (export error warn)
|
||||||
(open signals))
|
(open signals))
|
||||||
|
|
||||||
|
|
||||||
(define-structure scsh-utilities scsh-utilities-interface
|
(define-structure scsh-utilities scsh-utilities-interface
|
||||||
(open bitwise error-package scheme)
|
(open bitwise error-package let-opt scheme)
|
||||||
(files utilities))
|
(files utilities))
|
||||||
|
|
||||||
|
|
||||||
|
@ -37,7 +41,7 @@
|
||||||
(open receiving ; receive
|
(open receiving ; receive
|
||||||
error-package
|
error-package
|
||||||
syntactic ; generated?
|
syntactic ; generated?
|
||||||
scsh-utilities ; check-arg, optional-arg
|
scsh-utilities ; check-arg
|
||||||
scheme
|
scheme
|
||||||
)
|
)
|
||||||
(files syntax-helpers))
|
(files syntax-helpers))
|
||||||
|
@ -55,6 +59,7 @@
|
||||||
define-foreign-syntax
|
define-foreign-syntax
|
||||||
receiving
|
receiving
|
||||||
error-package
|
error-package
|
||||||
|
let-opt ; optional-arg parsing & defaulting
|
||||||
scheme)
|
scheme)
|
||||||
(files re))
|
(files re))
|
||||||
|
|
||||||
|
@ -70,6 +75,7 @@
|
||||||
scsh-utilities
|
scsh-utilities
|
||||||
error-package ; error
|
error-package ; error
|
||||||
scsh-level-0 ; regexes and delimited readers
|
scsh-level-0 ; regexes and delimited readers
|
||||||
|
let-opt ; optional-arg parsing & defaulting
|
||||||
scheme
|
scheme
|
||||||
)
|
)
|
||||||
(files fr))
|
(files fr))
|
||||||
|
@ -175,6 +181,7 @@
|
||||||
scsh-version
|
scsh-version
|
||||||
tty-flags
|
tty-flags
|
||||||
scsh-internal-tty-flags ; Not exported
|
scsh-internal-tty-flags ; Not exported
|
||||||
|
let-opt ; optional-arg parsing & defaulting
|
||||||
|
|
||||||
scheme
|
scheme
|
||||||
)
|
)
|
||||||
|
|
|
@ -302,7 +302,7 @@
|
||||||
|
|
||||||
|
|
||||||
(define (temp-file-iterate maker . maybe-template)
|
(define (temp-file-iterate maker . maybe-template)
|
||||||
(let ((template (optional-arg maybe-template (fluid *temp-file-template*))))
|
(let ((template (:optional maybe-template (fluid *temp-file-template*))))
|
||||||
(let loop ((i 0))
|
(let loop ((i 0))
|
||||||
(if (> i 1000) (error "Can't create temp-file")
|
(if (> i 1000) (error "Can't create temp-file")
|
||||||
(let ((fname (format #f template (number->string i))))
|
(let ((fname (format #f template (number->string i))))
|
||||||
|
@ -538,7 +538,7 @@
|
||||||
(lp)))))))
|
(lp)))))))
|
||||||
|
|
||||||
(define (string-filter filter . maybe-buflen)
|
(define (string-filter filter . maybe-buflen)
|
||||||
(let* ((buflen (optional-arg maybe-buflen 1024))
|
(let* ((buflen (:optional maybe-buflen 1024))
|
||||||
(buf (make-string buflen)))
|
(buf (make-string buflen)))
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(let lp ()
|
(let lp ()
|
||||||
|
@ -694,7 +694,7 @@
|
||||||
|
|
||||||
(define (exit . maybe-status)
|
(define (exit . maybe-status)
|
||||||
(flush-all-ports)
|
(flush-all-ports)
|
||||||
(exit/errno (optional-arg maybe-status 0))
|
(exit/errno (:optional maybe-status 0))
|
||||||
(display "The evil undead walk the earth." 2)
|
(display "The evil undead walk the earth." 2)
|
||||||
(error "(exit) returned."))
|
(error "(exit) returned."))
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
;;; Macro expanding procs for scsh.
|
;;; Macro expanding procs for scsh.
|
||||||
;;; Written for Clinger/Rees explicit renaming macros.
|
;;; Written for Clinger/Rees explicit renaming macros.
|
||||||
;;; Needs name-export and receive-syntax S48 packages.
|
;;; Needs name-export and receive-syntax S48 packages.
|
||||||
;;; Also needs scsh's utilities package (optional-arg & check-arg).
|
;;; Also needs scsh's utilities package (for CHECK-ARG).
|
||||||
;;; Must be loaded into for-syntax package.
|
;;; Must be loaded into for-syntax package.
|
||||||
;;; Copyright (c) 1993 by Olin Shivers.
|
;;; Copyright (c) 1993 by Olin Shivers.
|
||||||
|
|
||||||
|
@ -145,28 +145,6 @@
|
||||||
(blockify `(,@redir-chunks ,pf-chunk) rename compare)))
|
(blockify `(,@redir-chunks ,pf-chunk) rename compare)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;;; These two utility funs are for parsing optional last arguments,
|
|
||||||
;;; e.g. the PORT arg in
|
|
||||||
;;; (write-string string [port])
|
|
||||||
;;; (define (write-string str . maybe-port) ...).
|
|
||||||
|
|
||||||
(define (optional-arg maybe-arg default)
|
|
||||||
(cond ((null? maybe-arg) default)
|
|
||||||
((null? (cdr maybe-arg)) (car maybe-arg))
|
|
||||||
(else (error "too many optional arguments" maybe-arg))))
|
|
||||||
|
|
||||||
|
|
||||||
(define (optional-arg* maybe-arg default-thunk)
|
|
||||||
(if (null? maybe-arg) (default-thunk) (car maybe-arg)))
|
|
||||||
|
|
||||||
|
|
||||||
(define (check-arg pred val caller)
|
|
||||||
(let lp ((val val))
|
|
||||||
(if (pred val) val
|
|
||||||
(lp (error "Bad argument" val))))) ; Loop doesn't really work.
|
|
||||||
|
|
||||||
|
|
||||||
(define (transcribe-redirection redir rename compare)
|
(define (transcribe-redirection redir rename compare)
|
||||||
(let* ((backq (make-backquoter rename))
|
(let* ((backq (make-backquoter rename))
|
||||||
(parse-spec (lambda (x default-fdes) ; Parse an ([fdes] arg) form.
|
(parse-spec (lambda (x default-fdes) ; Parse an ([fdes] arg) form.
|
||||||
|
|
|
@ -66,7 +66,7 @@
|
||||||
(define set-date:year-day set-%date:year-day)
|
(define set-date:year-day set-%date:year-day)
|
||||||
|
|
||||||
(define (make-date s mi h md mo y . args)
|
(define (make-date s mi h md mo y . args)
|
||||||
(receive (tzn tzs s? wd yd) (parse-optionals args #f #f #f 0 0)
|
(let-optionals args ((tzn #f) (tzs #f) (s? #f) (wd 0) (yd 0))
|
||||||
(make-%date s mi h md mo y tzn tzs s? wd yd)))
|
(make-%date s mi h md mo y tzn tzs s? wd yd)))
|
||||||
|
|
||||||
|
|
||||||
|
@ -160,7 +160,7 @@
|
||||||
(real->exact-integer (check-arg real? (car args) date))
|
(real->exact-integer (check-arg real? (car args) date))
|
||||||
(time)))
|
(time)))
|
||||||
(zone (check-arg time-zone?
|
(zone (check-arg time-zone?
|
||||||
(and (pair? args) (optional-arg (cdr args) #f))
|
(and (pair? args) (:optional (cdr args) #f))
|
||||||
date)))
|
date)))
|
||||||
(receive (err seconds minute hour month-day month
|
(receive (err seconds minute hour month-day month
|
||||||
year tz-name tz-secs summer? week-day year-day)
|
year tz-name tz-secs summer? week-day year-day)
|
||||||
|
@ -222,14 +222,14 @@
|
||||||
; (real->exact-integer (check-arg real? (car args) utc-offset))
|
; (real->exact-integer (check-arg real? (car args) utc-offset))
|
||||||
; (time)))
|
; (time)))
|
||||||
; (tz (and (pair? args)
|
; (tz (and (pair? args)
|
||||||
; (check-arg time-zone? (optional-arg (cdr args) #f) utc-offset))))
|
; (check-arg time-zone? (:optional (cdr args) #f) utc-offset))))
|
||||||
; (if (integer? tz) tz
|
; (if (integer? tz) tz
|
||||||
; (- (time (date tim tz) 0) tim))))
|
; (- (time (date tim tz) 0) tim))))
|
||||||
|
|
||||||
|
|
||||||
;(define (time-zone . args) ; Optional args [summer? tz]
|
;(define (time-zone . args) ; Optional args [summer? tz]
|
||||||
; (let ((tz (and (pair? args)
|
; (let ((tz (and (pair? args)
|
||||||
; (check-arg time-zone? (optional-arg (cdr args) #f) time-zone))))
|
; (check-arg time-zone? (:optional (cdr args) #f) time-zone))))
|
||||||
; (if (integer? tz)
|
; (if (integer? tz)
|
||||||
; (deintegerize-time-zone tz)
|
; (deintegerize-time-zone tz)
|
||||||
; (let* ((summer? (if (pair? args) (car args) (time)))
|
; (let* ((summer? (if (pair? args) (car args) (time)))
|
||||||
|
|
|
@ -223,7 +223,7 @@
|
||||||
(define (send-tty-break fdport . maybe-duration)
|
(define (send-tty-break fdport . maybe-duration)
|
||||||
(call/fdes fdport
|
(call/fdes fdport
|
||||||
(lambda (fdes)
|
(lambda (fdes)
|
||||||
(%send-tty-break-fdes fdes (optional-arg maybe-duration 0)))))
|
(%send-tty-break-fdes fdes (:optional maybe-duration 0)))))
|
||||||
|
|
||||||
(define-errno-syscall (%send-tty-break-fdes fdes duration)
|
(define-errno-syscall (%send-tty-break-fdes fdes duration)
|
||||||
%send-tty-break-fdes/errno)
|
%send-tty-break-fdes/errno)
|
||||||
|
@ -344,7 +344,7 @@
|
||||||
;;; SunOS, and SVR4.
|
;;; SunOS, and SVR4.
|
||||||
|
|
||||||
(define (open-control-tty ttyname . maybe-flags)
|
(define (open-control-tty ttyname . maybe-flags)
|
||||||
(let ((flags (optional-arg maybe-flags open/read+write)))
|
(let ((flags (:optional maybe-flags open/read+write)))
|
||||||
(receive (errno fd) (open-control-tty/errno ttyname flags)
|
(receive (errno fd) (open-control-tty/errno ttyname flags)
|
||||||
(if errno
|
(if errno
|
||||||
(errno-error errno open-control-tty ttyname flags)
|
(errno-error errno open-control-tty ttyname flags)
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
(filter (lambda (x) (not (pred x))) lis))
|
(filter (lambda (x) (not (pred x))) lis))
|
||||||
|
|
||||||
(define (index str c . maybe-start)
|
(define (index str c . maybe-start)
|
||||||
(let ((start (max 0 (optional-arg maybe-start 0)))
|
(let ((start (max 0 (:optional maybe-start 0)))
|
||||||
(len (string-length str)))
|
(len (string-length str)))
|
||||||
(do ((i start (+ 1 i)))
|
(do ((i start (+ 1 i)))
|
||||||
((or (>= i len)
|
((or (>= i len)
|
||||||
|
@ -26,7 +26,7 @@
|
||||||
|
|
||||||
(define (rindex str c . maybe-start)
|
(define (rindex str c . maybe-start)
|
||||||
(let* ((len (string-length str))
|
(let* ((len (string-length str))
|
||||||
(start (min (optional-arg maybe-start len)
|
(start (min (:optional maybe-start len)
|
||||||
len)))
|
len)))
|
||||||
(do ((i (- start 1) (- i 1)))
|
(do ((i (- start 1) (- i 1)))
|
||||||
((or (< i 0)
|
((or (< i 0)
|
||||||
|
@ -109,57 +109,6 @@
|
||||||
((< i 0) ans)
|
((< i 0) ans)
|
||||||
(vector-set! ans i (vector-ref v i)))))
|
(vector-set! ans i (vector-ref v i)))))
|
||||||
|
|
||||||
;;; These two utility funs are for parsing optional last arguments,
|
|
||||||
;;; e.g. the PORT arg in
|
|
||||||
;;; (write-string string [port])
|
|
||||||
;;; (define (write-string str . maybe-port) ...).
|
|
||||||
|
|
||||||
(define (optional-arg maybe-arg default)
|
|
||||||
(cond ((null? maybe-arg) default)
|
|
||||||
((null? (cdr maybe-arg)) (car maybe-arg))
|
|
||||||
(else (error "too many optional arguments" maybe-arg))))
|
|
||||||
|
|
||||||
|
|
||||||
(define (optional-arg* maybe-arg default-thunk)
|
|
||||||
(if (null? maybe-arg) (default-thunk) (car maybe-arg)))
|
|
||||||
|
|
||||||
;;; (PARSE-OPTIONALS arg-list . default-list)
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;;; This function generalises OPTIONAL-ARG to the multi-argument
|
|
||||||
;;; case. ARG-LIST is a list of rest args passed to a procedure.
|
|
||||||
;;; DEFAULT-LIST are the default values for the procedure.
|
|
||||||
;;; We compute a list of values, with the elts of ARG-LIST overriding
|
|
||||||
;;; the defaults. It is an error if there are more args than defaults.
|
|
||||||
;;; The values are returned as multiple values, suitable for binding
|
|
||||||
;;; with RECEIVE.
|
|
||||||
;;;
|
|
||||||
;;; Example:
|
|
||||||
;;; (define (read-string! str . maybe-args)
|
|
||||||
;;; (receive (port start end)
|
|
||||||
;;; (parse-optionals maybe-args
|
|
||||||
;;; (current-input-port) 0 (string-length str))
|
|
||||||
;;; ...))
|
|
||||||
|
|
||||||
(define (parse-optionals arg-list . default-list)
|
|
||||||
(let lp ((arglist arg-list)
|
|
||||||
(defaults default-list)
|
|
||||||
(vals '()))
|
|
||||||
(if (pair? defaults)
|
|
||||||
(if (pair? arglist)
|
|
||||||
|
|
||||||
;; The supplied arg overrides the default.
|
|
||||||
(lp (cdr arglist)
|
|
||||||
(cdr defaults)
|
|
||||||
(cons (car arglist) vals))
|
|
||||||
|
|
||||||
;; No more args. Use up all the remaining defaults & return.
|
|
||||||
(apply values (reverse (append (reverse defaults) vals))))
|
|
||||||
|
|
||||||
;; No more defaults. Better not be any more args.
|
|
||||||
(if (null? arglist)
|
|
||||||
(apply values (reverse vals))
|
|
||||||
(error "Too many optional arguments" arg-list)))))
|
|
||||||
|
|
||||||
(define (check-arg pred val caller)
|
(define (check-arg pred val caller)
|
||||||
(if (pred val) val
|
(if (pred val) val
|
||||||
(check-arg pred (error "Bad argument" val pred caller) caller)))
|
(check-arg pred (error "Bad argument" val pred caller) caller)))
|
||||||
|
|
Loading…
Reference in New Issue