Name

SPVM::Document::Language::Class - Classes in the SPVM Language

Description

This document describes classes.

Class

The SPVM language is an object-oriented programing language and has class syntax.

This section describes class syntax.

See SPVM::Document::Language::SyntaxParsing about the grammer of the SPVM language.

Class Definition

The class keyword defines a class type.

class CLASS_NAME {

}

class CLASS_NAME;

class CLASS_NAME : ATTRIBUTES {

}

class CLASS_NAME : ATTRIBUTES;

CLASS_NAME is a class name.

ATTRIBUTES is one of

ATTRIBUTES ATTRIBUTE
ATTRIBUTE

ATTRIBUTE is a class attributre.

A class type is also simply called a class.

The new operator creates an object from a class.

Compilation Errors:

CLASS_NAME must be a class name. Otherwise, a compilation error occurs.

If more than one class is defined in a class file, a compilation error occurs.

Examples:

# Examepls of class definitions
class Point {

}

Class Attributes

The List of Class Attributes:

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.

Compilation Errors:

Only one of private, protected or public must be specified. Otherwise, a compilation error occurs.

If more than one of interface_t, mulnum_t, and pointer are specified, a compilation error occurs.

Examples:

# Examples of class attributes
class Point : public {

}

class Point : public pointer {

}

Pointer Class

The pointer class is a class with the pointer class attribute .

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 {

}

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 :: are replaced to / and .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.

Version Statement

The version statement declares the version of a class.

version VERSION_STRING;

This statement declares the version of a class given version string VERSION_STRING.

Compilation Errors:

If the version has already been declared, a compilation error occurs.

VERSION_STRING must be a version string. Otherwise, a compilation error occurs.

Examples:

class MyClass {
  version "1.001";
}

class MyClass {
  version "10.001003";
}

Version String

The version string is the string that represents version 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 0-9, ..

The count of . is less than or equal to 1.

It begins with 0-9.

It ends with 0-9.

The count of 0-9 after . is divisible by 3.

It is able to be parsed by the strtod 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"

Version Number

A version number is a floating point number created from a version string using the strtod function in the C language.

Examples:

# Examples of version numbers

# "1.001"
1.001

# "10.001003"
10.001003

use Statement

The use statemenet loads a class.

use BASIC_TYPE;
use BASIC_TYPE as CLASS_NAME;

This statement searches for the type BASIC_TYPE in class search directories from the beginning, and if found, loads the type.

BASIC_TYPE is a class type, an interface type, or a multi-numeric type.

See require statement about how to load a type without causing a compile error when loading fails,

The follwoing use statement with as

use BASIC_TYPE as CLASS_NAME;

is expanded to the following code using alias statement.

use BASIC_TYPE;
alias BASIC_TYPE as CLASS_NAME

Compilation Errors:

BASIC_TYPE must be a class name. Otherwise, a compilation error occurs.

CLASS_NAME must be a class name. Otherwise, a compilation error occurs.

If BASIC_TYPE 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;
}

Class Search Directories

Class search directories are directories in which classes are searched for.

These are set outside the program.

Directories set by -I option of spvm command and spvmcc command are added to class search directories.

And directories with /SPVM added to the end of each value of Perl's @INC are added to the end of the class search directories.

Default Loaded Classes

The following classes are loaded by default.

alias Statement

The alias statemenet creates an class alias name for a type.

alias BASIC_TYPE as CLASS_NAME;

This statemenet creates an class alias name CLASS_NAME for a type BASIC_TYPE.

BASIC_TYPE is a class type, an interface type, or a multi-numeric type.

Compilation Errors:

BASIC_TYPE must be a class name. Otherwise, a compilation error occurs.

CLASS_NAME must be a class name. Otherwise, a compilation error occurs.

Examples:

class MyClass {
  use Sys::Socket::Constant;
  alias Sys::Socket::Constant as SOCKET;
  
  SOCKET->AF_INET;
}

allow Statement

The allow statemenet allows a type private accesses to the current class.

allow BASIC_TYPE;

By default, objects of private classes cannot be created by new operator from other classes.

And private methods, private fields, and private class variables cannot be accessed from other classes.

This statement allows the type BASIC_TYPE private accesses to the current class.

