Skip to content

Commit 78209cc

Browse files
committed
Add where operator
1 parent a8faa65 commit 78209cc

File tree

3 files changed

+34
-1
lines changed

3 files changed

+34
-1
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ Code | Stdin | Stdout
9898
`]((2=1 2 3)@1;7;8)` | | `7`
9999
`]((2=1 2 3)@2;7;8)` | | `8`
100100
`]1 2 3@0 2` | | `1 3`
101+
`]&1 2 3` | | `0 1 1 2 2 2`
102+
`]7 8@&2 3` | | `7 7 8 8 8`
101103
`]@{w+1}'1 2 3` | | `2 3 4`
102104
`]@{1-w}'3 4 5` | | `-2 -3 -4`
103105
`]2{a+w}'3 4 5` | | `5 6 7`

silly-k.scm

+30-1
Original file line numberDiff line numberDiff line change
@@ -782,7 +782,8 @@
782782
(cons 'more (list `(lambda int (lambda int bool))
783783
`(lambda (vector int) (lambda int (vector bool)))
784784
`(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))
786787
`(lambda int (lambda int int))))
787788
(cons 'max (list `(lambda bool (lambda bool bool))
788789
`(lambda int (lambda int int))))
@@ -1222,6 +1223,8 @@
12221223
(unify (list (list '(lambda (typevar T0) (lambda int (vector (typevar T0)))) t^)))) => (lambda (sub)
12231224
(let ([T0 (mk-Type (sub '(typevar T0)))])
12241225
`(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)))]
12251228
[else e]))]))
12261229

12271230
(define-pass type-check : L9 (e) -> L9 ()
@@ -1435,6 +1438,16 @@
14351438
(go (cons (car ys^) acc) (cdr ys^) (- i 1)))])))]
14361439
(go '() xs n))))]
14371440
[(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 '())))]
14381451
[else (error 'output-scheme "unsupported primitive function" pf)])]
14391452
[(apply ,e0 ,e1) `(,(Expr e0) ,(Expr e1))]
14401453
[(lambda (,s) ,e) `(lambda (,s) ,[Expr e])]
@@ -1495,6 +1508,7 @@
14951508
[(equal? pf 'coerce-bool-int) '$identity]
14961509
[(equal? pf 'at) '$at]
14971510
[(equal? pf 'at-vector) '$at_vector]
1511+
[(equal? pf 'where) '$where]
14981512
[else (error 'output-malfunction "unsupported primitive function" pf)])]
14991513
[(apply ,e0 ,e1) `(apply ,(Expr e0) ,(Expr e1))]
15001514
[(lambda (,s) ,e) `(lambda (,[mlf-symbol s]) ,[Expr e])]
@@ -1568,6 +1582,21 @@
15681582
(apply (global $Array $init)
15691583
(length $is)
15701584
(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))))
15711600
(_ ,[Expr e])
15721601
(_ (apply (global $Pervasives $print_newline) ,mlf-unit))
15731602
(export))

tests.scm

+2
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@
7373
(make-test-case "at02" "]((2=1 2 3)@1;7;8)" #f "7")
7474
(make-test-case "at03" "]((2=1 2 3)@2;7;8)" #f "8")
7575
(make-test-case "at04" "]1 2 3@0 2" #f "1 3")
76+
(make-test-case "where01" "]&1 2 3" #f "0 1 1 2 2 2")
77+
(make-test-case "where02" "]7 8@&2 3" #f "7 7 8 8 8")
7678
(make-test-case "over01" "]@{w+1}'1 2 3" #f "2 3 4")
7779
(make-test-case "over02" "]@{1-w}'3 4 5" #f "-2 -3 -4")
7880
(make-test-case "over03" "]2{a+w}'3 4 5" #f "5 6 7")

0 commit comments

Comments
 (0)