class Mu

The root of the Raku type hierarchy.
class Mu { }

The root of the Raku type hierarchy. For the origin of the name, see Mu (negative) on Wikipedia. One can also say that there are many undefined values in Raku, and Mu is the most undefined value.

Note that most classes do not derive from Mu directly, but rather from Any.

Methods

method iterator

method iterator(--> Iterator)

Coerces the invocant to a list by applying its .list method and uses iterator on it.

my $it = Mu.iterator;
    say $it.pull-one; # OUTPUT: Ā«(Mu)ā¤Ā»
    say $it.pull-one; # OUTPUT: Ā«IterationEndā¤Ā»

method defined

multi method defined(   --> Bool:D)

Returns False on a type object, and True otherwise.

say Int.defined;                # OUTPUT: Ā«Falseā¤Ā»
    say 42.defined;                 # OUTPUT: Ā«Trueā¤Ā»

A few types (like Failure) override defined to return False even for instances:

sub fails() { fail 'oh noe' };
    say fails().defined;            # OUTPUT: Ā«Falseā¤Ā»

routine defined

multi defined(Mu --> Bool:D)

invokes the .defined method on the object and returns its result.

routine isa

multi method isa(Mu $type     --> Bool:D)
    multi method isa(Str:D $type  --> Bool:D)

Returns True if the invocant is an instance of class $type, a subset type or a derived class (through inheritance) of $type. does is similar, but includes roles.

my $i = 17;
    say $i.isa("Int");   # OUTPUT: Ā«Trueā¤Ā»
    say $i.isa(Any);     # OUTPUT: Ā«Trueā¤Ā»
    role Truish {};
    my $but-true = 0 but Truish;
    say $but-true.^name;        # OUTPUT: Ā«Int+{Truish}ā¤Ā»
    say $but-true.does(Truish); # OUTPUT: Ā«Trueā¤Ā»
    say $but-true.isa(Truish);  # OUTPUT: Ā«Falseā¤Ā»

routine does

method does(Mu $type --> Bool:D)

Returns True if and only if the invocant conforms to type $type.

my $d = Date.new('2016-06-03');
say $d.does(Dateish);             # OUTPUT: Ā«Trueā¤Ā»    (Date does role Dateish)
say $d.does(Any);                 # OUTPUT: Ā«Trueā¤Ā»    (Date is a subclass of Any)
say $d.does(DateTime);            # OUTPUT: Ā«Falseā¤Ā»   (Date is not a subclass of DateTime)

Unlike isa, which returns True only for superclasses, does includes both superclasses and roles.

say $d.isa(Dateish); # OUTPUT: Ā«Falseā¤Ā»

Using the smartmatch operator ~~ is a more idiomatic alternative.

my $d = Date.new('2016-06-03');
    say $d ~~ Dateish;                # OUTPUT: Ā«Trueā¤Ā»
    say $d ~~ Any;                    # OUTPUT: Ā«Trueā¤Ā»
    say $d ~~ DateTime;               # OUTPUT: Ā«Falseā¤Ā»

routine Bool

multi        Bool(Mu --> Bool:D)
    multi method Bool(   --> Bool:D)

Returns False on the type object, and True otherwise.

Many built-in types override this to be False for empty collections, the empty string or numerical zeros

say Mu.Bool;                    # OUTPUT: Ā«Falseā¤Ā»
    say Mu.new.Bool;                # OUTPUT: Ā«Trueā¤Ā»
    say [1, 2, 3].Bool;             # OUTPUT: Ā«Trueā¤Ā»
    say [].Bool;                    # OUTPUT: Ā«Falseā¤Ā»
    say %( hash => 'full' ).Bool;   # OUTPUT: Ā«Trueā¤Ā»
    say {}.Bool;                    # OUTPUT: Ā«Falseā¤Ā»
    say "".Bool;                    # OUTPUT: Ā«Falseā¤Ā»
    say 0.Bool;                     # OUTPUT: Ā«Falseā¤Ā»
    say 1.Bool;                     # OUTPUT: Ā«Trueā¤Ā»
    say "0".Bool;                   # OUTPUT: Ā«Trueā¤Ā»

method Capture

method Capture(Mu:D: --> Capture:D)