BASIC_TYPE is loaded by use statement.

Examples:

# Allowing private access
class MyClass {
  allow SomeClass;
}

Inheritance

A class inherits a class using the extends keyword.

class CLASS_NAME extends PARENT_CLASS_NAME {
  
}

The class CLASS_NAME that inherits the parent class PARENT_CLASS_NAME is defined.

The field definitions of the parent class PARENT_CLASS_NAME are added to the end of the field definitions of the class CLASS_NAME to the end of its fields.

The interface statements of the parent class PARENT_CLASS_NAME are added to the end of interface statements of the class CLASS_NAME.

The instance of the class CLASS_NAME can calls instance methods of the parent class PARENT_CLASS_NAME and its super classes.

Compilation Errors:

The parent class PARENT_CLASS_NAME must be a class type. 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 CLASS_NAME interpreted by an interface must satisfy interface requirement to the parent class PARENT_CLASS_NAME. 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;
  }
}

Interface

This section describes interfaces.

Interface Definition

A class definition with the interface_t class attribute defines an interface type.

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 interface methods.

Compilation Errors:

An interface cannnot have field definitions. If so, a compilation error occurs.

An interface cannnot have class variable definitions. 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);
}

interface Statement

The interface statement checks if the current class satisfies interface requirement to an interface.

interface BASIC_TYPE;

BASIC_TYPE is loaded by use statement.

Compilation Errors:

The interface type BASIC_TYPE must be an interface type, ohterwise a compilation error occurs.

The current class must satisfy interface requirement to the interface type BASIC_TYPE, 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;
  }
}

Anon Class

An anon class is a class without specifying its class name.

Anon Class Definition

An anon class is defined by the following syntax.

class {

}

An anon class cannot be defined in a class file. It is able to be defined in a source code compiled by compile_anon_class compiler native API.

An anon class has its class name, such as eval::anon_class::0, eval::anon_class::1, eval::anon_class::2.

eval::anon_class::123

Examples:

# Examples of the anon class definition
class {
  static method sum : int ($num1 : int, $num2 : int) {
    return $num1 + $num2;
  }
}

Anon Method Class

An anon method class is a class defined by an anon method operator.

Anon Method Class Definition

The anon method class definition has the following syntax.

ANON_METHOD_CLASS_FIELD_DEFINITION METHOD_DEFINITION

ANON_METHOD_CLASS_FIELD_DEFINITION is an anon method class field definition.

METHOD_DEFINITION is a method definition.

The anon method class definition defines a class to which this method belongs.

The name of this class is a string that joins outmost class, a string "anon_method", the line number and the position of columns where an anon method class definition is written with ::.

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 METHOD_DEFINITION 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;
    };
  }
}

Anon Method Class Field Definition

An anon method class field definition defines fields of an anon class, which is a part of anon method class definition.

[ANON_METHOD_CLASS_FIELD_DEFINITION_ITEM1, ANON_METHOD_CLASS_FIELD_DEFINITION_ITEM, ANON_METHOD_CLASS_FIELD_DEFINITION_ITEMn]

ANON_METHOD_CLASS_FIELD_DEFINITION_ITEM 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

FIELD_NAME is a field name.

TYPE is a type.

OPERAND is an operator.

VAR : TYPE = OPERAND is expaneded to has FIELD_NAME : TYPE = OPERAND. FIELD_NAME is the same as the name of VAR, but $ is removed. VAR is declared at the top of this anon method and set to the value of its corresponding field.

VAR : TYPE is the same as above, but expaneded to has FIELD_NAME : TYPE = VAR.

ATTRIBUTE is a field attribute.

Compilation Errors:

Compilation errors caused by Field Definition 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";
    };
  }
}

Outmost Class

An outmost class is the outmost defined class. This is the same as the class defined by class definition.

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__;
    };
  }
}

Multi-Numeric Type Definition

A multi-numeric type is defined by class definition with the mulnum_t class attribute.

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.

CLASS_NAME must ends with a multi-numeric type suffix corresponding to the type of fields.

FIELD_LENGTH of multi-numeric type suffix must be the same as the length of fields.

TYPE_SUFFIX of multi-numeric type suffix 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;
}

Multi-Numeric Type Suffix

The multi-numeric type must end with the following suffix.

