#!/usr/bin/newlisp

; check exception handling with 'catch' and 'throw'

(println)
(println "Testing 'catch' and 'throw'")

(set 'start (time-of-day))

(set 'HI 0 'LO 0)

(define (some_function num)
	(catch (hi_function num) 'result)
	(when (not (integer? result))
		(println "we never get here")))

(define (hi_function num)
	(catch (lo_function num) 'result)
	(if (= result 'HI_exception)
		(++ HI)
		(throw result)))
		
(define (lo_function num)
	(catch (blowup num) 'result)
	(if (= result 'LO_exception) 
		(++ LO)
		(throw result)))

(define (blowup num)
	(if (= (& num 1) 1)
		(throw 'HI_exception)
		(throw 'LO_exception)))

(define (main n)
	(dotimes (i n)
		(some_function i))
	(println "Exceptions: HI=" HI ", LO=" LO))
	

(main 10000)
(println (format " %6.3f ms per exception" (div (sub (time-of-day) start) 10000) ))

(if (= (+ HI LO) 10000)
	(println ">>>>> Exception testing SUCCESSFUL")
	(println ">>>>> PROBLEM in testing exceptions")
)

(exit)