guile-user
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]