Skip to content

Commit 0e065ed

Browse files
committed
fn cons/concat
1 parent 6620d3d commit 0e065ed

File tree

3 files changed

+97
-63
lines changed

3 files changed

+97
-63
lines changed

Diff for: sclin/src/Cmd.scala

+84-54
Original file line numberDiff line numberDiff line change
@@ -19,92 +19,135 @@ extension (env: ENV)
1919
*/
2020
case "(" => env.startFN
2121
/*
22-
@s ->
22+
@s -> FN
2323
End `FN`.
2424
*/
2525
case ")" => env
2626
/*
27-
@s ->
28-
#{)} #{<+}.
27+
@s -> FN
28+
Empty `FN`.
2929
*/
30-
case ")+" => env.cons
30+
case "()" => env.push(UN.toFN(env))
3131
/*
32-
@s ->
33-
#{)} #{+`}.
32+
@s -> FN
33+
#{)} #{,+}.
3434
*/
35-
case ")++" => env.add$$
35+
case ")+" => env.consFN
3636
/*
37-
@s ->
37+
@s a -> FN
38+
#{()} #{,+}.
39+
*/
40+
case "()+" => env.push(UN.toFN(env)).consFN
41+
/*
42+
@s -> FN
43+
#{)} #{,+`}.
44+
*/
45+
case ")++" => env.concatFN
46+
/*
47+
@s a -> FN
48+
#{()} #{,+`}.
49+
*/
50+
case "()++" => env.push(UN.toFN(env)).concatFN
51+
/*
52+
@s -> TASK
3853
#{)} #{~Q}.
3954
*/
4055
case ")~" => env.evalTASK
4156
/*
57+
@s -> TASK
58+
Empty `TASK`.
59+
*/
60+
case "()~" => env.push(UN.toTASK)
61+
/*
4262
@s ->
4363
#{)} #{!Q}.
4464
*/
4565
case ")!" => env.evalTRY
4666
/*
67+
@s -> TRY
68+
Empty `TRY`.
69+
*/
70+
case "()!" => env.push(UN.toTRY)
71+
/*
4772
@s ->
4873
#{)} #{@$}.
4974
*/
50-
case ")#" => env.locId
75+
case ")#" => env.locId
76+
case "()#" => env
5177
/*
5278
@s ->
5379
#{)} #{@$$}.
5480
*/
55-
case ")##" => env.globId
81+
case ")##" => env.globId
82+
case "()##" => env
5683
/*
5784
@s ->
5885
#{)} #{->}.
5986
*/
60-
case ")=" => env.lambda
87+
case ")=" => env.lambda
88+
case "()=" => env
6189
/*
6290
@s ->
6391
Start `ARR`/`MAP`.
6492
*/
6593
case "[" => env.startARR
6694
/*
67-
@s ->
95+
@s -> ARR
6896
End `ARR`.
6997
*/
7098
case "]" => env.endARR
7199
/*
72-
@s ->
100+
@s -> ARR
101+
Empty `ARR`.
102+
*/
103+
case "[]" => env.push(UN.toARR)
104+
/*
105+
@s -> STR
73106
#{]} #{>S}.
74107
*/
75108
case "]S" => env.endARR.envSTR
76109
/*
77-
@s ->
110+
@s -> STR
111+
Empty `STR`.
112+
*/
113+
case "[]S" => env.push(UN.toSTR)
114+
/*
115+
@s -> MAP
78116
End `MAP`.
79117
*/
80118
case "]:" => env.endMAP
81119
/*
82-
@s ->
120+
@s -> MAP
121+
Empty `MAP`.
122+
*/
123+
case "[]:" => env.push(UN.toMAP)
124+
/*
125+
@s -> _
83126
#{]} #{:/}.
84127
*/
85128
case "/]" => env.endARR.getn
86129
/*
87-
@s ->
130+
@s -> _
88131
#{]} #{:/=}.
89132
*/
90133
case "/]=" => env.endARR.setn
91134
/*
92-
@s ->
135+
@s -> _
93136
#{]} #{:/%}.
94137
*/
95138
case "/]%" => env.endARR.setmodn
96139
/*
97-
@s ->
140+
@s -> _
98141
#{]:} #{:*}.
99142
*/
100143
case "]*" => env.endMAP.gets
101144
/*
102-
@s ->
145+
@s -> _
103146
#{]:} #{:*=}.
104147
*/
105148
case "]=" => env.endMAP.sets
106149
/*
107-
@s ->
150+
@s -> _
108151
#{]:} #{:*%}.
109152
*/
110153
case "]%" => env.endMAP.setmods
@@ -278,31 +321,6 @@ extension (env: ENV)
278321
*/
279322
case "$F" => env.push(TF(false))
280323
/*
281-
@s -> FN
282-
Empty `FN`.
283-
*/
284-
case "()" => env.push(UN.toFN(env))
285-
/*
286-
@s -> ARR
287-
Empty `ARR`.
288-
*/
289-
case "[]" => env.push(UN.toARR)
290-
/*
291-
@s -> MAP
292-
Empty `MAP`.
293-
*/
294-
case "[]:" => env.push(UN.toMAP)
295-
/*
296-
@s -> TASK
297-
Empty `TASK`.
298-
*/
299-
case "()~" => env.push(UN.toTASK)
300-
/*
301-
@s -> TRY
302-
Empty `TRY`.
303-
*/
304-
case "()!" => env.push(UN.toTRY)
305-
/*
306324
@s -> NUM
307325
π (Pi).
308326
*/
@@ -913,6 +931,18 @@ extension (env: ENV)
913931
*/
914932
case ">+" => env.unsnoc
915933
/*
934+
@s a (b >FN) -> FN
935+
`FN`-specific #{<+}.
936+
Wraps `a` in `ARR` and uses #{,_} to preserve `a`'s value.'
937+
*/
938+
case ",+" => env.consFN
939+
/*
940+
@s a (b >FN) -> FN
941+
`FN`-specific #{+`}.
942+
Uses #{,_} to preserve the values of `a`'s elements.'
943+
*/
944+
case ",+`" => env.concatFN
945+
/*
916946
@s (a >NUM)' (b >NUM)' -> NUM'
917947
`a - b`
918948
*/
@@ -1334,47 +1364,47 @@ extension (env: ENV)
13341364
*/
13351365
case ":`" => env.get$$
13361366
/*
1337-
@s a (i >MAP) -> x
1367+
@s a (i >MAP) -> _
13381368
#{:`} with `i` mapped over `a`.
13391369
*/
13401370
case ":*" => env.gets
13411371
/*
1342-
@s a b (i >SEQ) -> x
1372+
@s a b (i >SEQ) -> _
13431373
#{:`} with `i` folded over `a`.
13441374
*/
13451375
case ":/" => env.getn
13461376
/*
1347-
@s a b i -> x
1377+
@s a b i -> _
13481378
Sets value at index `i` in `a` to `b`.
13491379
*/
13501380
case ":=" => env.set
13511381
/*
1352-
@s a (m >MAP) -> x
1382+
@s a (m >MAP) -> _
13531383
#{:=} with `i` mapped over `a`.
13541384
*/
13551385
case ":*=" => env.sets
13561386
/*
1357-
@s a b (i >SEQ) -> x
1387+
@s a b (i >SEQ) -> _
13581388
#{:=} with `i` folded over `a`.
13591389
*/
13601390
case ":/=" => env.setn
13611391
/*
1362-
@s a (f >FN) i -> x
1392+
@s a (f >FN) i -> _
13631393
Modifies value at index `i` using `f`.
13641394
*/
13651395
case ":%" => env.setmod
13661396
/*
1367-
@s a (m >MAP[(_ => (_ >FN))*]) -> x
1397+
@s a (m >MAP[(_ => (_ >FN))*]) -> _
13681398
#{:%} with `i` mapped over `a`.
13691399
*/
13701400
case ":*%" => env.setmods
13711401
/*
1372-
@s a (f >FN) (i >SEQ) -> x
1402+
@s a (f >FN) (i >SEQ) -> _
13731403
#{:%} with `i` folded over `a`.
13741404
*/
13751405
case ":/%" => env.setmodn
13761406
/*
1377-
@s a i -> x
1407+
@s a i -> _
13781408
Removes index `i` from `a`.
13791409
*/
13801410
case ":-" => env.idel

