~ chicken-r7rs (master) /scheme.process-context.scm
Trap1(module scheme.process-context (command-line
2 emergency-exit
3 exit
4 get-environment-variable
5 get-environment-variables)
6 (import scheme
7 chicken.process-context
8 chicken.type
9 (rename chicken.base (exit chicken-exit)))
10
11;;;
12;;; 6.14. System interface.
13;;;
14
15(: command-line (-> (list-of string)))
16(: exit (#!optional * -> noreturn))
17(: emergency-exit (#!optional * -> noreturn))
18
19(define (command-line)
20 ;; Don't cache these; they may be parameterized at any time!
21 (cons (program-name) (command-line-arguments)))
22
23(define (->exit-status obj)
24 (cond ((integer? obj) obj)
25 ((eq? obj #f) 1)
26 (else 0)))
27
28(define exit
29 (case-lambda
30 (()
31 (exit 0))
32 ((obj)
33 ;; ##sys#dynamic-unwind is hidden, have to unwind manually.
34 ; (##sys#dynamic-unwind '() (length ##sys#dynamic-winds))
35 (let unwind ()
36 (unless (null? ##sys#dynamic-winds)
37 (let ((after (cdar ##sys#dynamic-winds)))
38 (set! ##sys#dynamic-winds (cdr ##sys#dynamic-winds))
39 (after)
40 (unwind))))
41 ;; The built-in exit runs cleanup handlers for us.
42 (chicken-exit (->exit-status obj)))))
43
44)