~ chicken-r7rs (master) f4f0f3a1d59fcdc390063b9d123ec316c6167d09
commit f4f0f3a1d59fcdc390063b9d123ec316c6167d09
Author: Evan Hanson <evhan@foldling.org>
AuthorDate: Thu May 30 08:38:00 2013 +0000
Commit: Evan Hanson <evhan@foldling.org>
CommitDate: Thu May 30 08:38:00 2013 +0000
Add exit procedures
diff --git a/r7rs.scm b/r7rs.scm
index ccd77a9..409861e 100644
--- a/r7rs.scm
+++ b/r7rs.scm
@@ -10,9 +10,12 @@
read-error?
file-error?
; TODO guard
+ ;; System interface
+ exit
+ emergency-exit
)
-(import chicken scheme)
+(import chicken scheme foreign)
(use srfi-13)
(define (read-asserted-ci-symbol port valid-symbols error-message)
@@ -59,4 +62,39 @@
(and (exn? obj)
(file? obj))))))
+;;;
+;;; 6.14. System interface.
+;;;
+
+;; Should these go in a separate module (process-context)?
+
+(define (->exit-status obj)
+ (cond ((integer? obj) obj)
+ ((eq? obj #f) 1)
+ (else 0)))
+
+(define exit
+ (case-lambda
+ (()
+ (exit 0))
+ ((obj)
+ (##sys#cleanup-before-exit)
+ ;; ##sys#dynamic-unwind is hidden, have to unwind manually.
+ ; (##sys#dynamic-unwind '() (length ##sys#dynamic-winds))
+ (let unwind ()
+ (unless (null? ##sys#dynamic-winds)
+ (let ((after (cdar ##sys#dynamic-winds)))
+ (set! ##sys#dynamic-winds (cdr ##sys#dynamic-winds))
+ (after)
+ (unwind))))
+ (##core#inline "C_exit_runtime" (->exit-status obj)))))
+
+(define emergency-exit
+ (case-lambda
+ (()
+ (emergency-exit 0))
+ ((obj)
+ (##sys#cleanup-before-exit)
+ ((foreign-lambda void "_exit" int) (->exit-status obj)))))
+
)
Trap