Hi all,
I'm a big fan of contract programming and was wondering if there's any
SRFI or library that offers this in Guile?
Here's an example of what I mean by contract:
--------------------------------------------------------------------------------
;; Given
(define (sum x y z)
"Return the sum of X, Y and Z."
(#:pre-conditions
(>= x 0)
(>= y 0)
(>= z 0))
(#:post-conditions
(>= result 0))
(+ x y z))
;; Would expand to something like
(use-modules (ice-9 local-eval))
(define (sum x y z)
"
Return the sum of X, Y, and Z.
pre-conditions:
(>= x 0)
(>= y 0)
(>= z 0)
post-conditions:
(>= result 0)
"
(for-each (lambda (condition)
(unless (local-eval condition (the-environment))
(begin
(format #t "Failed pre-condition: ~a\n" condition)
(exit 1))))
'((>= x 0)
(>= y 0)
(>= z 0)))
(let ((result (begin (+ x y z))))
(for-each (lambda (condition)
(unless (local-eval condition (the-environment))
(begin
(format #t "Failed post-condition: ~a\n" condition)
(exit 1))))
'((>= result 0)))
result))
--------------------------------------------------------------------------------
--
Olivier Dion
PolyMtl