mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			46 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Scheme
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Scheme
		
	
	
	
	
	
| (library (lambdastar)
 | |
|   (export (rename (lambda* lambda)))
 | |
|   (import (rnrs))
 | |
| 
 | |
| (define-syntax lambda*
 | |
|   (syntax-rules ()
 | |
|     ((_ a* e* ...)
 | |
|      ( lambda*-h a* (let () e* ...)))))
 | |
|   
 | |
| (define-syntax lambda*-h
 | |
|   (syntax-rules ()
 | |
|     ((_ () e)
 | |
|      (lambda a* (if (null? a*) e (apply (e) a*))))
 | |
|     ((_ (a a* ...) e) (posary-h (a a* ...) e))
 | |
|     ((_ (a a* ... . rest) e)
 | |
|      (polyvariadic-h (a a* ... . rest) e))
 | |
|     ((_ a* e) (lambda a* e))))
 | |
| 
 | |
| (define-syntax posary-h
 | |
|   (syntax-rules ()
 | |
|     ((_ (a a* ...) e)
 | |
|      (letrec
 | |
|          ((rec
 | |
|            (case-lambda
 | |
|                (() rec)
 | |
|              ((a a* ...) e)
 | |
|              ((a a* ... . rest)
 | |
|               (apply (rec a a* ...) rest))
 | |
|              (some (get-more rec some)))))
 | |
|        rec))))
 | |
| 
 | |
| (define-syntax polyvariadic-h
 | |
|   (syntax-rules ()
 | |
|     ((_ (a a* ... . rest) e)
 | |
|      (letrec
 | |
|        ((rec
 | |
|          (case-lambda
 | |
|            (() rec)
 | |
|            ((a a* ... . rest) e)
 | |
|            (some (get-more rec some)))))
 | |
|        rec))))
 | |
| 
 | |
| (define get-more
 | |
|   (lambda (rec some)
 | |
|      (lambda more 
 | |
|        (apply rec (append some more)))))) |