Diff for: sclin/src/Lib.scala

-9
Original file line numberDiff line numberDiff line change
@@ -280,15 +280,6 @@ extension (env: ENV)
280280

281281
def dip: ENV = env.arg2((x, f, env) => env.push(f).evale.push(x))
282282

283-
def wrap$ : ENV = env.modx(2)(_.toARR)
284-
def wrap: ENV = env.modx(1)(_.toARR)
285-
def wrap$$ : ENV = env.modStack(x => Vector(x.toARR))
286-
def wrapv$ : ENV = env.vec2(Vector(_, _).toARR)
287-
def wrapv: ENV = env.vec1(Vector(_).toARR)
288-
def unwrap: ENV = env.mods1(_.toARR.x)
289-
def unwrap$ : ENV = env.arg1((x, env) => env.modStack(_ => x.toARR.x))
290-
def wrapFN: ENV = env.wrap.mod1(_.toFN(env))
291-
292283
def dot: ENV = env.code.x match
293284
case c #:: cs =>
294285
env

Diff for: sclin/src/LibItr.scala

+13
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,19 @@ extension (env: ENV)
4343
def rank: ENV = env.mod1(_.rank.pipe(NUM(_)))
4444
def depth: ENV = env.mod1(_.depth.pipe(NUM(_)))
4545

46+
def wrap$ : ENV = env.modx(2)(_.toARR)
47+
def wrap: ENV = env.modx(1)(_.toARR)
48+
def wrap$$ : ENV = env.modStack(x => Vector(x.toARR))
49+
def wrapv$ : ENV = env.vec2(Vector(_, _).toARR)
50+
def wrapv: ENV = env.vec1(Vector(_).toARR)
51+
def unwrap: ENV = env.mods1(_.toARR.x)
52+
def unwrap$ : ENV = env.arg1((x, env) => env.modStack(_ => x.toARR.x))
53+
def wrapFN: ENV = env.wrap.mod1(_.toFN(env))
54+
55+
def consFN: ENV =
56+
env.mod2((x, y) => Vector(x).toARR.cons(CMD(",_").cons(y.toFN(env))))
57+
def concatFN: ENV = env.mod2((x, y) => x.cons(CMD(",_").cons(y.toFN(env))))
58+
4659
def rep: ENV = env.mod1(LazyList.continually(_).toSEQ)
4760
def orep: ENV = env.mod1(Observable.repeat(_).toOBS)
4861
def cyc: ENV = env.mod1(x => LazyList.continually(x).mSEQ(x).flat)

0 commit comments

Comments
 (0)