Returns a Capture with named arguments corresponding to invocant's public attributes:

class Foo {
        has $.foo = 42;
        has $.bar = 70;
        method bar { 'something else' }
    }.new.Capture.say; # OUTPUT: Ā«\(:bar("something else"), :foo(42))ā¤Ā»

method Str

multi method Str(--> Str)

Returns a string representation of the invocant, intended to be machine readable. Method Str warns on type objects, and produces the empty string.

say Mu.Str;   # Use of uninitialized value of type Mu in string context.
    my @foo = [2,3,1];
    say @foo.Str  # OUTPUT: Ā«2 3 1ā¤Ā»

routine gist

multi        gist(+args --> Str)
    multi method gist(   --> Str)

Returns a string representation of the invocant, optimized for fast recognition by humans. As such lists will be truncated at 100 elements. Use .raku to get all elements.

The default gist method in Mu re-dispatches to the raku method for defined invocants, and returns the type name in parenthesis for type object invocants. Many built-in classes override the case of instances to something more specific that may truncate output.

gist is the method that say calls implicitly, so say $something and say $something.gist generally produce the same output.

say Mu.gist;        # OUTPUT: Ā«(Mu)ā¤Ā»
    say Mu.new.gist;    # OUTPUT: Ā«Mu.newā¤Ā»

method perl

multi method perl(Mu:)

Calls .raku on the invocant. Since the change of the language name to Raku, this method is deprecated and might disappear in the near future. Use .raku instead.

method raku

multi method raku(Mu:U:)
    multi method raku(Mu:D:)

For type objects, returns its name if .raku has not been redefined from Mu, or calls .raku on the name of the type object otherwise.

say Str.raku;          # OUTPUT: Ā«Strā¤Ā»

For plain objects, it will conventionally return a representation of the object that can be used via EVAL to reconstruct the value of the object.

say (1..3).Set.raku;  # OUTPUT: Ā«Set.new(1,2,3)ā¤Ā»

method item

method item(Mu \item:) is raw

Forces the invocant to be evaluated in item context and returns the value of it.

say [1,2,3].item.raku;          # OUTPUT: Ā«$[1, 2, 3]ā¤Ā»
    say %( apple => 10 ).item.raku; # OUTPUT: Ā«${:apple(10)}ā¤Ā»
    say "abc".item.raku;            # OUTPUT: Ā«"abc"ā¤Ā»

method self

method self(--> Mu)

Returns the object it is called on.

method clone

multi method clone(Mu:U: *%twiddles)
    multi method clone(Mu:D: *%twiddles)

This method will clone type objects, or die if it's invoked with any argument.

say Num.clone( :yes )
# OUTPUT: Ā«(exit code 1) Cannot set attribute values when cloning a type objectā¤  in block <unit>ā¤ā¤Ā»

If invoked with value objects, it creates a shallow clone of the invocant, including shallow cloning of private attributes. Alternative values for public attributes can be provided via named arguments with names matching the attributes' names.

class Point2D {
    has ($.x, $.y);
    multi method gist(Point2D:D:) {
        "Point($.x, $.y)";
    }
}

my $p = Point2D.new(x => 2, y => 3);

say $p;                     # OUTPUT: Ā«Point(2, 3)ā¤Ā»
say $p.clone(y => -5);      # OUTPUT: Ā«Point(2, -5)ā¤Ā»

Note that .clone does not go the extra mile to shallow-copy @. and %. sigiled attributes and, if modified, the modifications will still be available in the original object:

class Foo {
    has $.foo is rw = 42;
    has &.boo is rw = { say "Hi" };
    has @.bar       = <a b>;
    has %.baz       = <a b c d>;
}

my $o1 = Foo.new;
with my $o2 = $o1.clone {
    .foo = 70;
    .bar = <Z Y>;
    .baz = <Z Y X W>;
    .boo = { say "Bye" };
}

# Hash and Array attribute modifications in clone appear in original as well:
say $o1;
# OUTPUT: Ā«Foo.new(foo => 42, bar => ["Z", "Y"], baz => {:X("W"), :Z("Y")}, ā€¦ā¤Ā»
say $o2;
# OUTPUT: Ā«Foo.new(foo => 70, bar => ["Z", "Y"], baz => {:X("W"), :Z("Y")}, ā€¦ā¤Ā»
$o1.boo.(); # OUTPUT: Ā«Hiā¤Ā»
$o2.boo.(); # OUTPUT: Ā«Byeā¤Ā»

