25 lines
		
	
	
		
			652 B
		
	
	
	
		
			Scheme
		
	
	
	
			
		
		
	
	
			25 lines
		
	
	
		
			652 B
		
	
	
	
		
			Scheme
		
	
	
	
| (define-library (picrin optional)
 | |
|   (import (scheme base))
 | |
| 
 | |
|   (define-syntax optional
 | |
|     (syntax-rules ()
 | |
|       ((_ args default)
 | |
|        (let ((t args))
 | |
|          (if (null? t) default (car t))))))
 | |
| 
 | |
|   (define-syntax let-optionals*
 | |
|     (syntax-rules ()
 | |
|       ((_ args () body ...)
 | |
|        (begin body ...))
 | |
|       ((_ args ((var default) . tail) body ...)
 | |
|        (let* ((t args)
 | |
|               (var (if (null? t) default (car t)))
 | |
|               (remain (if (null? t) '() (cdr t))))
 | |
|          (let-optionals* remain tail body ...)))
 | |
|       ((_ args rest body ...)
 | |
|        (let ((rest args))
 | |
|          body ...))))
 | |
| 
 | |
|   (export optional
 | |
|           let-optionals*))
 |