|
460 | 460 | ;; let |
461 | 461 | (pattern-lambda (let ex . binds) |
462 | 462 | (let loop ((binds binds) |
| 463 | + (args ()) |
| 464 | + (inits ()) |
463 | 465 | (locls ()) |
464 | 466 | (stmts ())) |
465 | 467 | (if (null? binds) |
466 | | - `(call (-> (tuple) |
| 468 | + `(call (-> (tuple ,@args) |
467 | 469 | (block (local (vars ,@locls)) |
468 | 470 | ,@stmts |
469 | 471 | ,ex)) |
470 | | - ) |
| 472 | + ,@inits) |
471 | 473 | (cond |
472 | 474 | ((or (symbol? (car binds)) (decl? (car binds))) |
473 | 475 | ;; just symbol -> add local |
474 | | - (loop (cdr binds) |
| 476 | + (loop (cdr binds) args inits |
475 | 477 | (cons (car binds) locls) |
476 | 478 | stmts)) |
477 | 479 | ((and (length= (car binds) 3) |
|
480 | 482 | (cond |
481 | 483 | ((or (symbol? (cadar binds)) |
482 | 484 | (decl? (cadar binds))) |
483 | | - ;; a=b -> add local and initializer |
| 485 | + ;; a=b -> add argument |
484 | 486 | (loop (cdr binds) |
485 | | - (cons (cadar binds) locls) |
486 | | - (cons `(= ,(decl-var (cadar binds)) |
| 487 | + (cons (cadar binds) args) |
| 488 | + (cons (caddar binds) inits) |
| 489 | + locls stmts)) |
| 490 | + #;(cons (cadar binds) locls) |
| 491 | + #;(cons `(= ,(decl-var (cadar binds)) |
487 | 492 | ,(caddar binds)) |
488 | | - stmts))) |
| 493 | + stmts);)) |
489 | 494 | ((and (pair? (cadar binds)) |
490 | 495 | (eq? (caadar binds) 'call)) |
491 | 496 | ;; f()=c |
492 | 497 | (let ((asgn (cadr (julia-expand0 (car binds))))) |
493 | | - (loop (cdr binds) |
| 498 | + (loop (cdr binds) args inits |
494 | 499 | (cons (cadr asgn) locls) |
495 | 500 | (cons asgn stmts)))) |
496 | 501 | (else (error "invalid let syntax")))) |
|
738 | 743 | (break-block loop-cont |
739 | 744 | ,body) |
740 | 745 | (= ,cnt (call + 1 ,cnt)))))))) |
741 | | - (let ((lim (if (number? b) b (gensy)))) |
| 746 | + (let ((cnt (gensy)) |
| 747 | + (lim (if (number? b) b (gensy)))) |
742 | 748 | `(scope-block |
743 | 749 | (block |
744 | | - (= ,var ,a) |
| 750 | + (= ,cnt ,a) |
745 | 751 | ,@(if (eq? lim b) '() `((= ,lim ,b))) |
746 | 752 | (break-block loop-exit |
747 | | - (_while (call <= ,var ,lim) |
| 753 | + (_while (call <= ,cnt ,lim) |
748 | 754 | (block |
| 755 | + (= ,var ,cnt) |
749 | 756 | (break-block loop-cont |
750 | 757 | ,body) |
751 | | - (= ,var (call + |
| 758 | + (= ,cnt (call + |
752 | 759 | (call (top convert) |
753 | 760 | (call (top typeof) |
754 | | - ,var) |
| 761 | + ,cnt) |
755 | 762 | 1) |
756 | | - ,var))))))))))) |
| 763 | + ,cnt))))))))))) |
757 | 764 |
|
758 | 765 | ; for loop over arbitrary vectors |
759 | 766 | (pattern-lambda |
|
0 commit comments