Skip to content

Commit

Permalink
(WIP) Pass arguments into subs
Browse files Browse the repository at this point in the history
  • Loading branch information
jasonmay committed Feb 6, 2013
1 parent 17532f6 commit e5e56bc
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 10 deletions.
28 changes: 18 additions & 10 deletions src/main/scala/org/moe/interpreter/Interpreter.scala
Expand Up @@ -230,16 +230,24 @@ class Interpreter {
case MethodDeclarationNode(name, params, body) => stub
// TODO: handle arguments
case SubroutineDeclarationNode(name, params, body) => {
scoped { newEnv =>
val sub = new MoeSubroutine(
name,
params => eval(runtime, newEnv, body)
)
env.getCurrentPackage.getOrElse(
throw new MoeErrors.PackageNotFound("__PACKAGE__")
).addSubroutine( sub )
sub
}
val env_snapshot = env.ancestralClone
val sub_env = new MoeEnvironment(Some(env_snapshot))
val sub = new MoeSubroutine(
name,
args => {
// TODO make a run through after parse-time to check
// for argument counts at the call sites
val param_pairs = params zip args
param_pairs.foreach({ case (param, arg) =>
sub_env.create(param, arg)
})
eval(runtime, sub_env, body)
}
)
env.getCurrentPackage.getOrElse(
throw new MoeErrors.PackageNotFound("__PACKAGE__")
).addSubroutine( sub )
sub
}

case AttributeAccessNode(name) => stub
Expand Down
3 changes: 3 additions & 0 deletions src/main/scala/org/moe/runtime/MoeEnvironment.scala
Expand Up @@ -23,6 +23,9 @@ class MoeEnvironment(

private val pad: Map[String, MoeObject] = new HashMap[String, MoeObject]()

// Clone the environment and clone its ancestry all the way down
def ancestralClone: MoeEnvironment = new MoeEnvironment(parent.map(_.ancestralClone))

def getCurrentPackage : Option[MoePackage] = get(Markers.Package).asInstanceOf[Option[MoePackage]]
def getCurrentClass : Option[MoeClass] = get(Markers.Class).asInstanceOf[Option[MoeClass]]
def getCurrentInvocant : Option[MoeObject] = get(Markers.Invocant)
Expand Down
41 changes: 41 additions & 0 deletions src/test/scala/org/moe/interpreter/SubroutineNodeTestSuite.scala
@@ -0,0 +1,41 @@
package org.moe.interpreter

import org.scalatest.FunSuite

import org.moe.runtime._
import org.moe.ast._

class SubroutineNodeTestSuite extends FunSuite with InterpreterTestUtils {

test("... basic test with one-arg sub") {
// package Foo { sub inc($n) { ++$n }
// my $n = 1; inc($n); inc($n); $n }
val ast = wrapSimpleAST(
List(
PackageDeclarationNode(
"Foo",
StatementsNode(
List(
SubroutineDeclarationNode(
"inc",
List("$n"),
StatementsNode(
List(
IncrementNode(VariableAccessNode("$n"))
)
)
),
VariableDeclarationNode("$n", IntLiteralNode(1)),
SubroutineCallNode("inc", List(VariableAccessNode("$n"))),
SubroutineCallNode("inc", List(VariableAccessNode("$n"))),
VariableAccessNode("$n")
)
)
)
)
)
val result = interpreter.eval(runtime, runtime.getRootEnv, ast)
assert(result.asInstanceOf[MoeIntObject].getNativeValue === 3)
}

}

0 comments on commit e5e56bc

Please sign in to comment.