0.43.0 • Published 5 years ago

rakudo v0.43.0

Weekly downloads
2
License
-
Repository
-
Last release
5 years ago

Dependencies

Install node 10.16.0 or 12.11.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

To use node.js modules you need to specify where they should be looked for. use lib 'nodejs#/your/path/to/node/modules' is a good way to do that

use lib 'nodejs#' ~ $*PROGRAM.parent.add('node_modules').absolute;
use chalk:from<node.js>;
say("Hello {chalk.blue("Blue")} World");

Keep in mind that if you load a node.js module during precompilation it gets reloaded at runtime, so it's internal state gets lost.

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

JavaScriptPerl6
trueTrue
falseFalse
StringStr
nullMu
undefinedMu
BigIntInt
NumberNum

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)`

0.43.0

5 years ago

0.42.0

5 years ago

0.41.0

5 years ago

0.40.0

5 years ago

0.39.0

5 years ago

0.38.0

5 years ago

0.37.0

5 years ago

0.36.0

5 years ago

0.35.0

5 years ago

0.34.0

5 years ago

0.33.0

5 years ago

0.30.0

5 years ago

0.29.0

5 years ago

0.28.0

5 years ago

0.27.0

5 years ago

0.26.0

5 years ago

0.25.0

5 years ago

0.24.0

5 years ago

0.23.0

5 years ago

0.22.0

5 years ago

0.21.0

5 years ago

0.19.0

6 years ago

0.18.0

6 years ago

0.17.0

6 years ago

0.16.0

6 years ago

0.15.0

6 years ago

0.14.0

6 years ago

0.13.0

6 years ago

0.12.0

6 years ago

0.11.0

6 years ago

0.10.0

6 years ago

0.9.0

6 years ago