class Metamodel::DefiniteHOW

Metaobject for type definiteness
    class Metamodel::DefiniteHOW
        does Metamodel::Documenting
            { }

Warning: this class is part of the Rakudo implementation, and is not a part of the language specification.

Type objects may be given a type smiley, which is a suffix that denotes their definiteness:

say Any:D.^name; # OUTPUT: «Any:D␤»
say Any:U.^name; # OUTPUT: «Any:U␤»
say Any:_.^name; # OUTPUT: «Any␤»

Despite sharing a type with Any, Any:U and Any:D in particular have different type-checking behaviors from it:

say Any ~~ Any:D;     # OUTPUT: «False␤»
say Any ~~ Any:U;     # OUTPUT: «True␤»
say Any ~~ Any:_;     # OUTPUT: «True␤»
say Any.new ~~ Any:D; # OUTPUT: «True␤»
say Any.new ~~ Any:U; # OUTPUT: «False␤»
say Any.new ~~ Any:_; # OUTPUT: «True␤»

This happens because Any:D and Any:U are not created with Metamodel::ClassHOW like you might expect Any type objects to be, but Metamodel::DefiniteHOW instead. This HOW defines the behavior for definite type objects such as these.

The following type declaration:

my Any constant Definite = Any:D;

Is roughly equivalent to this code using the methods of Metamodel::DefiniteHOW:

my Any constant Definite = Metamodel::DefiniteHOW.new_type: base_type => Any, definite => 1;

Methods

method new_type

method new_type(:$base_type!, :$definite!)

Creates a new definite type given a base type and definiteness. $definite should either be 1 for :D types or 0 for :U types.

method name

method name($definite_type)

Returns the name of a definite type.

method shortname

method shortname($definite_type)

Returns the shortname of a definite type.

method base_type

method base_type($definite_type)

Returns the base type for a definite type:

say Any:D.^base_type.^name; # OUTPUT: «Any␤»

method definite

method definite($definite_type)

Returns 1 if the definite type given is a :D type or 0 if it is a :U type.

method nominalize

method nominalize($obj)

Produces a nominal type object for a definite type. This is its base type, which may also get nominalized if it has the nominalizable archetype.

method find_method

method find_method($definite_type, $name)

Looks up a method on the base type of a definite type.

method type_check

method type_check($definite_type, $checkee)

Performs a type-check of a definite type against $checkee. This will check if $checkee is of its base type, returning True if they match or False otherwise. This metamethod can get called when a definite type is on the left-hand side of a smartmatch, for instance.

method accepts_type

method accepts_type($definite_type, $checkee)

Performs a type-check of $checkee against a definite type. This will check if $checkee is of its base type and matches its definiteness, returning True if they match or False otherwise. This metamethod can get called when the definite type is on the right-hand side of a smartmatch, for instance.

See Also

class Metamodel::ClassHOW

Metaobject representing a Raku class.

role Metamodel::ConcreteRoleHOW

Provides an implementation of a concrete instance of a role

role Metamodel::CurriedRoleHOW

Support for parameterized roles that have not been instantiated

class Metamodel::EnumHOW

Metaobject representing a Raku enum.

class Metamodel::PackageHOW

Metaobject representing a Raku package.

class Metamodel::Primitives

Metaobject that supports low-level type operations

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