trac.callcc.org

root/release/3/riaxpander/history.scm

Revision 9399, 5.9 kB (checked in by ashinn, 10 months ago)

Adding DSSSL support, updating license info.

Line 
1 ;;; -*- Mode: Scheme -*-
2
3 ;;;; Riaxpander
4 ;;;; Expansion History
5
6 ;;; Copyright (c) 2008, Taylor R. Campbell
7 ;;; See the LICENCE file for licence terms and warranty disclaimer.
8
9 ;;; A history is a chain of lists of reductions, interleaved with
10 ;;; subform selectors indicating what subform of one list of reductions
11 ;;; the next list of reductions was.
12
13 (define (make-reduction form environment)
14   (cons form environment))
15
16 (define (reduction/form reduction) (car reduction))
17 (define (reduction/environment reduction) (cdr reduction))
18
19 (define (make-history reductions parent)
20   ;; (cons (car reductions) parent)         ;Preserve the original form only.
21   (cons reductions parent))
22
23 (define (make-top-level-history initial-form environment)
24   (make-history (list (make-reduction initial-form environment))
25                 '()))
26
27 (define (top-level-history? history)
28   (not (pair? (cdr history))))
29
30 (define (history/reductions history) (car history))
31 (define (history/parent history) (cdr history))
32 (define (history/parent-selector history) (car (history/parent history)))
33 (define (history/parent-history history) (cdr (history/parent history)))
34
35 (define (history/current-reduction history)
36   (car (history/reductions history)))
37
38 (define (history/original-reduction history)
39   (last (history/reductions history)))
40
41 (define (history/current-form history)
42   (reduction/form (history/current-reduction history)))
43
44 (define (history/current-environment history)
45   (reduction/environment (history/current-reduction history)))
46
47 (define (history/original-form history)
48   (reduction/form (history/original-reduction history)))
49
50 (define (history/original-environment history)
51   (reduction/environment (history/original-reduction history)))
52
53 (define (history/update-reductions history procedure)
54   (and history
55        (make-history (procedure (history/reductions history))
56                      (history/parent history))))
57
58 (define (history/add-reduction history form environment)
59   (history/update-reductions history
60     (lambda (reductions)
61       (cons (make-reduction form environment)
62             reductions))))
63
64 (define (history/replace-reduction history form environment)
65   (history/update-reductions history
66     (lambda (reductions)
67       (cons (make-reduction form environment)
68             (cdr reductions)))))
69
70 (define (history/add-subform history selector form environment)
71   (and history
72        (make-history (list (make-reduction form environment))
73                      (cons selector history))))
74
75 ;;;;; Subform Selectors
76
77 ;;; A selector is a list of integers.  Each integer's absolute value is
78 ;;; a number of cdrs to take from a list; if the integer is
79 ;;; non-negative, the car of that tail is taken as well.
80
81 ;++ What about non-list forms?
82
83 ;;; Possible optimization: store a procedure that performs the
84 ;;; selection, to avoid the overhead of analysis in APPLY-SELECTOR.
85
86 (define (apply-selector selector form)
87   (let loop ((selector (reverse selector))
88              (form form))
89     (if (pair? selector)
90         (loop (cdr selector)
91               (let ((index (car selector)))
92                 (if (negative? index)
93                     (list-tail form (- 0 index))
94                     (list-ref form index))))
95         form)))
96
97 (define (select-car selector)
98   (if (and (pair? selector)
99            (negative? (car selector)))
100       (cons (- 0 (car selector))
101             (cdr selector))
102       (cons 0 selector)))
103
104 (define (select-cdr selector)
105   (if (and (pair? selector)
106            (negative? (car selector)))
107       (cons (- (car selector) 1)
108             (cdr selector))
109       (cons -1 selector)))
110
111 (define (select-map selector list procedure)
112   (*select-map selector list cons procedure))
113
114 (define (select-append-map selector list procedure)
115   (*select-map selector list append-reverse procedure))
116
117 (define (*select-map selector list combiner procedure)
118   (let loop ((selector selector)
119              (in list)
120              (out '()))
121     (if (pair? in)
122         (loop (select-cdr selector)
123               (cdr in)
124               (combiner (procedure (select-car selector) (car in))
125                         out))
126         (reverse out))))
127
128 (define (select-for-each selector list procedure)
129   (let loop ((selector selector) (list list))
130     (if (pair? list)
131         (begin (procedure (select-car selector) (car list))
132                (loop (select-cdr selector) (cdr list))))))
133
134 ;;;;; Pre-Defined Selectors
135
136 (define identity-selector '())
137
138 (define car-selector (select-car identity-selector))
139 (define cdr-selector (select-cdr identity-selector))
140
141 (define caar-selector (select-car car-selector))
142 (define cadr-selector (select-car cdr-selector))
143 (define cdar-selector (select-cdr car-selector))
144 (define cddr-selector (select-cdr cdr-selector))
145
146 (define caaar-selector (select-car caar-selector))
147 (define caadr-selector (select-car cadr-selector))
148 (define cadar-selector (select-car cdar-selector))
149 (define caddr-selector (select-car cddr-selector))
150 (define cdaar-selector (select-cdr caar-selector))
151 (define cdadr-selector (select-cdr cadr-selector))
152 (define cddar-selector (select-cdr cdar-selector))
153 (define cdddr-selector (select-cdr cddr-selector))
154
155 (define caaaar-selector (select-car caaar-selector))
156 (define caaadr-selector (select-car caadr-selector))
157 (define caadar-selector (select-car cadar-selector))
158 (define caaddr-selector (select-car caddr-selector))
159 (define cadaar-selector (select-car cdaar-selector))
160 (define cadadr-selector (select-car cdadr-selector))
161 (define caddar-selector (select-car cddar-selector))
162 (define cadddr-selector (select-car cdddr-selector))
163 (define cdaaar-selector (select-cdr caaar-selector))
164 (define cdaadr-selector (select-cdr caadr-selector))
165 (define cdadar-selector (select-cdr cadar-selector))
166 (define cdaddr-selector (select-cdr caddr-selector))
167 (define cddaar-selector (select-cdr cdaar-selector))
168 (define cddadr-selector (select-cdr cdadr-selector))
169 (define cdddar-selector (select-cdr cddar-selector))
170 (define cddddr-selector (select-cdr cdddr-selector))
Note: See TracBrowser for help on using the browser.