|
782 | 782 | (cons 'more (list `(lambda int (lambda int bool))
|
783 | 783 | `(lambda (vector int) (lambda int (vector bool)))
|
784 | 784 | `(lambda int (lambda (vector int) (vector bool)))))
|
785 |
| - (cons 'min (list `(lambda bool (lambda bool bool)) |
| 785 | + (cons 'min (list `(lambda (vector int) (vector int)) |
| 786 | + `(lambda bool (lambda bool bool)) |
786 | 787 | `(lambda int (lambda int int))))
|
787 | 788 | (cons 'max (list `(lambda bool (lambda bool bool))
|
788 | 789 | `(lambda int (lambda int int))))
|
|
1222 | 1223 | (unify (list (list '(lambda (typevar T0) (lambda int (vector (typevar T0)))) t^)))) => (lambda (sub)
|
1223 | 1224 | (let ([T0 (mk-Type (sub '(typevar T0)))])
|
1224 | 1225 | `(primfun make-vector (lambda ,T0 (lambda int (vector ,T0))))))]
|
| 1226 | + [(and (equal? pf 'min) (equal? '(lambda (vector int) (vector int)) t^)) |
| 1227 | + `(primfun where (lambda (vector int) (vector int)))] |
1225 | 1228 | [else e]))]))
|
1226 | 1229 |
|
1227 | 1230 | (define-pass type-check : L9 (e) -> L9 ()
|
|
1435 | 1438 | (go (cons (car ys^) acc) (cdr ys^) (- i 1)))])))]
|
1436 | 1439 | (go '() xs n))))]
|
1437 | 1440 | [(equal? pf 'make-vector) '(lambda (a) (lambda (n) (make-list n a)))]
|
| 1441 | + [(equal? pf 'where) |
| 1442 | + '(lambda (xs) |
| 1443 | + (letrec ([go (lambda (xs i acc) |
| 1444 | + (cond |
| 1445 | + [(null? xs) (reverse acc)] |
| 1446 | + [else |
| 1447 | + (go (cdr xs) |
| 1448 | + (+ i 1) |
| 1449 | + (append (make-list (car xs) i) acc))]))]) |
| 1450 | + (go xs 0 '())))] |
1438 | 1451 | [else (error 'output-scheme "unsupported primitive function" pf)])]
|
1439 | 1452 | [(apply ,e0 ,e1) `(,(Expr e0) ,(Expr e1))]
|
1440 | 1453 | [(lambda (,s) ,e) `(lambda (,s) ,[Expr e])]
|
|
1495 | 1508 | [(equal? pf 'coerce-bool-int) '$identity]
|
1496 | 1509 | [(equal? pf 'at) '$at]
|
1497 | 1510 | [(equal? pf 'at-vector) '$at_vector]
|
| 1511 | + [(equal? pf 'where) '$where] |
1498 | 1512 | [else (error 'output-malfunction "unsupported primitive function" pf)])]
|
1499 | 1513 | [(apply ,e0 ,e1) `(apply ,(Expr e0) ,(Expr e1))]
|
1500 | 1514 | [(lambda (,s) ,e) `(lambda (,[mlf-symbol s]) ,[Expr e])]
|
|
1568 | 1582 | (apply (global $Array $init)
|
1569 | 1583 | (length $is)
|
1570 | 1584 | (lambda ($i) (load $xs (load $is $i))))))
|
| 1585 | + ($where (lambda ($xs) |
| 1586 | + (let |
| 1587 | + ($n (length $xs)) |
| 1588 | + ($l (apply (global $Array $fold_right) (lambda ($a $b) (+ $a $b)) $xs 0)) |
| 1589 | + ($ys (makevec $l 0)) |
| 1590 | + (rec |
| 1591 | + ($go (lambda ($o $j $i) |
| 1592 | + (switch (== $j (load $xs $i)) |
| 1593 | + (0 (seq |
| 1594 | + (store $ys (+ $o $j) $i) |
| 1595 | + (apply $go $o (+ $j 1) $i))) |
| 1596 | + (_ (switch (== $n (+ $i 1)) |
| 1597 | + (1 $ys) |
| 1598 | + (_ (apply $go (+ $o $j) 0 (+ $i 1))))))))) |
| 1599 | + (apply $go 0 0 0)))) |
1571 | 1600 | (_ ,[Expr e])
|
1572 | 1601 | (_ (apply (global $Pervasives $print_newline) ,mlf-unit))
|
1573 | 1602 | (export))
|
|
0 commit comments