_(non-spaces)FIELD_LENGTH(non-spaces)TYPE_SUFFIX

FIELD_LENGTH is the length of fields.

TYPE_SUFFIX is a type suffix.

The List of Type Suffixes:

Numeric Types Type Suffixes
byte b
short s
int i
long l
float f
double d

Examples:

# Examples of the multi-numeric type suffix
_2f;
_2d;
_4f;
_4d;

Enumeration

Enumeration is a syntax that defines 32-bit integers that belongs to a class.

Enumeration Definition

The enum keyword defines an enumeration.

enum {
  ITEM1,
  ITEM2,
  ITEMn
}

, after the last enumeration item is allowed.

enum {
  ITEM1,
  ITEM2,
  ITEM3,
}

ITEM is one of

NAME
NAME = VALUE

NAME is a method name.

VALUE is an integer literal within int type. VALUE is converted the value of int type.

If VALUE of ITEM1 is omitted, it is set to 0.

If VALUE of ITEMn 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 method definition 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 "Inline Expansion of Method Call to Get an Enuemration Value".

Compilation Errors:

NAME must be a method name. Otherwise, a compilation error occurs.

VALUE must be an integer literal 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,
  }
}

Enumeration Attributes

The List of Enumeration Attributes:

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.

Compilation Errors:

One of private, protected and public must be specified. Otherwise, a compilation error occurs.

Class Variable

A class variable is a global variable that belongs to a class.

Class Variable Definition

our keyword defines a class variable.

our CLASS_VARIABLE_NAME : OPT_ATTRIBUTES TYPE;

CLASS_VARIABLE_NAME is a class variable name that does not contains ::.

TYPE is a type.

OPT_ATTRIBUTES is one of

EMPTY
ATTRIBUTES

EMPTY means nothing exists.

ATTRIBUTES is one of

ATTRIBUTES ATTRIBUTE
ATTRIBUTE

ATTRIBUTE is a class variable attribute.

Each class variable is initialized by its type initial value.

The value of a class variable is got by the operation of getting a class variable.

The value of a class variable is set by the operation of setting a class variable.

Compilation Errors:

CLASS_VARIABLE_NAME must a class variable name that does not contains ::. Otherwise, a compilation error occurs.

TYPE must be a numeric type or an object type.

ATTRIBUTE must be a class variable attribute. 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;
}

Class Variable Attributes

The List of Class Variable Attributes:

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.

Compilation Errors:

One of private, protected and public must be specified. Otherwise, a compilation error occurs.

One of ro, wo, and rw must be specified. Otherwise, a compilation error occurs.

Class Variable Getter Method

A class variable getter method is a method to perform the operation of getting a class variable.

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 $ is removed. For example, if the class variable name is $FOO, the method name is FOO.

Examples:

# Examples of class variable getter methods
class MyClass {
  our $NUM : ro int;
  
  static method main : void {
    my $num = Foo->NUM;
  }
}

Class Variable Setter Method

A class variable setter method is a method to perform the operation of setting a class variable.

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 $ is removed and SET_ is added to the beginning of it. For example, if the class variable name is $FOO, the method name is SET_FOO.

Examples:

# Examples of class variable setter methods
class MyClass {
  our $NUM : wo int;
  
  static method main : void {
    Foo->SET_NUM(3);
  }
}

Field

A field is a data member of a class.

Field Definition

The has keyword defines a field.

has FIELD_NAME : OPT_ATTRIBUTES TYPE;

FIELD_NAME is a field name.

TYPE is a type.

OPT_ATTRIBUTES is one of

EMPTY
ATTRIBUTES

EMPTY means nothing exists.

ATTRIBUTES is one of

ATTRIBUTES ATTRIBUTE
ATTRIBUTE

ATTRIBUTE is a field attribute.

Each field of an object is initialized by its type initial value when the object is created.

The value of a field is got by the operation of getting a field.

The value of a field is set by the operation of setting a field.

Compilation Errors:

FIELD_NAME must a field name. Otherwise, a compilation error occurs.

TYPE must be a numeric type or an object type.

ATTRIBUTE must be a field attribute. 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;
}

Field Attributes

The List of Field Attributes:

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.

Compilation Errors:

