🔬23. The internals of the ternary operator in Perl 6

Yesterday, we saw that the ternary operator is treated as an infix in the Perl 6 Grammar. The code between the two parts of the operator is caught by the <EXPR> method: token infix:sym<?? !!> { :my $*GOAL := ‘!!’; $<sym>=’??’ <.ws> <EXPR(‘i=’)> [ ‘!!’ . . . ] <O(|%conditional, :reducecheck<ternary>, :pasttype<if>)> } Now, our attraction … Continue reading “🔬23. The internals of the ternary operator in Perl 6”

🔬22. The infix nature of the ternary operator in Perl 6

The ternary operator ?? !! takes three operands, obviously. Although, it is said in the documentation that the operator is an infix. Let us figure out why. Here is the fragment from the Grammar that handles the ternary operator: token infix:sym<?? !!> { :my $*GOAL := ‘!!’; $<sym>=’??’ <.ws> <EXPR(‘i=’)> [ ‘!!’ || <?before ‘::’ <.-[=]>> … Continue reading “🔬22. The infix nature of the ternary operator in Perl 6”

🔬21. The tolerance operator in Perl 6

In Perl 6, there is a so-called approximately-equal operator =~=. It compares two numbers approximately. If both values are non-zero, the operator calculates their relative difference; the tolerance is defined by the $*TOLERANCE variable, which equals to 1E-15 by default. So, for two numbers $a and $b, the result (in pseudo-code) is: |$a – $b| … Continue reading “🔬21. The tolerance operator in Perl 6”

🔬20. What does nqp::getattr do in Perl 6?

In the previous posts, we saw many examples of calling NQP functions from the Perl 6 modules. One of the frequent calls was nqp::getattr. Let us see what that function does. Here are a couple of recent examples: nqp::isge_i($pos,0) && nqp::isconcrete(nqp::getattr(self,List,’$!reified’)) . . . nqp::if( nqp::iseq_i( nqp::getattr( nqp::getattr($self,Code,’$!signature’), Signature, ‘$!count’ ),1) When you first look at … Continue reading “🔬20. What does nqp::getattr do in Perl 6?”

🔬19. Digging into @a[*-1] in Perl 6

After a big work that we had yesterday to understand what’s going on when you try to subscript an array with a negative index, let’s see what actually happens behind the new syntax of getting the last element of an array as @a[*-1]. So, here’s a test program: my @a = <a b c>; say … Continue reading “🔬19. Digging into @a[*-1] in Perl 6”

🔬18. Implementing negative array subscripts in Perl 6

A few days ago, we saw how Perl 6 checks the syntax if you are trying to index an array with negative indices. Since then, I was thinking about implementing the support of @a[-1]. It was not that easy, that’s why I did not demonstrate this last time 🙂 Before going further, a small disclaimer. … Continue reading “🔬18. Implementing negative array subscripts in Perl 6”

🦋17. Parameterised roles in Perl 6

Today, a small excursus into the syntax. Did you know that roles in Perl 6 can have a parameter that makes them similar to generic templates in, say, C++? Here’s a small example: role R { has $.value; method add($b) { $.value + $b.value } method div($b) { $.value / $b.value } } The R … Continue reading “🦋17. Parameterised roles in Perl 6”

🔬16. Unifying the implementation of ‘say’ in Perl 6

For the last two days, the topic of this blog was the internals of the say routine in Rakudo Perl 6. (By the way, the term routine is a good choice if you need to talk about both subs and methods.) In src/core/io_operators.pm, other routines are also defined. The main focus of today is on the … Continue reading “🔬16. Unifying the implementation of ‘say’ in Perl 6”

🔬15. Variants of ‘say’ in Perl 6

Yesterday, we saw four different variants of the multi sub called say. Today, let’s look at them more precisely. The functions are located in the src/core/io_operators.pm file. Start with the first and the simplest one: multi sub say() { $*OUT.print-nl } It just prints the newline to the $*OUT stream. Probably, it would be wise … Continue reading “🔬15. Variants of ‘say’ in Perl 6”

🔬14. Tracking down the ‘say’ calls in Perl 6

Welcome back! Today, we’ll try to do a simple thing using some knowledge from the previous days. Compare the two lines: say ‘Hello, World’; ‘Hello, World’.say; Is there any difference between them? Well, of course. Although the result is the same in both cases, syntactically they differ a lot. In the first case, say is … Continue reading “🔬14. Tracking down the ‘say’ calls in Perl 6”

🔬13. Let 1 + 2 * 3 = 9

Is it easy to break the behaviour of Perl 6? Well, the answer probably depends on what exactly you want to break. Playing with operator precedence, I wanted to change the rules of arithmetical operators + and * so that they are executed in different order, namely, multiplication first, addition second. Sounds like an easy … Continue reading “🔬13. Let 1 + 2 * 3 = 9”

🔬12. The beginning of the Grammar of Perl 6

Yesterday, we talked about the stages of the compiling process of a Perl 6 program and saw the parse tree of a simple ‘Hello, World!’ program. Today, our journey begins at the starting point of the Grammar. So, here is the program: say ‘Hello, World!’ The grammar of Perl 6 is written in Not Quite Perl … Continue reading “🔬12. The beginning of the Grammar of Perl 6”

🦋11. Compiler stages and targets in Perl 6

Welcome to the new year! Today, let us switch for a while from the discussion about obsolete messages to something different. Stages If you followed the exercises in the previous posts, you might have noticed that some statistics was printed in the console when compiling Rakudo: Stage start : 0.000 Stage parse : 44.914 Stage syntaxcheck: … Continue reading “🦋11. Compiler stages and targets in Perl 6”

🔬10. Obsolete syntax error messages, part 2

Today, we continue exploring the error messages that Rakudo developers embedded to detect old Perl 5 constructions in the Perl 6 code. The obs method But first, let’s make a small experiment and add a call to the obs method in the rule parsing the for keyword. rule statement_control:sym<for> { <sym><.kok> {} [ <?before ‘my’? … Continue reading “🔬10. Obsolete syntax error messages, part 2”

🔬9. Obsolete syntax error messages in Perl 6, part 1

Yesterday, we saw an error message about the improper syntax of the ternary operator. Let’s look at other similar things that the Rakudo designers has implemented for us to make the transition from Perl 5 smoother. First of all, the Perl 6 grammar file (src/Perl6/Grammar.nqp) contains four different methods for reacting to obsolete syntax: method … Continue reading “🔬9. Obsolete syntax error messages in Perl 6, part 1”

🔬8. Digging into operator precedence in Perl 6, part 2

Yesterday, we took a look at how the ? and so operators are dispatched depending on the type of the variable. We did it with the intention to understand what is the difference between them. Here is once again an excerpt from the src/core/Bool.pm file, where the bodies of the subs look alike: proto sub … Continue reading “🔬8. Digging into operator precedence in Perl 6, part 2”

🔬7. Digging into operator precedence in Perl 6, part 1

Today, we’ll once again look at the src/core/Bool.pm file. This is a good example of a full-fledged Perl 6 class, which is still not very difficult to examine. Look at the definitions of the ? and so operators: proto sub prefix:<?>(Mu $) is pure {*} multi sub prefix:<?>(Bool:D \a) { a } multi sub prefix:<?>(Bool:U … Continue reading “🔬7. Digging into operator precedence in Perl 6, part 1”

🔬6. The dd routine of Rakudo Perl 6

In Rakudo, there is a useful routine dd, which is not a part of Perl 6 itself. It dumps its argument(s) in a way that you immediately see the type and content of a variable. For example: $ ./perl6 -e’my Bool $b = True; dd($b)’ Bool $b = Bool::True It works well with data of … Continue reading “🔬6. The dd routine of Rakudo Perl 6”

🔬5. Lurking behind interpolation in Perl 6

In the previous articles, we’ve seen that the undefined value cannot be easily interpolated in a string, as an exception occurs. Today, our goal is to see where exactly that happens in the source code of Rakudo. So, as soon as we’ve looked at the Boolean values, let’s continue with them. Open perl6 in the … Continue reading “🔬5. Lurking behind interpolation in Perl 6”

🔬4. Exploring the Bool type in Perl 6, part 2

Today, we are continuing reading the source codes of the Bool class: src/core/Bool.pm, and will look at the methods that calculate the next or the previous values, or increment and decrement the values. For the Boolean type, it sounds simple, but you still have to determine the behaviour of the edge cases. pred and succ … Continue reading “🔬4. Exploring the Bool type in Perl 6, part 2”