2015/10/14

Recent entries from same category

  1. Perl6 の無限リストとダイナミックバインディングが最強すぎる
  2. Perl6 の grammar で俺言語「しょぼいスクリプト」を作った。
  3. Perl6 の CPAN Author になりました。
  4. Perl6 で俺俺 Gyazo 作った。
  5. Perl6 の Panda でインストールがちゃんと出来なくなった場合の修正方法。

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`

これといって何が出来るという訳ではない。

Posted at by | Edit