To clone those, you could implement your own .clone that clones the appropriate attributes and passes the new values to Mu.clone, for example, via nextwith.

class Bar {
    has $.quux;
    has @.foo = <a b>;
    has %.bar = <a b c d>;
    method clone { nextwith :foo(@!foo.clone), :bar(%!bar.clone), |%_  }
}

my $o1 = Bar.new( :42quux );
with my $o2 = $o1.clone {
    .foo = <Z Y>;
    .bar = <Z Y X W>;
}

# Hash and Array attribute modifications in clone do not affect original:
say $o1;
# OUTPUT: Ā«Bar.new(quux => 42, foo => ["a", "b"], bar => {:a("b"), :c("d")})ā¤Ā»
say $o2;
# OUTPUT: Ā«Bar.new(quux => 42, foo => ["Z", "Y"], bar => {:X("W"), :Z("Y")})ā¤Ā»

The |%_ is needed to slurp the rest of the attributes that would have been copied via shallow copy.

method new

multi method new(*%attrinit)

Default method for constructing (create + initialize) new objects of a class. This method expects only named arguments which are then used to initialize attributes with accessors of the same name.

Classes may provide their own new method to override this default.

new triggers an object construction mechanism that calls submethods named BUILD in each class of an inheritance hierarchy, if they exist. See the documentation on object construction for more information.

method bless

method bless(*%attrinit --> Mu:D)

Low-level object construction method, usually called from within new, implicitly from the default constructor, or explicitly if you create your own constructor. bless creates a new object of the same type as the invocant, using the named arguments to initialize attributes and returns the created object.

It is usually invoked within custom new method implementations:

class Point {
    has $.x;
    has $.y;
    multi method new($x, $y) {
        self.bless(:$x, :$y);
    }
}
my $p = Point.new(-1, 1);

In this example we are declaring this new method to avoid the extra syntax of using pairs when creating the object. self.bless returns the object, which is in turn returned by new. new is declared as a multi method so that we can still use the default constructor like this: Point.new( x => 3, y => 8 ).

For more details see the documentation on object construction.

method CREATE

method CREATE(--> Mu:D)

Allocates a new object of the same type as the invocant, without initializing any attributes.

say Mu.CREATE.defined;  # OUTPUT: Ā«Trueā¤Ā»

method print

multi method print(--> Bool:D)

Prints value to $*OUT after stringification using .Str method without adding a newline at end.

"abc\n".print;          # OUTPUT: Ā«abcā¤Ā»

method put

multi method put(--> Bool:D)

Prints value to $*OUT, adding a newline at end, and if necessary, stringifying non-Str object using the .Str method.

"abc".put;              # OUTPUT: Ā«abcā¤Ā»

method say

multi method say()

Will say to standard output.

say 42;                 # OUTPUT: Ā«42ā¤Ā»

What say actually does is, thus, deferred to the actual subclass. In most cases it calls .gist on the object, returning a compact string representation.

In non-sink context, say will always return True.

say (1,[1,2],"foo",Mu).map: so *.say ;
    # OUTPUT: Ā«1ā¤[1 2]ā¤fooā¤(Mu)ā¤(True True True True)ā¤Ā»

However, this behavior is just conventional and you shouldn't trust it for your code. It's useful, however, to explain certain behaviors.

say is first printing out in *.say, but the outermost say is printing the True values returned by the so operation.

method ACCEPTS

multi method ACCEPTS(Mu:U: $other)

ACCEPTS is the method that smartmatching with the infix ~~ operator and given/when invokes on the right-hand side (the matcher).

The Mu:U multi performs a type check. Returns True if $other conforms to the invocant (which is always a type object or failure).

say 42 ~~ Mu;           # OUTPUT: Ā«Trueā¤Ā»
    say 42 ~~ Int;          # OUTPUT: Ā«Trueā¤Ā»
    say 42 ~~ Str;          # OUTPUT: Ā«Falseā¤Ā»

