Install node 10.16.0 or 12.3.1 from https://nodejs.org
The easiest way is to install the rakudo package from npm
mkdir tutorial-project # Create a fresh project directory
cd tutorial-project
npm init
npm install --save rakudo
./node_modules/.bin/perl6-js -e 'say "Hello World"'
cd tutorial-project
npm install --save chalk
Passing :lang to eval will execute the passed code as JavaScript.
my $document = EVAL(:lang, 'return document')
You can access attributes of those objects using postcircumfix:<{ }> (you should often use the <> shorcut) You can call methods on the the objects using regular Perl 6 syntax.
$document<body>.appendChild($document.createTextNode('Hello World'));
Primitive JS data types are converted rather then wrapped
JavaScript | Perl6 |
---|---|
true | True |
false | False |
String | Str |
null | Mu |
undefined | Mu |
BigInt | Int |
Number | Num |
------------- | ------- |
A Perl 6 Mu when passed to JS land ends up as null
To pass values to Perl 6 land the executed code needs a return.
EVAL(:lang<JavaScript>, '123') # This returns Mu
EVAL(:lang<JavaScript>, 'return 123') # This returns 123
In order to enable using wrapped objects in Perl 6 land wrapped objects offer some methods that Perl 6 expects.
-
sink Does nothing.
-
defined Always returns True
-
Bool Always returns True
-
item Returns the object it is called on
-
new Uses the JavaScript new operator to create an new instance
my $Date = EVAL(:lang<JavaScript>, 'return Date'); my $instance = $Date.new('December 17, 1995 03:24:00'); say($instance.getFullYear()); # 1995
If the wrapped object has method of that same name you can use an :INTERNAL modifier to access it.
$obj.new(:INTERNAL, 123)
This will call a js new method rather then doing ``new $obj(123)```