~ 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