Skip to content

Commit

Permalink
proper implementation of qx// operator
Browse files Browse the repository at this point in the history
  • Loading branch information
prakashk committed Jun 11, 2013
1 parent 442416a commit 9c9f316
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 2 deletions.
2 changes: 2 additions & 0 deletions src/main/scala/org/moe/ast/AST.scala
Expand Up @@ -151,3 +151,5 @@ case class RegexSubstNode(target: AST, pattern: AST, replacement: AST, flags: AS

case class StringSequenceNode(exprs: List[AST]) extends AST
case class EvalExpressionNode(expr: String) extends AST

case class ExecuteCommandNode(expr: AST) extends AST
3 changes: 2 additions & 1 deletion src/main/scala/org/moe/ast/Serializer.scala
Expand Up @@ -541,7 +541,8 @@ object Serializer {
)
)

case EvalExpressionNode(value) => JSONObject(Map("EvalExpressionNode" -> value))
case EvalExpressionNode(value) => JSONObject(Map("EvalExpressionNode" -> value))
case ExecuteCommandNode(command) => JSONObject(Map("ExecuteCommandNode" -> toJSON(command)))

case x => "stub: " + x
}
Expand Down
5 changes: 5 additions & 0 deletions src/main/scala/org/moe/interpreter/guts/Operators.scala
Expand Up @@ -86,5 +86,10 @@ object Operators extends Utils {
callMethod(receiver, "subst", List(argPattern, argReplacement, argFlags))
}

case (env, ExecuteCommandNode(cmd: AST)) => {
val cmd_str = i.evaluate(env, cmd).asInstanceOf[MoeStrObject].getNativeValue
import sys.process._
r.NativeObjects.getStr( ParserUtils.formatStr(cmd_str).!! )
}
}
}
2 changes: 1 addition & 1 deletion src/main/scala/org/moe/parser/MoeProductions.scala
Expand Up @@ -324,7 +324,7 @@ trait MoeProductions extends MoeLiterals with JavaTokenParsers with PackratParse
case "qq" ~ expr => MoeStringParser.interpolateStr(expr)
case "qw" ~ expr => ArrayLiteralNode(splitString(expr))
// this is naive; doesn't handle embedded spaces in args
case "qx" ~ expr => SubroutineCallNode("system", splitString(expr))
case "qx" ~ expr => ExecuteCommandNode(MoeStringParser.interpolateStr(expr))
case "q" ~ expr => StringLiteralNode(expr)
}
def quoteRegexOp = "qr" ~ quotedString ~ opt(regexModifiers) ^^ {
Expand Down
23 changes: 23 additions & 0 deletions t/002-operators/002-quote.t
@@ -0,0 +1,23 @@
use Test::More;

# qw operator

{
my @result = qw{a b c};
ok(@result.eqv(["a", "b", "c"]), "... qw operator works");
}
{
my $x = "x";
my @result = qw<$x y z>;
ok(@result.eqv(['$x', 'y', 'z']), "... qw operator does not interpolate");
}

# qx operator

{
is(qx{echo hello, world}, "hello, world\n", "... qx operator works");
my $world = "world";
is(qx{echo hello, $world}, "hello, world\n", "... qx operator interpolates");
}

done_testing();

0 comments on commit 9c9f316

Please sign in to comment.