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))))))
 |