#!/usr/local/bin/guile \
-e main -s
!#

;;; $Id: except.guile,v 1.3 2001/06/29 23:12:37 doug Exp $
;;; http://www.bagley.org/~doug/shootout/

(use-modules (ice-9 format))

(define HI 0)
(define LO 0)

(define (some_fun n)
  (catch #t
     (lambda () (hi_fun n))
     (lambda args #f)))

(define (hi_fun n)
  (catch 'Hi_Exception
     (lambda () (lo_fun n))
     (lambda args (set! HI (+ HI 1)))))

(define (lo_fun n)
  (catch 'Lo_Exception
     (lambda () (blowup n))
     (lambda args (set! LO (+ LO 1)))))

(define (blowup n)
  (if (= 0 (modulo n 2))
      (throw 'Hi_Exception)
      (throw 'Lo_Exception)))

(define (main args)
  (let* ((n (or (and (= (length args) 2) (string->;number (cadr args))) 1)))
    (do ((i 0 (+ i 1)))
    ((= i n))
      (some_fun i)))
  (display (format "Exceptions: HI=~D / LO=~D\n" HI LO)))