Created
October 2, 2019 10:34
-
-
Save pmurias/0d0055ecf4f8ddfa10b5edf76b91268b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Dependencies | |
Install node 10.16.0 or 12.3.1 from https://nodejs.org | |
# Getting started with node.js rakudo.js | |
The easiest way is to install the rakudo package from npm | |
```bash | |
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"' | |
``` | |
# Using a node.js module | |
```bash | |
cd tutorial-project | |
npm install --save chalk | |
``` | |
# Interoperability with JS | |
Passing :lang<JavaScript> to eval will execute the passed code as JavaScript. | |
my $document = EVAL(:lang<JavaScript>, '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. | |
```perl6 | |
$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. | |
```perl6 | |
EVAL(:lang<JavaScript>, '123') # This returns Mu | |
EVAL(:lang<JavaScript>, 'return 123') # This returns 123 | |
``` | |
# Extra methods on wrapped JS objects | |
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 | |
```perl6 | |
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)``` |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment