From: Mark Friedman Date: Mon, 19 Jun 1989 22:46:06 +0000 (+0000) Subject: Added a VALUES-LET macro for binding multiple values. X-Git-Tag: 20090517-FFI~11996 X-Git-Url: https://birchwood-abbey.net/git?a=commitdiff_plain;h=e7613fe80a97f3a4b408e2344e82dd43e229d0a2;p=mit-scheme.git Added a VALUES-LET macro for binding multiple values. --- diff --git a/v7/src/edwin/macros.scm b/v7/src/edwin/macros.scm index 06946a195..61e7eff34 100644 --- a/v7/src/edwin/macros.scm +++ b/v7/src/edwin/macros.scm @@ -1,6 +1,6 @@ ;;; -*-Scheme-*- ;;; -;;; $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/macros.scm,v 1.46 1989/04/28 22:51:16 cph Exp $ +;;; $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/macros.scm,v 1.47 1989/06/19 22:46:06 markf Rel $ ;;; ;;; Copyright (c) 1986, 1989 Massachusetts Institute of Technology ;;; @@ -213,4 +213,29 @@ (define (canonicalize-name name) (cond ((symbol? name) name) ((string? name) (intern (string-replace name #\Space #\-))) - (else (error "illegal name" name)))) \ No newline at end of file + (else (error "illegal name" name)))) + +(syntax-table-define edwin-syntax-table 'VALUES-LET + (lambda (bindings . forms) + (define (transform/binding binding forms) + (if (or (not (pair? binding)) + (not (pair? (cdr binding)))) + (error "values-let: bad binding clause" + binding) + `(WITH-VALUES + (LAMBDA () ,(cadr binding)) + (LAMBDA (,@(car binding)) + ,@forms)))) + (define (transform/values-let bindings forms) + (transform/binding + (car bindings) + (if (null? (cdr bindings)) + forms + (list + (transform/values-let (cdr bindings) + forms))))) + (if (not (pair? bindings)) + (error "values-let: missing bindings" + (cons bindings forms)) + (transform/values-let bindings + forms)))) \ No newline at end of file