~ chicken-core (chicken-5) 02bc6447c00d0b56248688bc4e9ae6c6bb2aa8ec


commit 02bc6447c00d0b56248688bc4e9ae6c6bb2aa8ec
Author:     Christian Kellermann <ckeen@necronomicon.my.domain>
AuthorDate: Sun May 26 13:37:26 2013 +0200
Commit:     Peter Bex <peter.bex@xs4all.nl>
CommitDate: Sun May 26 14:04:24 2013 +0200

    Add make-promise from R7RS to core
    
    This also introduces tests/r7rs-tests: A place for the R7RS tests that
    don't belong anywhere else.
    
    Signed-off-by: Peter Bex <peter.bex@xs4all.nl>

diff --git a/library.scm b/library.scm
index 5a2862e4..6c4e8a9b 100644
--- a/library.scm
+++ b/library.scm
@@ -4740,6 +4740,10 @@ EOF
 (define (promise? x)
   (##sys#structure? x 'promise) )
 
+(define (make-promise obj)
+  (cond ((promise? obj) obj)
+        ((procedure? obj) (##sys#make-promise obj))
+        (else (##sys#make-promise (lambda () obj)))))
 
 ;;; Internal string-reader:
 
diff --git a/tests/r7rs-tests.scm b/tests/r7rs-tests.scm
new file mode 100644
index 00000000..dce6bb29
--- /dev/null
+++ b/tests/r7rs-tests.scm
@@ -0,0 +1,49 @@
+;; R7RS Tests
+
+;; Copied from R4RS tests
+(define cur-section '())(define errs '())
+(define SECTION (lambda args
+		  (display "SECTION") (write args) (newline)
+		  (set! cur-section args) #t))
+(define record-error (lambda (e) (set! errs (cons (list cur-section e) errs))))
+
+(define test
+  (lambda (expect fun . args)
+    (write (cons fun args))
+    (display "  ==> ")
+    ((lambda (res)
+      (write res)
+      (newline)
+      (cond ((not (equal? expect res))
+	     (record-error (list res expect (cons fun args)))
+	     (display " BUT EXPECTED ")
+	     (write expect)
+	     (newline)
+	     #f)
+	    (else #t)))
+     (if (procedure? fun) (apply fun args) (car args)))))
+(define (report-errs)
+  (newline)
+  (if (null? errs) (display "Passed all tests")
+      (begin
+	(display "errors were:")
+	(newline)
+	(display "(SECTION (got expected (call)))")
+	(newline)
+	(for-each (lambda (l) (write l) (newline))
+		  errs)))
+  (newline))
+
+(SECTION 4 2 5)
+
+
+;; make-promise test
+(test #t promise? (make-promise 1))
+(test #t promise? (make-promise (lambda _ 'foo)))
+(test #t promise? (make-promise (make-promise 1)))
+
+(test 1 force (make-promise 1))
+(test 1 force (make-promise (lambda _ 1)))
+(test 1 force (make-promise (make-promise 1)))
+
+(report-errs)
Trap