One of private, protected and public must be specified. Otherwise, a compilation error occurs.

One of ro, wo, and rw must be specified. Otherwise, a compilation error occurs.

Field Getter Method

A field getter method is a method to perform the operation of getting a field.

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 foo, the method name is foo.

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;
  }
}

Field Setter Method

A field setter method is a method to perform the operation of setting a field.

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 set_ is added to the beginning of it. For example, if the field name is foo, the method name is set_foo.

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);
  }
}

Method

Method Definition

The method keyword defines a method.

OPT_ATTRIBUTES method METHOD_NAME : RETURN_TYPE (OPT_ARG_ITEMS) { }
OPT_ATTRIBUTES method METHOD_NAME : RETURN_TYPE (OPT_ARG_ITEMS);

OPT_ATTRIBUTES is one of

EMPTY
ATTRIBUTES

EMPTY means nothing exists.

ATTRIBUTES is one of

ATTRIBUTES ATTRIBUTE
ATTRIBUTE

ATTRIBUTE is a method attribute.

METHOD_NAME is a method name.

RETURN_TYPE is a type.

OPT_ARG_ITEMS is one of

EMPTY
ARG_ITEMS

EMPTY means nothing exists.

ARG_ITEMS is one of

ARG_ITEMS , ARG_ITEM
ARG_ITEM

ARG_ITEM is one of

ARG_NAME : ARG_TYPE
ARG_NAME : ARG_TYPE = VALUE

ARG_NAME is a local variable name.

The local variable specified ARG_NAME is declared at the beginning of method implementation.

ARG_TYPE is a type.

VALUE is a literal or undef.

A method with the static method attribute is a class method.

A method without the static method attribute is an instance method.

An argument with VALUE is an optional arguments. If a method call dose not give a value to an optional argument, VALUE is given to the argument.

A interface method defined in an interface is an interface method.

A method with the native method attribute is a native method.

Compilation Errors:

The count of ARGS must be less than or equal to 255. Otherwise, a compilation error occurs.

ARG_TYPE must be a numeric type, a multi-numeric type, an object type, or a reference type. Otherwise, a compilation error occurs.

RETURN_TYPE must be void type, a numeric type, a multi-numeric type or an object type. Otherwise, a compilation error occurs.

Methods other than interface methods and native methods must have a method block. Otherwise, a compilation error occurs.

VALUE must satisfy assignment requirement to ARG_TYPE. Otherwise, a compilation error occurs.

METHOD_NAME must not be INIT. 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 () {
    
  }
}

Method Attributes

The List of Method Attributes:

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.

Compilation Errors:

One of private, protected and public must be specified. Otherwise, a compilation error occurs.

required 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);

Class Method

A method defined with the static method attribute is a class method.

A class method can be called by a class method call.

Instance Method

A method defined without the static method attribute is an instance method.

An instance method can be called by an instance method call.

Interface Method

An instance method defined in an interface 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 required method attribute that indicates classes must define a method with the same name that implements this interface method.

required method my_method : int ();

INIT Method

A INIT method is a method that is executed just after a program starts.

INIT Method Definition

A INIT block defines a INIT method to be executed just after the program starts. A INIT method is called only once.

INIT {
  
}

A INIT method has no arguments.

The return type of a INIT method is void type.

If a INIT method is not defined in a class, a INIT method without statements is defined.

If the current class has a parent class, INIT method of the parent class is called at the beginning of the INIT method of the current class.

And INIT methods of classes loaded by use statements 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 INIT methods is not guaranteed except that INIT methods are called explictly and except for the above explanation.

The INIT methods in default loaded class are called before INIT 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);
  }
}

Destructor

A destructor is a method called just before an object is destroyed.

method DESTROY : void () {

}

A destructor is an instance method.

The name of a destructor is DESTROY.

A destructor has no arguments.

The retrun type is void type.

An exception thrown in a destructor is converted to a warning message.

The warning message is printed to SPVM's standard error.

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 runtime stack 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 Garbage Collection about garbage collection.

Compilation Errors:

A destructor must be an instance method. Otherwise, a compilation error occurs.

The name of a destructor must be DESTROY. 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";
  }
}

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 interface method requirement to the parent method interpretted as an interface method.

Compilation Errors:

