Skip to content

Commit

Permalink
simplify Q::Statement::My structure a bit
Browse files Browse the repository at this point in the history
After looking at IntelliJ's Java PSI, I realized that theirs is
a preferable way to implement Q::Statement::My and
Q::Statement::Constant. It looks like an assignment, but storing
it as one is redundant.

(It always did feel like a code smell and a OAOO risk that we had
to mention the variable name twice in those. Risk now averted;
smell febrezed.)
  • Loading branch information
Carl Masak committed Oct 22, 2015
1 parent ff8efe8 commit 2ba07ad
Show file tree
Hide file tree
Showing 13 changed files with 73 additions and 78 deletions.
12 changes: 2 additions & 10 deletions lib/_007/Parser/Actions.pm
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,7 @@ class _007::Parser::Actions {

method statement:my ($/) {
if $<EXPR> {
make Q::Statement::My.new(
$<identifier>.ast,
Q::Infix::Assignment.new(
$<identifier>.ast,
$<EXPR>.ast));
make Q::Statement::My.new($<identifier>.ast, $<EXPR>.ast);
}
else {
make Q::Statement::My.new($<identifier>.ast);
Expand All @@ -31,11 +27,7 @@ class _007::Parser::Actions {

method statement:constant ($/) {
if $<EXPR> {
make Q::Statement::Constant.new(
$<identifier>.ast,
Q::Infix::Assignment.new(
$<identifier>.ast,
$<EXPR>.ast));
make Q::Statement::Constant.new($<identifier>.ast, $<EXPR>.ast);
}
else { # XXX: remove this part once we throw an error
make Q::Statement::Constant.new($<identifier>.ast);
Expand Down
17 changes: 9 additions & 8 deletions lib/_007/Q.pm
Original file line number Diff line number Diff line change
Expand Up @@ -389,31 +389,32 @@ role Q::Statement does Q {

role Q::Statement::My does Q::Statement {
has $.ident;
has $.assignment;
method new($ident, $assignment = Empty) { self.bless(:$ident, :$assignment) }
has $.expr;
method new($ident, $expr = Empty) { self.bless(:$ident, :$expr) }

method run($runtime) {
return
unless $.assignment;
$.assignment.eval($runtime);
unless $.expr;
my $value = $.expr.eval($runtime);
$runtime.put-var($.ident.name, $value);
}
method interpolate($runtime) {
self.new($.ident.interpolate($runtime),
$.assignment === Empty ?? Empty !! $.assignment.interpolate($runtime));
$.expr === Empty ?? Empty !! $.expr.interpolate($runtime));
}
}

role Q::Statement::Constant does Q::Statement {
has $.ident;
has $.assignment;
method new($ident, $assignment = Empty) { self.bless(:$ident, :$assignment) }
has $.expr;
method new($ident, $expr = Empty) { self.bless(:$ident, :$expr) }

method run($runtime) {
# value has already been assigned
}
method interpolate($runtime) {
self.new($.ident.interpolate($runtime),
$.assignment === Empty ?? Empty !! $.assignment.interpolate($runtime)); # XXX: and here
$.expr === Empty ?? Empty !! $.expr.interpolate($runtime)); # XXX: and here
}
}

Expand Down
6 changes: 4 additions & 2 deletions lib/_007/Test.pm
Original file line number Diff line number Diff line change
Expand Up @@ -102,11 +102,13 @@ sub check($ast, $runtime) {
if %*assigned{$block ~ $symbol};
$runtime.declare-var($symbol);

if $my.assignment {
handle($my.assignment.rhs);
if $my.expr {
handle($my.expr);
}
}

# XXX: should handle Q::Statement::Constant, too

multi handle(Q::Statement::Block $block) {
$runtime.enter($block.block.eval($runtime));
handle($block.block.statements);
Expand Down
24 changes: 12 additions & 12 deletions t/features/blocks.t
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ use _007::Test;
{
my $ast = q:to/./;
(statements
(my (ident "x") (assign (ident "x") (str "one")))
(my (ident "x") (str "one"))
(stexpr (call (ident "say") (arguments (ident "x"))))
(stblock (block (parameters) (statements
(my (ident "x") (assign (ident "x") (str "two")))
(my (ident "x") (str "two"))
(stexpr (call (ident "say") (arguments (ident "x")))))))
(stexpr (call (ident "say") (arguments (ident "x")))))
.
Expand All @@ -29,8 +29,8 @@ use _007::Test;
{
my $ast = q:to/./;
(statements
(my (ident "b") (assign (ident "b") (block (parameters (ident "name")) (statements
(stexpr (call (ident "say") (arguments (~ (str "Good evening, Mr ") (ident "name")))))))))
(my (ident "b") (block (parameters (ident "name")) (statements
(stexpr (call (ident "say") (arguments (~ (str "Good evening, Mr ") (ident "name"))))))))
(stexpr (call (ident "b") (arguments (str "Bond")))))
.

Expand All @@ -40,9 +40,9 @@ use _007::Test;
{
my $ast = q:to/./;
(statements
(my (ident "b") (assign (ident "b") (block (parameters (ident "X") (ident "Y")) (statements
(stexpr (call (ident "say") (arguments (~ (ident "X") (ident "Y")))))))))
(my (ident "X") (assign (ident "X") (str "y")))
(my (ident "b") (block (parameters (ident "X") (ident "Y")) (statements
(stexpr (call (ident "say") (arguments (~ (ident "X") (ident "Y"))))))))
(my (ident "X") (str "y"))
(stexpr (call (ident "b") (arguments (str "X") (~ (ident "X") (ident "X"))))))
.

Expand All @@ -52,10 +52,10 @@ use _007::Test;
{
my $ast = q:to/./;
(statements
(my (ident "b") (assign (ident "b") (block (parameters (ident "callback")) (statements
(my (ident "b") (block (parameters (ident "callback")) (statements
(my (ident "scoping") (assign (ident "scoping") (str "dynamic")))
(stexpr (call (ident "callback") (arguments)))))))
(my (ident "scoping") (assign (ident "scoping") (str "lexical")))
(stexpr (call (ident "callback") (arguments))))))
(my (ident "scoping") (str "lexical"))
(stexpr (call (ident "b") (arguments (block (parameters) (statements
(stexpr (call (ident "say") (arguments (ident "scoping"))))))))))
.
Expand All @@ -66,10 +66,10 @@ use _007::Test;
{
my $ast = q:to/./;
(statements
(my (ident "b") (assign (ident "b") (block (parameters (ident "count")) (statements
(my (ident "b") (block (parameters (ident "count")) (statements
(if (ident "count") (block (parameters) (statements
(stexpr (call (ident "b") (arguments (+ (ident "count") (- (int 1))))))
(stexpr (call (ident "say") (arguments (ident "count")))))))))))
(stexpr (call (ident "say") (arguments (ident "count"))))))))))
(stexpr (call (ident "b") (arguments (int 4)))))
.

Expand Down
8 changes: 4 additions & 4 deletions t/features/builtins.t
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ use _007::Test;
(statements
(sub (ident "f") (parameters (ident "n")) (statements
(return (+ (ident "n") (int 1)))))
(my (ident "a") (assign (ident "a") (array (int 1) (int 2) (int 3))))
(my (ident "a") (array (int 1) (int 2) (int 3)))
(stexpr (call (ident "say") (arguments (call (ident "map") (arguments (ident "f") (ident "a"))))))
(stexpr (call (ident "say") (arguments (ident "a")))))
.
Expand All @@ -227,7 +227,7 @@ use _007::Test;
{
my $ast = q:to/./;
(statements
(my (ident "n") (assign (ident "n") (int 7)))
(my (ident "n") (int 7))
(stexpr (call (ident "say") (arguments (call (ident "type") (arguments (ident "n")))))))
.

Expand All @@ -237,7 +237,7 @@ use _007::Test;
{
my $ast = q:to/./;
(statements
(my (ident "s") (assign (ident "s") (str "Bond")))
(my (ident "s") (str "Bond"))
(stexpr (call (ident "say") (arguments (call (ident "type") (arguments (ident "s")))))))
.

Expand All @@ -247,7 +247,7 @@ use _007::Test;
{
my $ast = q:to/./;
(statements
(my (ident "a") (assign (ident "a") (array (int 1) (int 2))))
(my (ident "a") (array (int 1) (int 2)))
(stexpr (call (ident "say") (arguments (call (ident "type") (arguments (ident "a")))))))
.

Expand Down
2 changes: 1 addition & 1 deletion t/features/for-loop.t
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ use _007::Test;
my $ast = q:to/./;
(statements
(for (array (int 1) (int 2)) (block (parameters) (statements
(my (ident "r") (assign (ident "r") (int 3)))
(my (ident "r") (int 3))
(stexpr (call (ident "say") (arguments (ident "r"))))))))
.

Expand Down
26 changes: 13 additions & 13 deletions t/features/operators.t
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ use _007::Test;
{
my $ast = q:to/./;
(statements
(my (ident "ns") (assign (ident "ns") (array (str "Jim") (str "Bond"))))
(my (ident "ns") (array (str "Jim") (str "Bond")))
(stexpr (call (ident "say") (arguments (index (ident "ns") (int 1))))))
.

Expand All @@ -33,7 +33,7 @@ use _007::Test;
{
my $ast = q:to/./;
(statements
(my (ident "ns") (assign (ident "ns") (array (array (str "Auric") (str "Goldfinger")))))
(my (ident "ns") (array (array (str "Auric") (str "Goldfinger"))))
(stexpr (call (ident "say") (arguments (index (index (ident "ns") (int 0)) (int 1))))))
.

Expand All @@ -43,7 +43,7 @@ use _007::Test;
{
my $ast = q:to/./;
(statements
(my (ident "x") (assign (ident "x") (int 1)))
(my (ident "x") (int 1))
(stexpr (assign (ident "x") (int 2)))
(stexpr (call (ident "say") (arguments (ident "x")))))
.
Expand All @@ -54,12 +54,12 @@ use _007::Test;
{
my $ast = q:to/./;
(statements
(my (ident "i1") (assign (ident "i1") (int 10)))
(my (ident "i2") (assign (ident "i2") (int 11)))
(my (ident "s1") (assign (ident "s1") (str "10")))
(my (ident "s2") (assign (ident "s2") (str "11")))
(my (ident "a1") (assign (ident "a1") (array (int 1) (int 2) (int 3))))
(my (ident "a2") (assign (ident "a2") (array (int 1) (int 2) (str "3"))))
(my (ident "i1") (int 10))
(my (ident "i2") (int 11))
(my (ident "s1") (str "10"))
(my (ident "s2") (str "11"))
(my (ident "a1") (array (int 1) (int 2) (int 3)))
(my (ident "a2") (array (int 1) (int 2) (str "3")))
(stexpr (call (ident "say") (arguments (== (ident "i1") (ident "i1")))))
(stexpr (call (ident "say") (arguments (== (ident "i1") (ident "i2")))))
Expand Down Expand Up @@ -108,7 +108,7 @@ use _007::Test;
my $ast = q:to/./;
(statements
(sub (ident "empty") (parameters) (statements))
(my (ident "none") (assign (ident "none") (call (ident "empty") (arguments))))
(my (ident "none") (call (ident "empty") (arguments)))
(stexpr (call (ident "say") (arguments (== (ident "none") (ident "none")))))
(stexpr (call (ident "say") (arguments (== (ident "none") (int 0)))))
(stexpr (call (ident "say") (arguments (== (ident "none") (str "")))))
Expand All @@ -121,7 +121,7 @@ use _007::Test;
{
my $ast = q:to/./;
(statements
(my (ident "ns") (assign (ident "ns") (array (str "Jim") (str "Bond"))))
(my (ident "ns") (array (str "Jim") (str "Bond")))
(stexpr (call (ident "say") (arguments (index (ident "ns") (- (int 2)))))))
.

Expand All @@ -131,7 +131,7 @@ use _007::Test;
{
my $ast = q:to/./;
(statements
(my (ident "ns") (assign (ident "ns") (array (str "Jim") (str "Bond"))))
(my (ident "ns") (array (str "Jim") (str "Bond")))
(stexpr (call (ident "say") (arguments (index (ident "ns") (int 19))))))
.

Expand Down Expand Up @@ -159,7 +159,7 @@ use _007::Test;
{
my $ast = q:to/./;
(statements
(my (ident "ns") (assign (ident "ns") (str "Jim")))
(my (ident "ns") (str "Jim"))
(stexpr (call (ident "say") (arguments (index (ident "ns") (int 0))))))
.

Expand Down
10 changes: 5 additions & 5 deletions t/features/return.t
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ use _007::Test;
my $ast = q:to/./;
(statements
(sub (ident "f") (parameters) (statements
(my (ident "b") (assign (ident "b") (block (parameters) (statements
(return (int 5))))))
(my (ident "b") (block (parameters) (statements
(return (int 5)))))
(sub (ident "g") (parameters) (statements
(stexpr (call (ident "b") (arguments)))))
(stexpr (call (ident "g") (arguments)))
Expand All @@ -67,10 +67,10 @@ use _007::Test;
my $ast = q:to/./;
(statements
(sub (ident "f") (parameters) (statements
(my (ident "b") (assign (ident "b") (block (parameters) (statements
(return (int 5))))))
(my (ident "b") (block (parameters) (statements
(return (int 5)))))
(return (ident "b"))))
(my (ident "c") (assign (ident "c") (call (ident "f") (arguments))))
(my (ident "c") (call (ident "f") (arguments)))
(stexpr (call (ident "c") (arguments))))
.

Expand Down
12 changes: 6 additions & 6 deletions t/features/subs.t
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ use _007::Test;
{
my $ast = q:to/./;
(statements
(my (ident "x") (assign (ident "x") (str "one")))
(my (ident "x") (str "one"))
(stexpr (call (ident "say") (arguments (ident "x"))))
(sub (ident "f") (parameters) (statements
(my (ident "x") (assign (ident "x") (str "two")))
(my (ident "x") (str "two"))
(stexpr (call (ident "say") (arguments (ident "x"))))))
(stexpr (call (ident "f") (arguments)))
(stexpr (call (ident "say") (arguments (ident "x")))))
Expand All @@ -43,7 +43,7 @@ use _007::Test;
(statements
(sub (ident "f") (parameters (ident "X") (ident "Y")) (statements
(stexpr (call (ident "say") (arguments (~ (ident "X") (ident "Y")))))))
(my (ident "X") (assign (ident "X") (str "y")))
(my (ident "X") (str "y"))
(stexpr (call (ident "f") (arguments (str "X") (~ (ident "X") (ident "X"))))))
.

Expand All @@ -54,9 +54,9 @@ use _007::Test;
my $ast = q:to/./;
(statements
(sub (ident "f") (parameters (ident "callback")) (statements
(my (ident "scoping") (assign (ident "scoping") (str "dynamic")))
(my (ident "scoping") (str "dynamic"))
(stexpr (call (ident "callback") (arguments)))))
(my (ident "scoping") (assign (ident "scoping") (str "lexical")))
(my (ident "scoping") (str "lexical"))
(stexpr (call (ident "f") (arguments (block (parameters) (statements
(stexpr (call (ident "say") (arguments (ident "scoping"))))))))))
.
Expand All @@ -79,7 +79,7 @@ use _007::Test;
my $ast = q:to/./;
(statements
(stexpr (call (ident "f") (arguments)))
(my (ident "x") (assign (ident "x") (str "X")))
(my (ident "x") (str "X"))
(sub (ident "f") (parameters) (statements
(stexpr (call (ident "say") (arguments (ident "x")))))))
.
Expand Down

0 comments on commit 2ba07ad

Please sign in to comment.