12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- ;;; Ported from Scheme 48 1.9. See file COPYING for notices and license.
- ;;;
- ;;; Port Author: Andrew Whatson
- ;;;
- ;;; Original Authors: Richard Kelsey, Mike Sperber
- ;;;
- ;;; scheme48-1.9.2/ps-compiler/node/node-util.scm
- ;;;
- ;;; This file contains miscellaneous utilities for accessing and modifying the
- ;;; node tree.
- ;;;
- (define-module (ps-compiler node node-letrec)
- #:use-module (prescheme scheme48)
- #:use-module (ps-compiler node let-nodes)
- #:use-module (ps-compiler node node)
- #:use-module (ps-compiler node node-util)
- #:use-module (ps-compiler node primop)
- #:use-module (ps-compiler node variable)
- #:export (put-in-letrec make-letrec))
- ;;-------------------------------------------------------------------------------
- ;; Bind VARS to VALUES using letrec at CALL. If CALL is already a letrec
- ;; call, just add to it, otherwise make a new one.
- (define (put-in-letrec vars values call)
- (cond ((eq? 'letrec2 (primop-id (call-primop call)))
- (let ((binder (node-parent call)))
- (mark-changed call)
- (for-each (lambda (var)
- (set-variable-binder! var binder))
- vars)
- (set-lambda-variables! binder
- (append (lambda-variables binder) vars))
- (for-each (lambda (value)
- (append-call-arg call value))
- values)))
- (else
- (move-body
- call
- (lambda (call)
- (receive (letrec-call letrec-cont)
- (make-letrec vars values)
- (attach-body letrec-cont call)
- letrec-call))))))
- (define (make-letrec vars vals)
- (let ((cont (make-lambda-node 'c 'cont '())))
- (let-nodes ((call (letrec1 1 l2))
- (l2 ((x #f) . vars) (letrec2 1 cont (* x) . vals)))
- (values call cont))))
|