1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-17 09:10:22 +02:00

SRFI-45: Support multiple values; add promise? predicate.

* module/srfi/srfi-45.scm (eager): Accept any number of arguments.
  Store the list of arguments in the value record.  Previously, only one
  argument was accepted, and that value was stored in the value record.
  (delay): Support expressions that return any number of arguments.
  (force): Return the list of values stored in the value record.
  (promise?): Export.

* doc/ref/srfi-modules.texi (SRFI-45): Update docs.  Remove typing
  for simplicity in discussing multiple values.

* test-suite/tests/srfi-45.test: Add tests.  Add FSF copyright for 2010
  and 2013.  Add missing year to André van Tonder's copyright notice.
This commit is contained in:
Mark H Weaver 2013-03-18 20:01:12 -04:00
parent 8150dfa1f2
commit 1d64b4edb9
3 changed files with 89 additions and 32 deletions

View file

@ -1,6 +1,6 @@
;;; srfi-45.scm -- Primitives for Expressing Iterative Lazy Algorithms
;; Copyright (C) 2010, 2011 Free Software Foundation, Inc.
;; Copyright (C) 2010, 2011, 2013 Free Software Foundation, Inc.
;; Copyright (C) 2003 André van Tonder. All Rights Reserved.
;; Permission is hereby granted, free of charge, to any person
@ -25,8 +25,8 @@
;;; Commentary:
;; This is the code of the reference implementation of SRFI-45, slightly
;; modified to use SRFI-9.
;; This is the code of the reference implementation of SRFI-45,
;; modified to use SRFI-9 and to support multiple values.
;; This module is documented in the Guile Reference Manual.
@ -36,8 +36,9 @@
#:export (delay
lazy
force
eager)
#:replace (delay force)
eager
promise?)
#:replace (delay force promise?)
#:use-module (srfi srfi-9))
(define-record-type promise (make-promise val) promise?
@ -50,16 +51,18 @@
(define-syntax-rule (lazy exp)
(make-promise (make-value 'lazy (lambda () exp))))
(define (eager x)
(make-promise (make-value 'eager x)))
(define (eager . xs)
(make-promise (make-value 'eager xs)))
(define-syntax-rule (delay exp)
(lazy (eager exp)))
(lazy (call-with-values
(lambda () exp)
eager)))
(define (force promise)
(let ((content (promise-val promise)))
(case (value-tag content)
((eager) (value-proc content))
((eager) (apply values (value-proc content)))
((lazy) (let* ((promise* ((value-proc content)))
(content (promise-val promise))) ; *
(if (not (eqv? (value-tag content) 'eager)) ; *