diff --git a/examples/format.007 b/examples/format.007 index 4d1d3c52..4e0418ac 100644 --- a/examples/format.007 +++ b/examples/format.007 @@ -30,10 +30,11 @@ macro format(fmt, args) { input.suffix(openBracePos + closeBracePos + 1))); } - if fmt ~~ Q::Literal::Str { + if fmt ~~ Q::Literal::Str && args ~~ Q::Term::Array { my highestUsedIndex = findHighestIndex(fmt.value); - if args ~~ Q::Term::Array && args.elements.elems() <= highestUsedIndex { - args.elements[highestUsedIndex]; + my argCount = args.elements.elems(); + if argCount <= highestUsedIndex { + die "Highest index was " ~ str(highestUsedIndex) ~ " but got only " ~ str(argCount) ~ " arguments."; } } diff --git a/lib/_007/Parser/Actions.pm b/lib/_007/Parser/Actions.pm index 5e6d09f4..98b3059a 100644 --- a/lib/_007/Parser/Actions.pm +++ b/lib/_007/Parser/Actions.pm @@ -148,6 +148,10 @@ class _007::Parser::Actions { make Q::Statement::Return.new(:expr($ ?? $.ast !! Val::None.new)); } + method statement:die ($/) { + make Q::Statement::Die.new(:expr($ ?? $.ast !! Val::None.new)); + } + method statement:if ($/) { my %parameters = $.ast; %parameters = $ :exists diff --git a/lib/_007/Parser/Syntax.pm b/lib/_007/Parser/Syntax.pm index f30ed3ce..0d2c903e 100644 --- a/lib/_007/Parser/Syntax.pm +++ b/lib/_007/Parser/Syntax.pm @@ -89,6 +89,9 @@ grammar _007::Parser::Syntax { unless $*insub; } } + token statement:die { + die [<.ws> ]? + } token statement:if { if <.ws> [ <.ws> else <.ws> diff --git a/lib/_007/Q.pm b/lib/_007/Q.pm index dc14d9fa..38155fb0 100644 --- a/lib/_007/Q.pm +++ b/lib/_007/Q.pm @@ -649,6 +649,18 @@ class Q::Statement::Return does Q::Statement { } } +class Q::Statement::Die does Q::Statement { + has $.expr = Val::None.new; + + method run($runtime) { + my $value = $.expr ~~ Val::None ?? Val::Str.new(:value("Died")) !! $.expr.eval($runtime); + die X::TypeCheck.new(:got($value), :excpected(Val::Str)) + if $value !~~ Val::Str; + + die $value.value; + } +} + class Q::Statement::Sub does Q::Statement does Q::Declaration { has $.identifier; has $.traitlist = Q::TraitList.new;