Note that there is no multi for defined invocants; this is to allow autothreading of junctions, which happens as a fallback mechanism when no direct candidate is available to dispatch to.

method WHICH

multi method WHICH(--> ObjAt:D)

Returns an object of type ObjAt which uniquely identifies the object. Value types override this method which makes sure that two equivalent objects return the same return value from WHICH.

say 42.WHICH eq 42.WHICH;       # OUTPUT: Ā«Trueā¤Ā»

method WHERE

method WHERE(Mu:)

Returns an Int representing the memory address of the object. Please note that in the Rakudo implementation of Raku, and possibly other implementations, the memory location of an object is NOT fixed for the lifetime of the object. So it has limited use for applications, and is intended as a debugging tool only.

method WHY

multi method WHY(Mu: --> Pod::Block::Declarator)

Returns the attached Pod::Block::Declarator.

For instance:

#| Initiate a specified spell normally
sub cast(Spell $s) {
  do-raw-magic($s);
}
#= (do not use for class 7 spells)
say &cast.WHY;
# OUTPUT: Ā«Initiate a specified spell normallyā¤(do not use for class 7 spells)ā¤Ā»

See Pod declarator blocks for details about attaching Pod to variables, classes, functions, methods, etc.

trait is export

multi trait_mod:<is>(Mu:U \type, :$export!)

Marks a type as being exported, that is, available to external users.

my class SomeClass is export { }

A user of a module or class automatically gets all the symbols imported that are marked as is export.

See Exporting and Selective Importing Modules for more details.

method return

method return()

The method return will stop execution of a subroutine or method, run all relevant phasers and provide invocant as a return value to the caller. If a return type constraint is provided it will be checked unless the return value is Nil. A control exception is raised and can be caught with CONTROL.

sub f { (1|2|3).return };
    say f(); # OUTPUT: Ā«any(1, 2, 3)ā¤Ā»

method return-rw

Same as method return except that return-rw returns a writable container to the invocant (see more details here: return-rw).

method emit

method emit()

Emits the invocant into the enclosing supply or react block.

react { whenever supply { .emit for "foo", 42, .5 } {
        say "received {.^name} ($_)";
    }}
# OUTPUT:
    # received Str (foo)
    # received Int (42)
    # received Rat (0.5)

method take

method take()

Returns the invocant in the enclosing gather block.

sub insert($sep, +@list) {
        gather for @list {
            FIRST .take, next;
            take slip $sep, .item
        }
    }
say insert ':', <a b c>;
    # OUTPUT: Ā«(a : b : c)ā¤Ā»

routine take

sub take(\item)

Takes the given item and passes it to the enclosing gather block.

#| randomly select numbers for lotto
    my $num-selected-numbers = 6;
    my $max-lotto-numbers = 49;
    gather for ^$num-selected-numbers {
        take (1 .. $max-lotto-numbers).pick(1);
    }.say;    # six random values

routine take-rw

sub take-rw(\item)

Returns the given item to the enclosing gather block, without introducing a new container.

my @a = 1...3;
    sub f(@list){ gather for @list { take-rw $_ } };
    for f(@a) { $_++ };
    say @a;
    # OUTPUT: Ā«[2 3 4]ā¤Ā»

method so

method so()

Evaluates the item in Boolean context (and thus, for instance, collapses Junctions), and returns the result. It is the opposite of not, and equivalent to the ? operator.

One can use this method similarly to the English sentence: "If that is so, then do this thing". For instance,

my @args = <-a -e -b -v>;
    my $verbose-selected = any(@args) eq '-v' | '-V';
    if $verbose-selected.so {
        say "Verbose option detected in arguments";
    } # OUTPUT: Ā«Verbose option detected in argumentsā¤Ā»

The $verbose-selected variable in this case contains a Junction, whose value is any(any(False, False), any(False, False), any(False, False), any(True, False)). That is actually a truish value; thus, negating it will yield False. The negation of that result will be True. so is performing all those operations under the hood.

method not

method not()

Evaluates the item in Boolean context (leading to final evaluation of Junctions, for instance), and negates the result. It is the opposite of so and its behavior is equivalent to the ! operator.

