Made it a module.
Put it in any directory, run guile -L . and then import (goof) in that directory.
This commit is contained in:
		
							parent
							
								
									317b3e732b
								
							
						
					
					
						commit
						7ddb707bb7
					
				
					 5 changed files with 59 additions and 14 deletions
				
			
		
							
								
								
									
										51
									
								
								goof/ref-let.scm
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								goof/ref-let.scm
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,51 @@ | |||
| (define-module (goof ref-let) | ||||
|   #:export (ref-let) | ||||
|   #:use-module (ice-9 match) | ||||
|   #:use-module (srfi srfi-71)) | ||||
| 
 | ||||
| (define-syntax ref-let | ||||
|   (syntax-rules () | ||||
|     ((ref-let ids body ...) | ||||
|      (rl () () ids body ...)))) | ||||
| 
 | ||||
| (define-syntax rl | ||||
|   (syntax-rules (values) | ||||
|     ;; emit simple case, no match | ||||
|     ((_ (lets ...) () () body ...) | ||||
|      (let (lets ...) | ||||
|        body ...)) | ||||
|     ;; emit, hard case. | ||||
|     ((rl (lets ...) (matches ...) () body ...) | ||||
|      (let (lets ...) | ||||
|        (match-let (matches ...) | ||||
|          body ...))) | ||||
| 
 | ||||
| 
 | ||||
|     ;; a (values ...) clause: | ||||
|     ((rl (l ...) m (((values . v) expr) . clause-rest) . body) | ||||
|      (rl (l ... ((values . v) expr)) m clause-rest . body)) | ||||
|      | ||||
|     ;; Simple cases | ||||
|     ;; (rl ((a 5)) () (((b . _) (cons 1 2))) (+ a b)) | ||||
|     ((_ (l ...) (m ...) (((p . p-rest) expr) . clause-rest) body ...) | ||||
|      (rl (l ... (dummy expr)) (m ... ((p . p-rest) dummy)) clause-rest body ...)) | ||||
| 
 | ||||
|      | ||||
|     ((rl (l ...) (m ...) ((binding expr) . clause-rest) body ...) | ||||
|      (rl (l ... (binding expr)) (m ...) clause-rest body ...)) | ||||
| 
 | ||||
|     ;; More than one id | ||||
|     ((rl l m ((id id* ... expr) . clause-rest) . body) | ||||
|      (extract () () (id id* ... expr) l m clause-rest . body)))) | ||||
| 
 | ||||
| (define-syntax extract | ||||
|   (syntax-rules () | ||||
|     ((_ let-binding (match-bindings ...) () (l ...) (m ...) clauses . body) | ||||
|      (rl (l ... let-binding) (m ... match-bindings ...) clauses . body)) | ||||
|     ((_ (lb ...) mb (expr) . rest) | ||||
|      (extract (lb ... expr) mb () . rest)) | ||||
|     ;; Pattern | ||||
|     ((_ (lb ...) (mb ...) ((p . p-rest) ids ...) . rest) | ||||
|      (extract (lb ... dummy) (mb ... ((p . p-rest) dummy)) (ids ...) . rest)) | ||||
|     ((_ (lb ...) mb (id ids ...) . rest) | ||||
|      (extract (lb ... id) mb (ids ...) . rest)))) | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Linus
						Linus