C言語に Perl6 を埋め込んで FizzBuzz。
#include <moar.h>
#include <stdio.h>
#define NQP_LIB_DIR PREFIX "/share/nqp/lib"
#define PL6_LIB_DIR PREFIX "/share/perl6/lib"
#define PL6_RUN_DIR PREFIX "/share/perl6/runtime"
int
main(int argc, char* argv[]) {
char *vm_args[] = {
"-e",
"use v6;\n"
"say (<Fizz>[$_%3]||'')~(<Buzz>[$_%5]||'')||$_ for 1..100;\n"
};
const char *lib_path[] = { NQP_LIB_DIR, PL6_LIB_DIR, PL6_RUN_DIR };
const char *filename = PL6_RUN_DIR "/perl6.moarvm";
MVMInstance *instance = MVM_vm_create_instance();
instance->num_clargs = 2;
instance->raw_clargs = vm_args;
instance->exec_name = "FizzBuzz";
instance->prog_name = filename;
memcpy(instance->lib_path, lib_path, sizeof(lib_path));
MVM_vm_run_file(instance, filename);
MVM_vm_exit(instance);
return 0;
}
Perl5 のやり方と大して変わらないが、やってる事は MoarVM のインスタンスを起動して Perl6 の VM イメージを食わし、VM 起動引数として -e
とプログラムを渡す。ビルドには perl6.morevm へのパスが必要になる為、pkg-config でトリックを使う。以下 Makefile。
PREFIX=$(shell pkg-config --variable=prefix moar)
fizzbuzz : fizzbuzz.c
gcc -o fizzbuzz `pkg-config --cflags moar` \
-DPREFIX=\"$(PREFIX)\" \
fizzbuzz.c \
`pkg-config --libs moar`
これといって何が出来るという訳ではない。