native implementatino of for-each
This commit is contained in:
		
							parent
							
								
									85a5745716
								
							
						
					
					
						commit
						c539f889cd
					
				|  | @ -748,23 +748,6 @@ | ||||||
| 
 | 
 | ||||||
| ;;; 6.10 control features | ;;; 6.10 control features | ||||||
| 
 | 
 | ||||||
| (define (for-each f list . lists) |  | ||||||
|   (define (single-for-each f list) |  | ||||||
|     (if (null? list) |  | ||||||
| 	#f |  | ||||||
| 	(begin |  | ||||||
| 	  (f (car list)) |  | ||||||
| 	  (single-for-each f (cdr list))))) |  | ||||||
|   (define (multiple-for-each f lists) |  | ||||||
|     (if (any null? lists) |  | ||||||
| 	#f |  | ||||||
| 	(begin |  | ||||||
| 	  (apply f (map car lists)) |  | ||||||
| 	  (multiple-for-each f (map cdr lists))))) |  | ||||||
|   (if (null? lists) |  | ||||||
|       (single-for-each f list) |  | ||||||
|       (multiple-for-each f (cons list lists)))) |  | ||||||
| 
 |  | ||||||
| (define (string-map f v . vs) | (define (string-map f v . vs) | ||||||
|   (let* ((len (fold min (string-length v) (map string-length vs))) |   (let* ((len (fold min (string-length v) (map string-length vs))) | ||||||
| 	 (vec (make-string len))) | 	 (vec (make-string len))) | ||||||
|  | @ -803,8 +786,7 @@ | ||||||
| 	       (map (lambda (v) (vector-ref v n)) vs)) | 	       (map (lambda (v) (vector-ref v n)) vs)) | ||||||
| 	(loop (+ n 1)))))) | 	(loop (+ n 1)))))) | ||||||
| 
 | 
 | ||||||
| (export for-each | (export string-map string-for-each | ||||||
|         string-map string-for-each |  | ||||||
|         vector-map vector-for-each) |         vector-map vector-for-each) | ||||||
| 
 | 
 | ||||||
| ;;; 6.13. Input and output | ;;; 6.13. Input and output | ||||||
|  |  | ||||||
							
								
								
									
										29
									
								
								src/proc.c
								
								
								
								
							
							
						
						
									
										29
									
								
								src/proc.c
								
								
								
								
							|  | @ -126,10 +126,39 @@ pic_proc_map(pic_state *pic) | ||||||
|   return pic_reverse(pic, ret); |   return pic_reverse(pic, ret); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static pic_value | ||||||
|  | pic_proc_for_each(pic_state *pic) | ||||||
|  | { | ||||||
|  |   struct pic_proc *proc; | ||||||
|  |   size_t argc; | ||||||
|  |   pic_value *args; | ||||||
|  |   int i; | ||||||
|  |   pic_value cars; | ||||||
|  | 
 | ||||||
|  |   pic_get_args(pic, "l*", &proc, &argc, &args); | ||||||
|  | 
 | ||||||
|  |   do { | ||||||
|  |     cars = pic_nil_value(); | ||||||
|  |     for (i = argc - 1; i >= 0; --i) { | ||||||
|  |       if (! pic_pair_p(args[i])) { | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |       cars = pic_cons(pic, pic_car(pic, args[i]), cars); | ||||||
|  |       args[i] = pic_cdr(pic, args[i]); | ||||||
|  |     } | ||||||
|  |     if (i >= 0) | ||||||
|  |       break; | ||||||
|  |     pic_apply(pic, proc, cars); | ||||||
|  |   } while (1); | ||||||
|  | 
 | ||||||
|  |   return pic_none_value(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void | void | ||||||
| pic_init_proc(pic_state *pic) | pic_init_proc(pic_state *pic) | ||||||
| { | { | ||||||
|   pic_defun(pic, "procedure?", pic_proc_proc_p); |   pic_defun(pic, "procedure?", pic_proc_proc_p); | ||||||
|   pic_defun(pic, "apply", pic_proc_apply); |   pic_defun(pic, "apply", pic_proc_apply); | ||||||
|   pic_defun(pic, "map", pic_proc_map); |   pic_defun(pic, "map", pic_proc_map); | ||||||
|  |   pic_defun(pic, "for-each", pic_proc_for_each); | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Yuichi Nishiwaki
						Yuichi Nishiwaki