The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

use 5.008007;
package SPVM;
use strict;
use Carp 'cluck';
our $VERSION = "0.989022";
require XSLoader;
XSLoader::load('SPVM', $VERSION);
sub import {
my ($class, $module_name) = @_;
my ($file, $line) = (caller)[1, 2];
if (defined $module_name) {
SPVM::Global::build($module_name, $file, $line);
SPVM::Global::bind_to_perl($module_name);
}
}
sub api {
unless ($SPVM::Global::API) {
SPVM::Global::init_api();
}
return $SPVM::Global::API;
}
1;
=encoding utf8
=head1 Name
SPVM - SPVM Language
=head1 Description
SPVM is a statically typed programming language with the syntax of Perl.
SPVM has not yet reached a stable release of version 1.0. For now, L<backward compatibility|https://github.com/yuki-kimoto/SPVM/wiki/Backward-Compatibility> of methods and features will not be kept.
=head1 Usage
A class of SPVM:
# lib/SPVM/MyMath.spvm
class MyMath {
static method sum : int ($nums : int[]) {
my $total = 0;
for (my $i = 0; $i < @$nums; $i++) {
$total += $nums->[$i];
}
return $total;
}
}
Calling a SPVM method from Perl:
# sum.pl
use FindBin;
use lib "$FindBin::Bin/lib";
use SPVM 'MyMath';
# Call method
my $total = SPVM::MyMath->sum([3, 6, 8, 9]);
=head1 Documents
=over 2
=item * L<Tutorial|https://github.com/yuki-kimoto/SPVM/wiki/Tutorial> - SPVM Tutorial
=item * L<Language Specification|SPVM::Document::Language> - SPVM Language Specification
=item * L<Standard Modules|SPVM::Document::Modules> - SPVM Standard Modules
=item * L<ExchangeAPI|SPVM::ExchangeAPI> - Exchange APIs
=item * L<Native Module|SPVM::Document::NativeModule> - Native Module
=item * L<Native APIs|SPVM::Document::NativeAPI> - Native APIs
=item * L<Resource|SPVM::Document::Resource> - Resource
=item * L<spvmcc> - Creating Executable File
=item * L<spvmdist> - Creating SPVM Distribution
=item * L<Benchmark|https://github.com/yuki-kimoto/SPVM/wiki/Benchmark> - SPVM Performance Benchmarks
=back
=head1 use
use SPVM;
use SPVM 'SomeClass';
Loads the L<SPVM> module.
If a module name of SPVM is given as the first argument, the SPVM module is loaded and is bound to a Perl module.
The bound Perl module name is prefixed with C<SPVM::>.
Exceptions:
If the SPVM module cannot be loaded, an exception is thrown.
Examples:
use SPVM 'Int';
my $int_object = SPVM::Int->new(3);
my $value = $int_object->value.
=head1 Functions
=head2 api
my $api = SPVM::api();
Gets the global L<SPVM::ExchangeAPI> object for this Perl interpreter.
=head1 Environment Variables
If an environment variable is an empty string, it is treated as an undefined value.
=head2 SPVM_BUILD_DIR
A directory for files generated by the compiler and linker.
C source codes for precompilation, dynamic link libraries and object files are stored into this directory.
These files are output when attempting to build a module containing methods with the C<native> attribute or the C<precompile> attribute.
If these files are output and the directory given by the C<SPVM_BUILD_DIR> environment variable does not exist, an exception is thrown.
Examples:
# bash
export SPVM_BUILD_DIR=~/.spvm_build
# csh
setenv SPVM_BUILD_DIR ~/.spvm_build
=head2 SPVM_CC_DEBUG
If the C<SPVM_CC_DEBUG> environement variable is a true value of Perl, debug messages and messages from the L<SPVM native module|SPVM::Document::NativeModule> compiler and linker are printed to stderr.
=head2 SPVM_CC_QUIET
If the C<SPVM_CC_QUIET> environement variable is a true value of Perl, messages the L<SPVM native module|SPVM::Document::NativeModule> compiler and linker are not printed to stderr.
If it is defined and a false value of Perl, the messages are printed.
This setting has a higher priority than the L<quiet|SPVM::Builder::Config/"quiet"> field of the L<SPVM::Builder::Config> module.
=head2 SPVM_CC_FORCE
If the C<SPVM_CC_FORCE> environement variable is a true value of Perl, the compilation and link by the L<SPVM native module|SPVM::Document::NativeModule> compiler and linker are forced.
This setting has a higher priority than the L<force|SPVM::Builder::Config/"force"> field of the L<SPVM::Builder::Config> module.
=head1 Repository
=head1 Author
Yuki Kimoto E<lt>kimoto.yuki@gmail.comE<gt>
=head1 Core Developers
motiE<lt>motohiko.ave@gmail.comE<gt>
=head1 Contributors
=over 2
=item * Mohammad S Anwar
=item * akinomyoga
=item * NAGAYASU Shinya
=item * Reini Urban
=item * chromatic
=item * Kazutake Hiramatsu
=item * Yasuaki Omokawa
=item * Suman Khanal
=item * L<Ryunosuke Murakami|https://github.com/ryun0suke22>
=item * L<Yoshiyuki Itoh|https://github.com/YoshiyukiItoh>
=item * L<Tore Aursand|https://github.com/toreau>
=item * L<greengorcer|https://github.com/greengorcer>
=back
=head1 Copyright & License
Copyright (c) 2023 Yuki Kimoto
MIT License
=cut