The overridding method in the child class must satisfy interface requirement to the parent method. Otherwise, a compilation error occurs.

Native Method

A method with the native method attribute is a native method.

native sum : int ($num1 : int, $num2 : int);

A native method has no method block.

The implementation of a native method is written by native languages such as the C language, C++.

See SPVM::Document::NativeClass about the way to write the implementation of a native method.

Precompilation Method

A method with the precompile method attribute 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 MyClass.so on Linux/Unix, MyClass.dll on Windows, MyClass.dylib 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 build directory such as ~/.spvm_build to compile and link them.

Bootstrap Method

A bootstrap method is a method where a program start.

void main : void () {
  
}

The method name is main.

The return type is void type.

It has no arguments.

Method Implementation

Normally a method has a method block. Statements 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.

Local Variable

A local variable is a variable that has a scope.

Local Variable Declaration

A my 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

LOCAL_VAR_NAME is a local variable name.

TYPE is a type.

If TYPE is ommited, TYPE is set to the type of VALUE. This is called type inference.

VALUE is an operator.

A local variable is declared in a scope block.

A local variable declaration performs the operation of pushing a local variable on the mortal stack.

A local variable declaration is a local variable access.

Compilation Errors:

LOCAL_VAR_NAME must be a local variable name. Otherwise a compilation error occurs.

TYPE must be a numeric type, an object type, multi-numeric type, or a reference type. Otherwise a compilation error occurs.

If TYPE 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) {

}

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;

Symbol Name Resolution

This section describes resolutions of symbol names, such as variable names, class names, field names, method names in the current method implementation.

Variable Name Resolution

A variable name resolves to a class variable access or a local variable access.

If :: is contained in a variable name, a class variable definition as the same name as VAR_NAME in CLASS_TYPE is searched.

CLASS_TYPE::VAR_NAME

If found, a variable name resloves to a class variable access.

If :: is not contained in a variable name, a local variable declaration as the same name as VAR_NAME is searched upwards from the posotion of VAR_NAME.

VAR_NAME

If found, a variable name resloves to a local variable access.

If not found, a class variable definition as the same name as VAR_NAME in outmost class is searched.

If found, a variable name resloves to a class variable access.

Compilation Errors:

VAR_NAME must be a valid variable name. Otherwise, a compilation error occurs.

The class specified by CLASS_TYPE must be loaded. Otherwise, a compilation error occurs.

The class variable relative name specified by VAR_NAME must be defined in the class specified by VAR_NAME. Otherwise, a compilation error occurs.

If it resolves to a class variable, outmost class must has the access control to VAR_NAME in the CLASS_TYPE. Otherwise, a compilation error occurs.

Field Access Resolution

The following syntax resolves to a field access.

INVOCANT->{FIELD_NAME}

The type of INVOCANT is a class type, a multi-numeric type, or a multi-numeric reference type.

FIELD_NAME is a field name.

A field specified by FIELD_NAME is searched in the type of INVOCANT.

If it is found and the type of INVOCANT is a class type, it resolves to a field access for class types.

If it is found and the type of INVOCANT is a multi-numeric type, it resolves to a field access for multi-numeric types.

If it is found and the type of INVOCANT is a multi-numeric reference type, it resolves to a field access for multi-numeric reference types.

Compilation Errors:

INVOCANT must be an object of a class type, a multi-numeric number of a multi-numeric type, a multi-numeric number referenced by a multi-numeric reference type. Otherwise, a compilation error occurs.

If the type of INVOCANT is a class type, the field specified by FIELD_NAME must be defined in the class, or its super classes. Otherwise, a compilation error occurs.

If the type of INVOCANT is a multi-numeric type, the field specified by FIELD_NAME must be defined in the multi-numeric type. Otherwise, a compilation error occurs.

If the type of INVOCANT is a multi-numeric reference type, the field specified by FIELD_NAME must be defined in the multi-numeric type referenced by the multi-numeric reference type. Otherwise, a compilation error occurs.

The outmost class must has the access control to FIELD_NAME in the type of INVOCANT. Otherwise, a compilation error occurs.

Method Call Resolution

A method call 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.

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)

CLASS_TYPE is a class type or a class alias name created by an alias statement.

