Skip to content

Instantly share code, notes, and snippets.

@pmurias
Created October 2, 2019 10:35
Show Gist options
  • Save pmurias/b37a7b924cc9a0105a518af6b55a757b to your computer and use it in GitHub Desktop.
Save pmurias/b37a7b924cc9a0105a518af6b55a757b to your computer and use it in GitHub Desktop.

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

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

cd tutorial-project
npm install --save chalk

Interoperability with JS

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

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

    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