🔬36. Rakudo 2018.01

A new release of Rakudo was just announced. Most of the changes increase Perl 6 performance this time. Let us briefly look at some of them. I am happy to tell that my blog initiated at least two of the changes. Removed UInt64 (not to be confused with uint64) [cf154355] We’ve seen this class in the … Continue reading “🔬36. Rakudo 2018.01”

🔬35. Statement in the Grammar of Perl 6

At the beginning of the year, we began reading Perl 6’s Grammar. That exercise is very interesting but not that easy. Today, let us take one more step and look at the statement. The statement token is relatively compact. It is reproduced here with some simplifications (refer to src/Perl6/Grammar.nqp for the full code): token statement($*LABEL = … Continue reading “🔬35. Statement in the Grammar of Perl 6”

🔬34. Delimiters of embedded comments in Perl 6

In Perl 6, you can leave a comment inside the line of code using the #`(…) syntax: my Int #`(Integer variable) $i = #`(initialising the variable) 42; say #`( Printing it ) $i; This program is equivalent to the following: my Int $i = 42; say $i; The body of the embedded comment is located … Continue reading “🔬34. Delimiters of embedded comments in Perl 6”

🔬33. The cmp infix in Perl 6

In Perl 6, there is an infix operator called cmp. Despite its simple name and some connotations with its counter partner in Perl 5, its semantic is not trivial. From the documentation, we read: Generic, “smart” three-way comparator. Compares strings with string semantics, numbers with number semantics, Pair objects first by key and then by value … Continue reading “🔬33. The cmp infix in Perl 6”

💡32. It’s time for optimism

Today, we will not talk about the internals of Rakudo, NQP, or MoarVM; let me pause for a bit and talk about some random things related to Perl 6 and its future. Efficiency If you follow my blog, I have an update to the post about optimising MoarVM, and it appears that when making calculations … Continue reading “💡32. It’s time for optimism”

🔬31. The opcode dispatching loop in MoarVM

Let me make some correction work following the previous post. I felt that something escaped from my view because changing the code did not bring any advances in speed. Jonathan Worthington left a brilliant comment saying that I was trying to optimise the JIT compiler. Bang! Indeed, I thought that JIT should have had some … Continue reading “🔬31. The opcode dispatching loop in MoarVM”

🔬30. How I was optimising MoarVM

A Friday story for your pleasure. An attentive reader could notice yesterday that MoarVM is using many switch/case choices when it processes the bytecode. In src/jit/graph.c, there is code which returns the address of the function corresponding to the given opcode: static void * op_to_func(MVMThreadContext *tc, MVMint16 opcode) { switch(opcode) { case MVM_OP_checkarity: return MVM_args_checkarity; … Continue reading “🔬30. How I was optimising MoarVM”

🔬29. Exploring the Int type in Perl 6, part 2

Today, the journey to the internals of Int continues and first let’s make a deep dive into one on of the fascinating methods, is-prime. If you never used it, this is a great method that implements the logic, which is usually not built-in in a programming language. It is also great because primality is an … Continue reading “🔬29. Exploring the Int type in Perl 6, part 2”

🔬28. Exploring the Int type in Perl 6, part 1

Actually, we already started looking at the internals of the Int data type two days ago, but today we’ll start from the very beginning. So, the Int data type. It is a great data type for practical programming and it is also widely used in Rakudo itself. For example, the Rational object is an object … Continue reading “🔬28. Exploring the Int type in Perl 6, part 1”

🔬27. Obsolete syntax error messages in Perl 6, part 4

So far, we covered a lot of different error messages that Rakudo Perl 6 generates when you accidentally use the Perl 5 syntax. This is a really nice feature for easy migration to the new language. Let us continue and cover another couple of errors. new X It was one of the hottest topics in … Continue reading “🔬27. Obsolete syntax error messages in Perl 6, part 4”

🔬26. Native integers and UInt in Perl 6

As soon as we touched some native integers yesterday, let us look a bit closer at them. The topic is deep, so we limit ourselves with a brief understanding of interconnections between the different integer data types in Perl 6. UInt and UInt64 The simplest is UInt. This data type is defined in src/core/Int.pm and … Continue reading “🔬26. Native integers and UInt in Perl 6”

🔬25. The Range method

Today, I started looking into the internals of the Int class (src/core/Int.pm) and faced a strangely looking method, Range. The Range method returns an object of the Range type showing the minimum and the maximum values that the object can hold. For example, this is how the method is defined for the Num class: method … Continue reading “🔬25. The Range method”

🔬24. Obsolete syntax error messages in Perl 6, part 3

A couple of weeks ago, we looked at some error messages that Perl 6 generates when it sees the Perl 5 constructions. Let us continue and go through another portion of the messages that are there in today’s Rakudo. \x[] We start with a simple error message that informs you to use new syntax when … Continue reading “🔬24. Obsolete syntax error messages in Perl 6, part 3”

🔬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”