[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Contract programming in Guile
From: |
Olivier Dion |
Subject: |
Contract programming in Guile |
Date: |
Sat, 17 Jul 2021 12:01:34 -0400 |
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
- Contract programming in Guile,
Olivier Dion <=