for and doFor in KissInterp2, roughly
Some checks failed
CI / test (push) Failing after 1m4s
CI / test-core (14, ubuntu-latest, 3.x, cpp) (push) Failing after 2m42s
CI / test-core (14, ubuntu-latest, 3.x, interp) (push) Failing after 2m31s
CI / test-core (14, ubuntu-latest, 3.x, nodejs) (push) Failing after 2m49s
CI / test-core (14, ubuntu-latest, 3.x, js) (push) Failing after 2m30s
CI / test-core (14, ubuntu-latest, 3.x, py) (push) Failing after 3m6s
Some checks failed
CI / test (push) Failing after 1m4s
CI / test-core (14, ubuntu-latest, 3.x, cpp) (push) Failing after 2m42s
CI / test-core (14, ubuntu-latest, 3.x, interp) (push) Failing after 2m31s
CI / test-core (14, ubuntu-latest, 3.x, nodejs) (push) Failing after 2m49s
CI / test-core (14, ubuntu-latest, 3.x, js) (push) Failing after 2m30s
CI / test-core (14, ubuntu-latest, 3.x, py) (push) Failing after 3m6s
This commit is contained in:
@@ -26,7 +26,7 @@
|
||||
|
||||
(prop :Map<String,(Array<ReaderExp>,Dynamic->Void)->Void> specialForms)
|
||||
|
||||
(method makeExp [:ReaderExpDef def]
|
||||
(function makeExp [:ReaderExpDef def]
|
||||
(object pos null def def))
|
||||
|
||||
(method declareInScope [:Map<String,Dynamic> scope]
|
||||
@@ -35,8 +35,33 @@
|
||||
(evalCC (second args) ->val {(dictSet scope name val) (cc val)})))
|
||||
|
||||
(function callSymbol [:String symbolName :Array<ReaderExp> args]
|
||||
(ReaderExpDef.CallExp
|
||||
(object pos null def (ReaderExpDef.Symbol symbolName)) args))
|
||||
(makeExp (ReaderExpDef.CallExp
|
||||
(makeExp (ReaderExpDef.Symbol symbolName)) args)))
|
||||
|
||||
(function listExp [:Array<ReaderExp> args]
|
||||
(makeExp (ReaderExpDef.ListExp args)))
|
||||
|
||||
(method forLoop [collect]
|
||||
->[args cc]
|
||||
(let [varName (first args) collectionExp (second args) body (args.slice 2)]
|
||||
(localScopes.push (new Map))
|
||||
(evalCC collectionExp ->collection
|
||||
(let [:Iterable<Dynamic> collection collection
|
||||
:Array<Dynamic> results []
|
||||
iter (collection.iterator)]
|
||||
(dictSet (last localScopes) "__iter__" iter)
|
||||
(localFunction run []
|
||||
(if (iter.hasNext)
|
||||
(evalCC (callSymbol "let" (.concat [(listExp [varName (callSymbol "__iter__.next" [])])] body))
|
||||
->v {(when collect
|
||||
(results.push v))
|
||||
(run)
|
||||
})
|
||||
{
|
||||
(localScopes.pop)
|
||||
(cc results)
|
||||
}))
|
||||
(run)))))
|
||||
|
||||
(method makeFunction [:Array<ReaderExp> argExps :Array<ReaderExp> bodyExps]
|
||||
(let [capture (localScopes.copy)
|
||||
@@ -87,7 +112,8 @@
|
||||
(if val
|
||||
(evalCC (second args) cc)
|
||||
(evalCC (third args) cc)))
|
||||
// TODO handle early return
|
||||
// TODO handle early return, loop break/continue
|
||||
// TODO this should make a local scope!
|
||||
=>"begin"
|
||||
->[args cc]
|
||||
(_evalAllCC args ->values
|
||||
@@ -96,6 +122,7 @@
|
||||
(declareInScope globals)
|
||||
=>"localVar"
|
||||
(declareInScope (nth localScopes -1))
|
||||
// TODO support list unpacking
|
||||
=>"let"
|
||||
->[args cc]
|
||||
(let [bindings (first args)
|
||||
@@ -155,12 +182,10 @@
|
||||
func (makeFunction argExps bodyExps)]
|
||||
(dictSet globals name func)
|
||||
(cc func))
|
||||
/*
|
||||
=>"for"
|
||||
(forLoop true)
|
||||
=>"doFor"
|
||||
(forLoop false)
|
||||
*/
|
||||
=>"while"
|
||||
->[args cc]
|
||||
(let [condition (first args) body (rest args)]
|
||||
|
||||
@@ -43,5 +43,8 @@ class KissInterp2TestCase extends Test {
|
||||
function testWhile() {
|
||||
_testWhile();
|
||||
}
|
||||
function testFor() {
|
||||
_testFor();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -55,3 +55,7 @@
|
||||
(while (< c 9)
|
||||
(set c (+ c 1)))
|
||||
c)")))
|
||||
|
||||
(function _testFor []
|
||||
(let [interp (new Interp)]
|
||||
(assertEval [1 2 3] "(for i (range 3) (+ i 1))")))
|
||||
|
||||
Reference in New Issue
Block a user