=head1 Name SPVM::Document::Language::Class - Classes in the SPVM Language =head1 Description This document describes classes. =head1 Class The SPVM language is an object-oriented programing language and has class syntax. This section describes class syntax. See L about the grammer of the SPVM language. =head2 Class Definition The C keyword defines a L. class CLASS_NAME { } class CLASS_NAME; class CLASS_NAME : ATTRIBUTES { } class CLASS_NAME : ATTRIBUTES; I is a L. I is one of ATTRIBUTES ATTRIBUTE ATTRIBUTE I is a L. A class type is also simply called a class. The L creates an object from a class. Compilation Errors: I must be a L. Otherwise, a compilation error occurs. If more than one class is defined in a L, a compilation error occurs. Examples: # Examepls of class definitions class Point { } =head2 Class Attributes The List of Class Attributes: =begin html
Class Attributes Descriptions
public This class is public. All classes are able to create an object of this class using the new operator.
private This class is private. Classes other than this class are not able to create an object of this class using the new operator. This is default.
protected This class is protected. Only this class and its child classes are able to create an object of this class using the new operator.
interface_t This class is an interface type. The class definition with this attribute is interpreted as an interface definiton.
mulnum_t This class is a multi-numeric type. The class definition with this attribute is interpreted as an multi-numeric type definiton.
pointer The class is a pointer class.
precompile The precompile method attribute of all methods other than a INIT block, methods generated by enumuration values, and methods that does not have their method block is specified.
=end html Compilation Errors: Only one of C, C or C must be specified. Otherwise, a compilation error occurs. If more than one of C, C, and C are specified, a compilation error occurs. Examples: # Examples of class attributes class Point : public { } class Point : public pointer { } =head3 Pointer Class The pointer class is a class with the C L . class CLASS_NAME : pointer { } An object of a pointer class has the pointer to a native address that is normally a pointer to a C language struct, or a C++ language struct or class. Examples: # Examples of the pointer attribute class Foo : pointer { } =head2 Class File A class file is a file where a class is defined. The name of a class file is the same as a class name, but all C<::> are replaced to C and C<.spvm> is added at the end of it. # Foo Foo.spvm # Foo::Bar Foo/Bar.spvm # Foo::Bar::Baz Foo/Bar/Baz.spvm Compilation Errors: A class definition must be written in its corresponding class file. Otherwise, a compilation error occurs. =head2 Version Statement The C statement declares the version of a class. version VERSION_STRING; This statement declares the version of a class given L I. Compilation Errors: If the version has already been declared, a compilation error occurs. I must be a L. Otherwise, a compilation error occurs. Examples: class MyClass { version "1.001"; } class MyClass { version "10.001003"; } =head3 Version String The version string is the string that represents L of a class. A version string must be written by the following rules. The type of a version string is string type. It consists of C<0-9>, C<.>. The count of C<.> is less than or equal to 1. It begins with C<0-9>. It ends with C<0-9>. The count of C<0-9> after C<.> is divisible by 3. It is able to be parsed by the C function in the C language. Complication Errors: If a version string is not valid, a compilation error occurs. Examples: # Examples of version strings "1.001" "10.001003" "1" "10000" =head3 Version Number A version number is a floating point number created from a L using the C function in the C language. Examples: # Examples of version numbers # "1.001" 1.001 # "10.001003" 10.001003 =head2 use Statement The C statemenet loads a class. use BASIC_TYPE; use BASIC_TYPE as CLASS_NAME; This statement searches for the type I in L from the beginning, and if found, loads the type. I is a L, an L, or a L. See L about how to load a type without causing a compile error when loading fails, The follwoing C statement with C use BASIC_TYPE as CLASS_NAME; is expanded to the following code using L statement. use BASIC_TYPE; alias BASIC_TYPE as CLASS_NAME Compilation Errors: I must be a L. Otherwise, a compilation error occurs. I must be a L. Otherwise, a compilation error occurs. If I does not found, a compilation error occurs. Examples: # Examples of the use statement class MyClass { use Foo; } class MyClass { use Sys::Socket::Constant as SOCKET; } =head2 Class Search Directories Class search directories are directories in which classes are searched for. These are set outside the program. Directories set by C<-I> option of L command and L command are added to class search directories. And directories with C added to the end of each value of Perl's L<@INC|https://perldoc.perl.org/perlvar#@INC> are added to the end of the class search directories. =head3 Default Loaded Classes The following classes are loaded by default. =over 2 =item * L =item * L =item * L =item * L =item * L =item * L =item * L =item * L =item * L =item * L =item * L =item * L =item * L =back =head2 alias Statement The C statemenet creates an class alias name for a type. alias BASIC_TYPE as CLASS_NAME; This statemenet creates an class alias name I for a type I. I is a L, an L, or a L. Compilation Errors: I must be a L. Otherwise, a compilation error occurs. I must be a L. Otherwise, a compilation error occurs. Examples: class MyClass { use Sys::Socket::Constant; alias Sys::Socket::Constant as SOCKET; SOCKET->AF_INET; } =head2 allow Statement The C statemenet allows a type private accesses to the current class. allow BASIC_TYPE; By default, objects of private classes cannot be created by L from other classes. And private methods, private fields, and private class variables cannot be accessed from other classes. This statement allows the type I private accesses to the current class. I is loaded by L. Examples: # Allowing private access class MyClass { allow SomeClass; } =head2 Inheritance A class inherits a class using the C keyword. class CLASS_NAME extends PARENT_CLASS_NAME { } The class I that inherits the parent class I is defined. The field definitions of the parent class I are added to the end of the field definitions of the class I to the end of its fields. The L of the parent class I are added to the end of L of the class I. The instance of the class I can calls instance methods of the parent class I and its super classes. Compilation Errors: The parent class I must be a L. Otherwise, a compilation error occurs. The name of the parant class must be different from the name of the class. Otherwise, a compilation error occurs. The all super classes must be different from its own class. Otherwise, a compilation error occurs. The field that name is the same as the field of the super class cannnot be defined. Otherwise, a compilation error occurs. The class I interpreted by an interface must satisfy L to the parent class I. Otherwise, a compilation error occurs. Examples: class Point3D extends Point { has z : rw protected int; static method new : Point3D ($x : int = 0, $y : int = 0, $z : int = 0) { my $self = new Point3D; $self->{x} = $x; $self->{y} = $y; $self->{z} = $z; return $self; } method clear : void () { $self->SUPER::clear; $self->{z} = 0; } method to_string : string () { my $x = $self->x; my $y = $self->y; my $z = $self->z; my $string = "($x,$y,$z)"; return $string; } method clone : object () { my $self_clone = Point3D->new($self->x, $self->y, $self->z); return $self_clone; } } =head2 Interface This section describes interfaces. =head3 Interface Definition A L with the C L defines an L. class CLASS_NAME : interface_t { } An interface type is also simply called an interface. Objects cannot be created from interface types. Normally, an interface has L. Compilation Errors: An interface cannnot have L. If so, a compilation error occurs. An interface cannnot have L. If so, a compilation error occurs. Examples: # Examples of interface definitions class TestCase::Pointable : interface_t { interface Stringable; method x : int (); method y : int(); method to_string : string (); } class Stringable: interface_t { method to_string : string (); method call_to_string : string () { return "foo " . $self->to_string; } } class Stringable: interface_t { required method to_string : string (); method foo : int ($num : long); } =head3 interface Statement The C statement checks if the current class satisfies L to an interface. interface BASIC_TYPE; I is loaded by L. Compilation Errors: The interface type I must be an L, ohterwise a compilation error occurs. The current class must satisfy L to the interface type I, ohterwise a compilation error occurs. Examples: # Examples of the interface statement class Point { interface Stringable; method to_string : string () { my $x = $self->x; my $y = $self->y; my $string = "($x,$y)"; return $string; } } =head2 Anon Class An anon class is a class without specifying its class name. =head3 Anon Class Definition An anon class is defined by the following syntax. class { } An anon class cannot be defined in a L. It is able to be defined in a source code compiled by L compiler native API. An anon class has its L, such as C, C, C. eval::anon_class::123 L # Examples of the anon class definition class { static method sum : int ($num1 : int, $num2 : int) { return $num1 + $num2; } } =head2 Anon Method Class An anon method class is a class defined by an L. =head3 Anon Method Class Definition The anon method class definition has the following syntax. ANON_METHOD_CLASS_FIELD_DEFINITION METHOD_DEFINITION I is an L. I is a L. The anon method class definition defines a class to which this method belongs. The name of this class is a string that joins L, a string C<"anon_method">, the line number and the position of columns where an anon method class definition is written with C<::>. MyClass::anon_method::3::23 An anon method class has the same access control as its outmost class. An anon method class has the same alias names as its outmost class. Compilation Errors: The method name of I must be an empty string. Otherwise, a compilation error occurs. The method must be an instance method. Otherwise, a compilation error occurs. Examples: # Examples of the anon method definition class Foo::Bar { method my_method : void () { my $comparator = (Comparator)method : int ($x1 : object, $x2 : object) { my $point1 = (Point)$x1; my $point2 = (Point)$x2; return $point1->x <=> $point2->x; }; } } =head4 Anon Method Class Field Definition An anon method class field definition defines fields of an L, which is a part of L. [ANON_METHOD_CLASS_FIELD_DEFINITION_ITEM1, ANON_METHOD_CLASS_FIELD_DEFINITION_ITEM, ANON_METHOD_CLASS_FIELD_DEFINITION_ITEMn] I are one of has FIELD_NAME : TYPE has FIELD_NAME : TYPE = OPERAND VAR : TYPE VAR : TYPE = OPERAND has FIELD_NAME : ATTRIBUTE1 ATTRIBUTE2 ATTRIBUTEn TYPE has FIELD_NAME : ATTRIBUTE1 ATTRIBUTE2 ATTRIBUTEn TYPE = OPERAND VAR : ATTRIBUTE1 ATTRIBUTE2 ATTRIBUTEn TYPE VAR : ATTRIBUTE1 ATTRIBUTE2 ATTRIBUTEn TYPE = OPERAND I is a L. I is a L. I is an L. C is expaneded to C. I is the same as the name of I, but C<$> is removed. I is declared at the top of this anon method and set to the value of its corresponding field. C is the same as above, but expaneded to C. I is a L. Compilation Errors: Compilation errors caused by L could occur. Examples: # Examples of the anon method class field definition class Foo::Bar { method my_method : void () { my $foo = 1; my $bar = 5L; my $comparator = (Comparator)[has foo : int = $foo, has bar : long = $bar] method : int ($x1 : object, $x2 : object) { my $foo = $self->{foo}; my $bar = $self->{bar}; say "$foo"; say "$bar"; }; } } # More simple class Foo::Bar { method my_method : void () { my $foo = 1; my $bar = 5L; my $comparator = (Comparator)[$foo : int, $bar : long] method : int ($x1 : object, $x2 : object) { say "$foo"; say "$bar"; }; } } # Change variable names class Foo::Bar { method my_method : void () { my $foo = 1; my $bar = 5L; my $comparator = (Comparator)[$foo_x : int = $foo, $bar_x : long = $bar] method : int ($x1 : object, $x2 : object) { say "$foo_x"; say "$bar_x"; }; } } =head2 Outmost Class An outmost class is the outmost defined class. This is the same as the class defined by L. class OutmostClass { } Examples: # Examples of the outmost class class MyClass { static method my_method : void () { # The __PACKAGE__ operator returns the outmost class "MyClass". my $outmost_class_name = __PACKAGE__; # Anon method my $cb = method : void () { # The __PACKAGE__ operator returns the outmost class "MyClass". my $outmost_class_name = __PACKAGE__; }; } } =head2 Multi-Numeric Type Definition A L is defined by L with the C L. class CLASS_NAME : mulnum_t { has FIELD_NAME1 : NUMERIC_TYPE; has FIELD_NAME2 : NUMERIC_TYPE; has FIELD_NAMEn : NUMERIC_TYPE; } A multi-numeric field must have at least one fields. The type of a field must be a numeric type. The types of all fields must be same. The length of fields must be less than or equal to 255. I must ends with a L corresponding to the type of fields. I of L must be the same as the length of fields. I of L must correspond to the type of fields. A multi-numeric type cannnot have instance methods. A multi-numeric type cannnot have class variables. Compilation Errors: If the difinition of multi-numeric type is invalid, a compilation error occurs. Examples: # Examples of the multi-numeric type definition class Complex_2f : mulnum_t { re : float; im : float; } class Complex_2d : mulnum_t { re : double; im : double; } class Quaternion_4f : mulnum_t { re : float; i : float; j : float; k : float; } class Quaternion_4d : mulnum_t { re : double; i : double; j : double; k : double; } =head3 Multi-Numeric Type Suffix The multi-numeric type must end with the following suffix. _(non-spaces)FIELD_LENGTH(non-spaces)TYPE_SUFFIX I is the length of fields. I is a type suffix. The List of Type Suffixes: =begin html
Numeric Types Type Suffixes
byte b
short s
int i
long l
float f
double d
=end html Examples: # Examples of the multi-numeric type suffix _2f; _2d; _4f; _4d; =head1 Enumeration Enumeration is a syntax that defines 32-bit integers that belongs to a L. =head2 Enumeration Definition The C keyword defines an enumeration. enum { ITEM1, ITEM2, ITEMn } C<,> after the last enumeration item is allowed. enum { ITEM1, ITEM2, ITEM3, } I is one of NAME NAME = VALUE I is a L. I is an L within int type. I is converted the value of int type. If I of I is omitted, it is set to 0. If I of I is ommited, it is set to the value of the previous item plus 1. The return type of the method is int type. Every enumeration item is converted to a L that defines a class method that returns the value of the enumeration item. # Definition of an enumeration class MyClass { enum { NAME = 5, } } # This are replaced with a definition of a class method class MyClass { static method NAME : int () { return 5; } } See also L. Compilation Errors: I must be a L. Otherwise, a compilation error occurs. I must be an L within int type. Otherwise, a compilation error occurs. Examples: # Examples of enumerations class MyClass { enum { FLAG1, FLAG2, FLAG3, } static method main : void () { my $flag1 = MyClass->FLAG1; } } class MyClass { enum { FLAG1, FLAG2 = 2, FLAG3, } } =head2 Enumeration Attributes The List of Enumeration Attributes: =begin html
Attributes Descriptions
public This enumeration is public. All classes can access all items of this enumeration. This is default.
private This enumeration is private. All classes ohter than this class cannnot access all items of this enumeration.
protected This enumeration is protected. All classes ohter than this class and its child classes cannot access all items of this enumeration.
=end html Compilation Errors: One of C, C and C must be specified. Otherwise, a compilation error occurs. =head1 Class Variable A class variable is a global variable that belongs to a L. =head2 Class Variable Definition C keyword defines a class variable. our CLASS_VARIABLE_NAME : OPT_ATTRIBUTES TYPE; I is a L that does not contains C<::>. I is a L. I is one of EMPTY ATTRIBUTES I means nothing exists. I is one of ATTRIBUTES ATTRIBUTE ATTRIBUTE I is a L. Each class variable is initialized by its L. The value of a class variable is got by the operation of L. The value of a class variable is set by the operation of L. Compilation Errors: I must a L that does not contains C<::>. Otherwise, a compilation error occurs. I must be a L or an L. I must be a L. Otherwise, a compilation error occurs. If two or more class variables that has a same name are defined, a compilation error occurs. Examples: class MyClass { our $NUM_BYTE : byte; our $NUM_SHORT : short; our $NUM_INT : int; our $NUM_LONG : long; our $NUM_FLOAT : float; our $NUM_DOUBLE : double; our $POINT : Point; our $NUM_PUBLIC : public int; our $NUM_RO : ro int; our $NUM_RW : rw int; } =head2 Class Variable Attributes The List of Class Variable Attributes: =begin html
Class Variable Attributes Descriptions
public This class variable is public. All classes can access this class variable.
private This class variable is private. All classes ohter than this class cannnot access this class variable. This is default.
protected This class variable is protected. All classes ohter than this class and its child classes cannot access this class variable.
ro This class variable defines a getter method.
wo This class variable defineds a setter method.
rw This class variable defines a getter method and a setter method.
=end html Compilation Errors: One of C, C and C must be specified. Otherwise, a compilation error occurs. One of C, C, and C must be specified. Otherwise, a compilation error occurs. =head3 Class Variable Getter Method A class variable getter method is a method to perform the operation of L. This method is a class method that has no arguments. If the type of the class variable is byte type or short type, the return type is int type. Otherwise, it is the same type as the class variable. The method name is the same as the class variable name, but C<$> is removed. For example, if the class variable name is C<$FOO>, the method name is C. Examples: # Examples of class variable getter methods class MyClass { our $NUM : ro int; static method main : void { my $num = Foo->NUM; } } =head3 Class Variable Setter Method A class variable setter method is a method to perform the operation of L. This method is a class method that has an argument. If the type of the class variable is byte type or short type, the argument type is int type. Otherwise, it is the same type as the class variable. The return type is void type. The method name is the same as the class variable name, but C<$> is removed and C is added to the beginning of it. For example, if the class variable name is C<$FOO>, the method name is C. Examples: # Examples of class variable setter methods class MyClass { our $NUM : wo int; static method main : void { Foo->SET_NUM(3); } } =head1 Field A field is a data member of a L. =head2 Field Definition The C keyword defines a field. has FIELD_NAME : OPT_ATTRIBUTES TYPE; I is a L. I is a L. I is one of EMPTY ATTRIBUTES I means nothing exists. I is one of ATTRIBUTES ATTRIBUTE ATTRIBUTE I is a L. Each field of an object is initialized by its L when the object is created. The value of a field is got by the operation of L. The value of a field is set by the operation of L. Compilation Errors: I must a L. Otherwise, a compilation error occurs. I must be a L or an L. I must be a L. Otherwise, a compilation error occurs. If two or more fields that has a same name are defined, a compilation error occurs. Examples: class MyClass { has num_byte : byte; has num_short : short; has num_int : int; has num_long : long; has num_float : float; has num_double : double; has num_public : public int; has num_ro : ro int; has num_rw : rw int; } =head2 Field Attributes The List of Field Attributes: =begin html
Field Attributes Descriptions
public This field is public. All classes can access this field.
private This field is private. All classes ohter than this class cannnot access this field. This is default.
protected This field is protected. All classes ohter than this class and its child classes cannot access this field.
ro This field defines a getter method.
wo This field defineds a setter method.
rw This field defines a getter method and a setter method.
=end html Compilation Errors: One of C, C and C must be specified. Otherwise, a compilation error occurs. One of C, C, and C must be specified. Otherwise, a compilation error occurs. =head3 Field Getter Method A field getter method is a method to perform the operation of L. This method is an instance method that has no arguments. If the type of the field is byte type or short type, the return type is int type. Otherwise, it is the same type as the field. The method name is the same as the field name. For example, if the field name is C, the method name is C. Examples: # Examples of field getter methods class MyClass { has num : ro int; static method new { return new Foo; } static method main : void { my $foo = Foo->new; my $num = $foo->num; } } =head3 Field Setter Method A field setter method is a method to perform the operation of L. This method is an instance method that has an argument. If the type of the field is byte type or short type, the argument type is int type. Otherwise, it is the same type as the field. The return type is void type. The method name is the same as the field name, but C is added to the beginning of it. For example, if the field name is C, the method name is C. Examples: # Examples of field setter methods class MyClass { has num : wo int; static method new { return new Foo; } static method main : void { my $foo = Foo->new; $foo->set_num(3); } } =head1 Method =head2 Method Definition The C keyword defines a method. OPT_ATTRIBUTES method METHOD_NAME : RETURN_TYPE (OPT_ARG_ITEMS) { } OPT_ATTRIBUTES method METHOD_NAME : RETURN_TYPE (OPT_ARG_ITEMS); I is one of EMPTY ATTRIBUTES I means nothing exists. I is one of ATTRIBUTES ATTRIBUTE ATTRIBUTE I is a L. I is a L. I is a L. I is one of EMPTY ARG_ITEMS I means nothing exists. I is one of ARG_ITEMS , ARG_ITEM ARG_ITEM I is one of ARG_NAME : ARG_TYPE ARG_NAME : ARG_TYPE = VALUE I is a L. The local variable specified I is declared at the beginning of L. I is a L. I is a L or C. A method with the C L is a L. A method without the C L is an L. An argument with I is an optional arguments. If a method call dose not give a value to an optional argument, I is given to the argument. A interface method defined in an L is an L. A method with the C L is a L. Compilation Errors: The count of I must be less than or equal to 255. Otherwise, a compilation error occurs. I must be a L, a L, an L, or a L. Otherwise, a compilation error occurs. I must be void type, a L, a L or an L. Otherwise, a compilation error occurs. Methods other than interface methods and native methods must have a method block. Otherwise, a compilation error occurs. I must satisfy L to I. Otherwise, a compilation error occurs. I must not be C. Otherwise, a compilation error occurs. A non-optional argument must not be placed after an optional argument. Otherwise, a compilation error occurs. Examples: class MyClass { # Class method static method substr : string ($string : string, $offset : int, $length : int = -1) { # ... } # Instance method method clear : void () { } } =head2 Method Attributes The List of Method Attributes: =begin html
Method Attributes Descriptions
public This method is public. All classes can call this method. This is default.
private This method is private. All classes ohter than this class cannnot call this method.
protected This method is protected. All classes ohter than this class and its child classes cannot call this method.
precompile This method is a precompilation method.
native This method is a native method.
required A method that implements this interface method must be defined.
=end html Compilation Errors: One of C, C and C must be specified. Otherwise, a compilation error occurs. C must be specified to an interface method. Otherwise, a compilation error occurs. Examples: # private method private method : int sum ($num1 : int, $num2 : int) { return $num1 + $num2; } # precompile method precompile method : int sum ($num1 : int, $num2 : int) { return $num1 + $num2; } # native method native method : int sum ($num1 : int, $num2 : int); =head2 Class Method A method defined with the C L is a class method. A class method can be called by a L. =head2 Instance Method A method defined without the C L is an instance method. An instance method can be called by an L. =head2 Interface Method An instance method defined in an L is an interface method. Normally, an interface method does not have a method block. method my_method : int (); But, an interface method can have a method block. method my_method : int () { } An interface method can have the C L that indicates classes must define a method with the same name that implements this interface method. required method my_method : int (); =head2 INIT Method A C method is a method that is executed just after a program starts. =head3 INIT Method Definition A C block defines a C method to be executed just after the program starts. A C method is called only once. INIT { } A C method has no arguments. The return type of a C method is void type. If a C method is not defined in a class, a C method without statements is defined. If the current class has a parent class, C method of the parent class is called at the beginning of the INIT method of the current class. And C methods of classes loaded by L are called in loaded order. class MyClass extends ParentClass { use Foo; use Bar; INIT { # INIT methods of the parent class and classes loaded by use statements are called automatically ParentClass->INIT; Foo->INIT; Bar->INIT; # Do something } } The execution order of C methods is not guaranteed except that C methods are called explictly and except for the above explanation. The C methods in L are called before C methods of other classes, Examples: # Examples of INIT methods class MyClass { use Point; our $NUM : int; our $STRING : string; our $POINT : Point; # INIT method INIT { $NUM = 3; $STRING = "abc"; $POINT = Point->new(1, 2); } } =head2 Destructor A destructor is a method called just before an object is destroyed. method DESTROY : void () { } A destructor is an L. The name of a destructor is C. A destructor has no arguments. The retrun type is void type. An L thrown in a destructor is converted to a warning message. The warning message is printed to L. If the reference count of an object is 0, the destructor method in the class of the object is called. In this time, the return value and an exception variable in the current L is saved before the call to the destructor method, and restore it after the call. So, the exception variable in the current runtime stack cannot be changed in a destructor. See L about garbage collection. Compilation Errors: A destructor must be an L. Otherwise, a compilation error occurs. The name of a destructor must be C. Otherwise, a compilation error occurs. If a destructor has arguments, a compilation error occurs. The retrun type must be void type. Otherwise, a compilation error occurs. If two or more destructors are defined, a compilation error occurs. Examples: # Destructor class MyClass { method DESTROY : void () { say "DESTROY"; } } =head2 Method Override An instance method in a parent class can be overridden by an instance method with the same name in a child class. class ChildClass extends ParentClass { # Method Override method clear : void () { # ... } } class ParentClass { method clear : void () { # ... } } The overridding method in the child class must satisfy L to the parent method interpretted as an interface method. Compilation Errors: The overridding method in the child class must satisfy L to the parent method. Otherwise, a compilation error occurs. =head2 Native Method A method with the C L is a native method. native sum : int ($num1 : int, $num2 : int); A native method has no L. The implementation of a native method is written by native languages such as the C language, C. See L about the way to write the implementation of a native method. =head2 Precompilation Method A method with the C L is a precompilation method. precompile sum : int ($num1 : int, $num2 : int) { } The source code of each precompilation method is converted to a C source code and it is compiled to the machine code. And the machine codes of all precompilation methods in a class is linked to a dynamic link library such as C on Linux/Unix, C on Windows, C on Mac. The address of machine code of each precompilation method in the dynamic link library is bind to a precompilation method. Precompilation methods need a L such as C<~/.spvm_build> to compile and link them. =head2 Bootstrap Method A bootstrap method is a method where a program start. void main : void () { } The method name is C
. The return type is void type. It has no arguments. =head2 Method Implementation Normally a method has a method block. L can be written in a method block. static method foo : int ($num1 : int, $num2 : int) { my $total = $num1 + $num2; return $total; } SPVM operation codes are generated from a method implementation. =head1 Local Variable A local variable is a variable that has a L. =head2 Local Variable Declaration A C keyword declares a local variable. my LOCAL_VAR_NAME my LOCAL_VAR_NAME : TYPE my LOCAL_VAR_NAME = VALUE my LOCAL_VAR_NAME : TYPE = VALUE I is a L. I is a L. If I is ommited, I is set to the type of I. This is called L. I is an L. A local variable is declared in a L. A local variable declaration performs the operation of L. A local variable declaration is a L. Compilation Errors: I must be a L. Otherwise a compilation error occurs. I must be a L, an L, L, or a L. Otherwise a compilation error occurs. If I is not resolved, a compilation error occurs. Examples: # Examples of local variable declarations my $var : int; my $var : Point; my $var : Complex_2d; my $var : int*; my $num = 1; my $num = 1.0; my $ppp = my $bar = 4; if (my $bar = 1) { } while (my $bar = 1) { } =head3 Type Inference If the type of the local variable declaration is ommited, the type of the local variable is set to the type of the right operand of the assignment operator. This is called type inference. # int my $num = 1; # double my $num = 1.0; # Foo my $foo = new Foo; =head1 Symbol Name Resolution This section describes resolutions of symbol names, such as variable names, class names, field names, method names in the current L. =head2 Variable Name Resolution A variable name resolves to a L or a L. If C<::> is contained in a variable name, a class variable definition as the same name as I in I is searched. CLASS_TYPE::VAR_NAME If found, a variable name resloves to a L. If C<::> is not contained in a variable name, a local variable declaration as the same name as I is searched upwards from the posotion of I. VAR_NAME If found, a variable name resloves to a L. If not found, a class variable definition as the same name as I in L is searched. If found, a variable name resloves to a L. Compilation Errors: I must be a valid variable name. Otherwise, a compilation error occurs. The class specified by I must be loaded. Otherwise, a compilation error occurs. The class variable relative name specified by I must be defined in the class specified by I. Otherwise, a compilation error occurs. If it resolves to a class variable, L must has the access control to I in the I. Otherwise, a compilation error occurs. =head2 Field Access Resolution The following syntax resolves to a L. INVOCANT->{FIELD_NAME} The type of I is a L, a L, or a L. I is a L. A field specified by I is searched in the type of I. If it is found and the type of I is a L, it resolves to a field access for class types. If it is found and the type of I is a L, it resolves to a field access for multi-numeric types. If it is found and the type of I is a L, it resolves to a field access for multi-numeric reference types. Compilation Errors: I must be an object of a L, a multi-numeric number of a L, a multi-numeric number referenced by a L. Otherwise, a compilation error occurs. If the type of I is a class type, the field specified by I must be defined in the class, or its super classes. Otherwise, a compilation error occurs. If the type of I is a multi-numeric type, the field specified by I must be defined in the multi-numeric type. Otherwise, a compilation error occurs. If the type of I is a multi-numeric reference type, the field specified by I must be defined in the multi-numeric type referenced by the multi-numeric reference type. Otherwise, a compilation error occurs. The L must has the access control to I in the type of I. Otherwise, a compilation error occurs. =head2 Method Call Resolution A L is an operation to call a method. A method call resolves to one of the three types of method calls, a class method call, a static instance method call, and an instance method call. =head3 Class Method Call Resolution A class method call calls a class method. CLASS_TYPE->METHOD_NAME CLASS_TYPE->METHOD_NAME(OPT_ARGS) &METHOD_NAME &METHOD_NAME(OPT_ARGS) I is a L or a class alias name created by an L. C<&> is converted to L. This becomes C>>. I is a L. I is one of EMPTY ARGS I means nothing exists. I is one of ARGS , ARG ARG I is an L. If a method specified I is searched in I. If found, it resolves to a L. The return type is the type of the found method. Compilation Errors: If the method is not found, a compilation error occurs. If the found method is an instance method, a compilation error occurs. If the type of I does not satisfy L, a compilation error occurs. If the length of I is too many, a compilation error occurs. If the length of I is too few, a compilation error occurs. The L must has the access control to the found method. Otherwise, a compilation error occurs. Examples: # Examples of class method calls class MyClass { static method main : void () { my $ret = Fn->INT_MAX; my $ret = Fn->abs(-5); my $ret = &sum(1, 2); } static method sum : int ($num1 : int, $num2 : int) { return $num1 + $num2; } } =head4 Inline Expansion of Method Call to Get an Enuemration Value An inline expansion is performed on every class method call to get an enumeration value, and it is replaced with the return value. Examples: class MyClass { enum { FLAG1 = 5; } method main : void () { # This is replaced with 5. MyClass->FLAG1; } } =head3 Static Instance Method Call Resolution A static instance method call calls an instance method specifying a class. INVOCANT->CLASS_TYPE::METHOD_NAME INVOCANT->CLASS_TYPE::METHOD_NAME(OPT_ARGS) I is an object of a L or an L. I is a L, an L, or C. If C is specified, a method specified by I is searched in the super classes of the current class. If it is found and it is an instance method, C is replaced to the class of the found method. This becomes I. I is a L. I is one of EMPTY ARGS I means nothing exists. I is one of ARGS , ARG ARG I is an L. A method specified I is searched in I. If found, it resolves to a L. The return type is the type of the found method. Compilation Errors: I must be a L, an L, or C. Ohterwise a compilation error occurs. The type of I must satisfies L to I. Ohterwise a compilation error occurs. If C is specified and the found method is a class method, a compilation error occurs. If the method is not found, a compilation error occurs. If the found method is a class method, a compilation error occurs. If the type of I does not satisfy L, a compilation error occurs. If the length of I is too many, a compilation error occurs. If the length of I is too few, a compilation error occurs. The L must has the access control to the found method. Otherwise, a compilation error occurs. Examples: # Examples of static instance method calls my $point3d = Point3D->new; $point3d->Point::clear; $point3d->SUPER::clear; =head3 Instance Method Call Resolution An instance method call calls an instance method. INVOCANT->METHOD_NAME INVOCANT->METHOD_NAME(OPT_ARGS) I is an object of a L or an L. I is a L. I is one of EMPTY ARGS I means nothing exists. I is one of ARGS , ARG ARG I is an L. If the type of I is a L, a method specified I is searched in the class and its super classes. If found, it resolves to an L. If the type of I is an L, a method specified I is searched in the interface. If found, it resolves to an L. The return type is the type of the found method. Compilation Errors: The type of I must be a L or an L. If the method specified by I is not found, a compilation error occurs. If the found method is a class method, a compilation error occurs. If the type of I does not satisfy L, a compilation error occurs. If the length of I is too many, a compilation error occurs. If the length of I is too few, a compilation error occurs. The L must has the access control to the found method. Otherwise, a compilation error occurs. Examples: # Examples of instance method calls my $point = Point->new; $point->clear; my $stringable = (Stringable)$point; my $string = $strinble->to_string; =head1 Block A block is the part enclosed by C<{> and C<}>. =head2 Class Block A class block is a block used in a class definition. class MyClass { } =head2 Enumeration Block An enumeration block is a block used in an enumeration definition. enum { ONE, TWO, } =head2 Scope Block A scope block is a block that has its L. Zero or more L are written in a scope block. =head3 Simple Block A simple block is a scope block. { 1; } A simple block must have at least one statements. Otherwise, it is intepreted as a L. =head3 Method Block A method block is a scope block. static method foo : int () { } =head3 INIT block An C block is a scope block. INIT { } =head3 eval Block An C block is a scope block. eval { } =head3 if Block An C block is a scope block. if (CONDITION) { } =head3 elsif Block An C block is a scope block. elsif (CONDITION) { } =head3 else Block An C block is a scope block. else { } =head3 for Block A C block is a scope block. for (my $i = 0; $i < 3; $i++) { } =head3 while Block A C block is a scope block. while (CONDITION) { } =head3 switch Block A C block is a scope block. switch (CONDITION) { } =head3 case Block A C block is a scope block. case CASE_VALUE1: { # ... } =head3 default Block A C block is a scope block. default: { # ... } =head1 Type Comment The type comment is a syntax to write a comment for a type. TYPE of TYPE_COMMENT TYPE of TYPE_COMMENT1|TYPE_COMMENT2|TYPE_COMMENTn I is a L. I is a type used in L, L, L, and the return value and the types of arguments of L. I is a L. Examples: # Examples of type comments has points : List of Point; our $POINTS : List of Point; my $points : List of Point; static method foo : List of Point ($arg : List of Point) { ... } my $replace : object of string|Regex::Replacer; Compilation Errors: If the type specified as the type comment is not found, a compilation error occurs. =head1 See Also =over 2 =item * L =item * L =item * L =item * L =item * L =back =head1 Copyright & License Copyright (c) 2023 Yuki Kimoto MIT License