70 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			70 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								; List-processing procedures
							 | 
						||
| 
								 | 
							
								; Uses: startup
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define reverse
							 | 
						||
| 
								 | 
							
								  (lambda (L) (revappend L '())))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define revappend
							 | 
						||
| 
								 | 
							
								  (lambda (L1 L2)
							 | 
						||
| 
								 | 
							
								    (while L1
							 | 
						||
| 
								 | 
							
								      (set! L2 (cons (car L1) L2))
							 | 
						||
| 
								 | 
							
								      (set! L1 (cdr L1)))
							 | 
						||
| 
								 | 
							
								    L2))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define append!
							 | 
						||
| 
								 | 
							
								  (lambda (L1 L2)
							 | 
						||
| 
								 | 
							
								    (set-cdr! (last-pair L1) L2)
							 | 
						||
| 
								 | 
							
								    L1))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define last-pair
							 | 
						||
| 
								 | 
							
								  (lambda (lst)
							 | 
						||
| 
								 | 
							
								    (while (cdr lst)
							 | 
						||
| 
								 | 
							
								      (set! lst (cdr lst)))
							 | 
						||
| 
								 | 
							
								    lst))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define memq (lambda (x lst) (member:test eq? x lst)))
							 | 
						||
| 
								 | 
							
								(define member (lambda (x lst) (member:test equal? x lst)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define member:test 
							 | 
						||
| 
								 | 
							
								  (lambda (=? x lst)
							 | 
						||
| 
								 | 
							
								    (while (and lst (not (=? x (car lst))))
							 | 
						||
| 
								 | 
							
								      (set! lst (cdr lst)))
							 | 
						||
| 
								 | 
							
								    lst))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define assq (lambda (key pairs) (assoc:test eq? key pairs)))
							 | 
						||
| 
								 | 
							
								(define assoc (lambda (key pairs) (assoc:test equal? key pairs)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define assoc:test
							 | 
						||
| 
								 | 
							
								  (lambda (=? key pairs)
							 | 
						||
| 
								 | 
							
								    (while (and pairs (not (=? key (caar pairs))))
							 | 
						||
| 
								 | 
							
								      (set! pairs (cdr pairs)))
							 | 
						||
| 
								 | 
							
								    (and pairs (car pairs))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define sublis
							 | 
						||
| 
								 | 
							
								  (lambda (a-list exp)
							 | 
						||
| 
								 | 
							
								    (cond
							 | 
						||
| 
								 | 
							
								      ((null? exp) '())
							 | 
						||
| 
								 | 
							
								      ((atom? exp)
							 | 
						||
| 
								 | 
							
								       (let ((binding (assq exp a-list)))
							 | 
						||
| 
								 | 
							
								         (if binding (cdr binding) exp)))
							 | 
						||
| 
								 | 
							
								      (else
							 | 
						||
| 
								 | 
							
								        (cons (sublis a-list (car exp))
							 | 
						||
| 
								 | 
							
								              (sublis a-list (cdr exp)))))))
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								(define remove
							 | 
						||
| 
								 | 
							
								  (lambda (key lst)
							 | 
						||
| 
								 | 
							
								    (if (null? lst)
							 | 
						||
| 
								 | 
							
								        '()
							 | 
						||
| 
								 | 
							
								        (if (eq? key (car lst))
							 | 
						||
| 
								 | 
							
								            (cdr lst)
							 | 
						||
| 
								 | 
							
								            (cons (car lst)
							 | 
						||
| 
								 | 
							
								                  (remove key (cdr lst)))))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define list-ref
							 | 
						||
| 
								 | 
							
								  (lambda (lst n)
							 | 
						||
| 
								 | 
							
								    (if (null? lst) 
							 | 
						||
| 
								 | 
							
								        '()
							 | 
						||
| 
								 | 
							
								        (if (= n 0) 
							 | 
						||
| 
								 | 
							
								            (car lst)
							 | 
						||
| 
								 | 
							
								            (list-ref (cdr lst) (- n 1))))))
							 |