Fix the previous commit. Now also the simple loops are ensured to execute once if no for-clauses are given.
Instead of throwing a syntax-error...
This commit is contained in:
		
							parent
							
								
									685fe86f36
								
							
						
					
					
						commit
						d48ed19e43
					
				
					 1 changed files with 18 additions and 12 deletions
				
			
		|  | @ -441,33 +441,39 @@ | ||||||
|                                             . body))) |                                             . body))) | ||||||
|                      (intermediate-loop accvar ... step ...)))))))))) |                      (intermediate-loop accvar ... step ...)))))))))) | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| (define-syntax forify | (define-syntax forify | ||||||
|  |   (syntax-rules (%acc) | ||||||
|  |     ((_ orig name () ((%acc . acc-rest) . argsrest) . body) | ||||||
|  |      (forify* orig name () ((:for ensure-once (up-from 0 1)) (%acc . acc-rest) . argsrest) . body)) | ||||||
|  |     ((_ . rest) | ||||||
|  |      (forify* . rest)))) | ||||||
|  | 
 | ||||||
|  | (define-syntax forify* | ||||||
|   (syntax-rules (:for :acc :when :unless :break :final :subloop :let :let* %acc) |   (syntax-rules (:for :acc :when :unless :break :final :subloop :let :let* %acc) | ||||||
|     ((forify o n done-clauses () . body) |     ((_ o n done-clauses () . body) | ||||||
|      (%loop o n done-clauses . body)) |      (%loop o n done-clauses . body)) | ||||||
|     ((_      o n (s ...) ((:for c-rest ...) clauses ...) . body) |     ((_      o n (s ...) ((:for c-rest ...) clauses ...) . body) | ||||||
|      (forify o n (s ... (:for c-rest ...)) (clauses ...) . body)) |      (forify* o n (s ... (:for c-rest ...)) (clauses ...) . body)) | ||||||
|     ((_      o n (s ...) (:when expr clauses ...) . body) |     ((_      o n (s ...) (:when expr clauses ...) . body) | ||||||
|      (forify o n (s ... :when expr) (clauses ...) . body)) |      (forify* o n (s ... :when expr) (clauses ...) . body)) | ||||||
|     ((_      o n (s ...) (:unless expr clauses ...) . body) |     ((_      o n (s ...) (:unless expr clauses ...) . body) | ||||||
|      (forify o n (s ... :when expr) (clauses ...) . body)) |      (forify* o n (s ... :when expr) (clauses ...) . body)) | ||||||
|     ((_      o n (s ...) (:break expr clauses ...) . body) |     ((_      o n (s ...) (:break expr clauses ...) . body) | ||||||
|      (forify o n (s ... :break expr) (clauses ...) . body)) |      (forify* o n (s ... :break expr) (clauses ...) . body)) | ||||||
|     ((_      o n (s ...) (:final expr clauses ...) . body) |     ((_      o n (s ...) (:final expr clauses ...) . body) | ||||||
|      (forify o n (s ... :final expr) (clauses ...) . body)) |      (forify* o n (s ... :final expr) (clauses ...) . body)) | ||||||
|     ((_      o n (s ...) (:subloop clauses ...) . body) |     ((_      o n (s ...) (:subloop clauses ...) . body) | ||||||
|      (forify o n (s ... :subloop) (clauses ...) . body)) |      (forify* o n (s ... :subloop) (clauses ...) . body)) | ||||||
|     ((_      o n (s ...) ((:let id id* ... expr) clauses ...) . body) |     ((_      o n (s ...) ((:let id id* ... expr) clauses ...) . body) | ||||||
|      (forify o n (s ... (:let id id* ... expr)) (clauses ...) . body)) |      (forify* o n (s ... (:let id id* ... expr)) (clauses ...) . body)) | ||||||
|     ((_      o n (s ...) ((:let* id id* ... expr) clauses ...) . body) |     ((_      o n (s ...) ((:let* id id* ... expr) clauses ...) . body) | ||||||
|      (forify o n (s ... (:let* id id* ... expr)) (clauses ...) . body)) |      (forify* o n (s ... (:let* id id* ... expr)) (clauses ...) . body)) | ||||||
|     ((_      o n (s ...) ((%acc c-rest ...) clauses ...) . body) |     ((_      o n (s ...) ((%acc c-rest ...) clauses ...) . body) | ||||||
|      (forify o n (s ... (:acc c-rest ...)) (clauses ...) . body)) |      (forify* o n (s ... (:acc c-rest ...)) (clauses ...) . body)) | ||||||
|     ((_      o n (s ...) ((:acc c-rest ...) clauses ...) . body) |     ((_      o n (s ...) ((:acc c-rest ...) clauses ...) . body) | ||||||
|      (syntax-error "Accumulating clauses are not allowed in simplified loop forms." o)) |      (syntax-error "Accumulating clauses are not allowed in simplified loop forms." o)) | ||||||
|     ((_      o n (s ...) ((id id* ... (iterator source ...)) clauses ...) . body) |     ((_      o n (s ...) ((id id* ... (iterator source ...)) clauses ...) . body) | ||||||
|      (forify o n (s ... (:for id id* ... (iterator source ...))) (clauses ...) . body)))) |      (forify* o n (s ... (:for id id* ... (iterator source ...))) (clauses ...) . body)))) | ||||||
| 
 | 
 | ||||||
| (define-syntax loop/list | (define-syntax loop/list | ||||||
|   (syntax-rules () |   (syntax-rules () | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Linus
						Linus