my @args = <-a -e -b>;
    my $verbose-selected = any(@args) eq '-v' | '-V';
    if $verbose-selected.not {
        say "Verbose option not present in arguments";
    } # OUTPUT: Ā«Verbose option not present in argumentsā¤Ā»

Since there is also a prefix version of not, this example reads better as:

my @args = <-a -e -b>;
    my $verbose-selected = any(@args) eq '-v' | '-V';
    if not $verbose-selected {
        say "Verbose option not present in arguments";
    } # OUTPUT: Ā«Verbose option not present in argumentsā¤Ā»

See Also

class int

Native integer

class Allomorph

Dual value number and string

class Any

Thing/object

class AST

Abstract representation of a piece of source code

class atomicint

Integer (native storage at the platform's atomic operation size)

class Block

Code object with its own lexical scope

class CallFrame

Captures the current frame state

class Code

Code object

class Collation

Encapsulates instructions about how strings should be sorted

class Compiler

Information related to the compiler that is being used

class Complex

Complex number

class ComplexStr

Dual value complex number and string

class Cool

Object that can be treated as both a string and number

class CurrentThreadScheduler

Scheduler that synchronously executes code on the current thread

class Date

Calendar date

class DateTime

Calendar date with time

class Distribution::Hash

Distribution::Hash

class Distribution::Locally

Distribution::Locally

class Distribution::Path

Distribution::Path

class Distribution::Resource

Every one of the resources installed with a distribution

class Duration

Length of time

class Encoding::Registry

Management of available encodings

class FatRat

Rational number (arbitrary-precision)

class ForeignCode

Rakudo-specific class that wraps around code in other languages (generally NQP)

class Format

Convert values to a string given a format specification

class Formatter

Produce Callable for given format specification

class HyperSeq

An object for performing batches of work in parallel with ordered output

class HyperWhatever

Placeholder for multiple unspecified values/arguments

class Instant

Specific moment in time

class Int

Integer (arbitrary-precision)

class IntStr

Dual value integer and string

class Junction

Logical superposition of values

class Label

Tagged location in the source code

class Lock::Async

A non-blocking, non-re-entrant, mutual exclusion lock

class Macro

Compile-time routine

class Method

Member function

class Nil

Absence of a value or a benign failure

class Num

Floating-point number

role Numeric

Number or object that can act as a number

class NumStr

Dual value floating-point number and string

class ObjAt

Unique identification for an object

class Parameter

Element of a Signature

class Perl

Perl related information

class Proxy

Item container with custom storage and retrieval

class RaceSeq

Performs batches of work in parallel without respecting original order.

class Raku

Raku related information

package RakuAST

Namespace for holding RakuAST related classes

class RakuAST::Doc::Block

Contains the information of a RakuDoc block

class RakuAST::Doc::Declarator

Contains the declarator docs of a RakuAST object

class RakuAST::Doc::Markup

Contains the information about RakuDoc markup

class RakuAST::Doc::Paragraph

Contains the information about a RakuDoc paragraph

class Rat

Rational number (limited-precision)

class RatStr

Dual value rational number and string

class Routine

Code object with its own lexical scope and return handling

class Routine::WrapHandle

Holds all information needed to unwrap a wrapped routine.

class Scalar

A mostly transparent container used for indirections

class Signature

Parameter list pattern

class Str

String of characters

class StrDistance

Contains the result of a string transformation.

class Sub

Subroutine

class Submethod

Member function that is not inherited by subclasses

class Telemetry

Collect performance state for analysis

class Telemetry::Instrument::Thread

Instrument for collecting Thread data

class Telemetry::Instrument::ThreadPool

Instrument for collecting ThreadPoolScheduler data

class Telemetry::Instrument::Usage

Instrument for collecting getrusage data

class Telemetry::Period

Performance data over a period

class Telemetry::Sampler

Telemetry instrument pod

Subset UInt

Unsigned integer (arbitrary-precision)

class ValueObjAt

Unique identification for value types

class Variable

Object representation of a variable for use in traits

class Version

Module version descriptor

class Whatever

Placeholder for the value of an unspecified argument

class WhateverCode

Code object constructed by Whatever-priming

The Camelia image is copyright 2009 by Larry Wall. "Raku" is trademark of the Yet Another Society. All rights reserved.