& is converted to outmost class. This becomes CLASS_TYPE->.

METHOD_NAME is a method name.

OPT_ARGS is one of

EMPTY
ARGS

EMPTY means nothing exists.

ARGS is one of

ARGS , ARG
ARG

ARG is an operator.

If a method specified METHOD_NAME is searched in CLASS_TYPE.

If found, it resolves to a class method call.

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 ARG does not satisfy assignment requirement, a compilation error occurs.

If the length of ARGS is too many, a compilation error occurs.

If the length of ARGS is too few, a compilation error occurs.

The outmost class 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;
  }
}

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;
  }
}

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)

INVOCANT is an object of a class type or an interface type.

CLASS_TYPE is a class type, an interface type, or SUPER.

If SUPER is specified, a method specified by METHOD_NAME is searched in the super classes of the current class. If it is found and it is an instance method, SUPER is replaced to the class of the found method. This becomes CLASS_TYPE.

METHOD_NAME is a method name.

OPT_ARGS is one of

EMPTY
ARGS

EMPTY means nothing exists.

ARGS is one of

ARGS , ARG
ARG

ARG is an operator.

A method specified METHOD_NAME is searched in CLASS_TYPE.

If found, it resolves to a static instance method call.

The return type is the type of the found method.

Compilation Errors:

CLASS_TYPE must be a class type, an interface type, or SUPER. Ohterwise a compilation error occurs.

The type of INVOCANT must satisfies assignment requirement to CLASS_TYPE. Ohterwise a compilation error occurs.

If SUPER 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 ARG does not satisfy assignment requirement, a compilation error occurs.

If the length of ARGS is too many, a compilation error occurs.

If the length of ARGS is too few, a compilation error occurs.

The outmost class 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;

Instance Method Call Resolution

An instance method call calls an instance method.

INVOCANT->METHOD_NAME
INVOCANT->METHOD_NAME(OPT_ARGS)

INVOCANT is an object of a class type or an interface type.

METHOD_NAME is a method name.

OPT_ARGS is one of

EMPTY
ARGS

EMPTY means nothing exists.

ARGS is one of

ARGS , ARG
ARG

ARG is an operator.

If the type of INVOCANT is a class type, a method specified METHOD_NAME is searched in the class and its super classes.

If found, it resolves to an instance method call.

If the type of INVOCANT is an interface type, a method specified METHOD_NAME is searched in the interface.

If found, it resolves to an instance method call.

The return type is the type of the found method.

Compilation Errors:

The type of INVOCANT must be a class type or an interface type.

If the method specified by METHOD_NAME is not found, a compilation error occurs.

If the found method is a class method, a compilation error occurs.

If the type of ARG does not satisfy assignment requirement, a compilation error occurs.

If the length of ARGS is too many, a compilation error occurs.

If the length of ARGS is too few, a compilation error occurs.

The outmost class 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;

Block

A block is the part enclosed by { and }.

Class Block

A class block is a block used in a class definition.

class MyClass {

}

Enumeration Block

An enumeration block is a block used in an enumeration definition.

enum {
  ONE,
  TWO,
}

Scope Block

A scope block is a block that has its scope.

Zero or more statements are written in a scope block.

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 key-value array initialization.

Method Block

A method block is a scope block.

static method foo : int () {

}

INIT block

An INIT block is a scope block.

INIT {
  
}

eval Block

An eval block is a scope block.

eval {

}

if Block

An if block is a scope block.

if (CONDITION) {

}

elsif Block

An elsif block is a scope block.

elsif (CONDITION) {

}

else Block

An else block is a scope block.

else {

}

for Block

A for block is a scope block.

for (my $i = 0; $i < 3; $i++) {

}

while Block

A while block is a scope block.

while (CONDITION) {

}

switch Block

A switch block is a scope block.

switch (CONDITION) {

}

case Block

A case block is a scope block.

case CASE_VALUE1: {
  # ...
}

default Block

A default block is a scope block.

default: {
  # ...
}

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

TYPE is a type.

TYPE is a type used in field definition, class variable definition, local variable declaration, and the return value and the types of arguments of method definition.

TYPE_COMMENT is a type.

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.

See Also

Copyright & License

Copyright (c) 2023 Yuki Kimoto

MIT License