Как создать modulino в Perl6?

Я хочу сделать modulino (файл, который может работать как модуль или script) в Perl6.

Следующий код "обрабатывает" имена файлов из командной строки:

sub MAIN ( *@filenames )
{
    for @filenames -> $filename
    {
        say "Processing $filename";
    }
}

Сохранение этого как main.pm6 Я могу запустить его, и он работает:

perl6 main.pm6 hello.txt world.txt
Processing 'hello.txt'
Processing 'world.txt'

Итак, я хочу, чтобы это был модуль, чтобы я мог добавлять функции и упрощать тестирование. Однако, когда я добавляю к нему объявление module, он больше ничего не выводит:

module main;
sub MAIN ( *@filenames )
{
    for @filenames -> $filename
    {
        say "Processing '$filename'";
    }
}

В результате ничего не получается:

perl6 main.pm6 hello.txt world.txt

Итак, как я могу построить modulino в Perl6?

Я использую Perl6, работающий на MoarVM из выпуска Rakudo Star в январе 2015 года.

UPDATE:

Когда я пытаюсь обернуть модуль в фигурные скобки:

module main
{
    sub process (@filenames) is export
    {
        for @filenames -> $filename
        {
            say "Processing '$filename'";
        }
    }
};

sub MAIN ( *@filenames )
{
    process(@filenames)
}

Я также получаю ошибки:

===SORRY!=== Error while compiling main.pm6
Undeclared routine:
    process used at line 14. Did you mean 'proceed'?

Ответ 1

Подстройка MAIN должна быть объявлена ​​вне модуля, но она все равно должна иметь возможность видеть process.

Существует несколько способов достижения этого, например, не объявляя модуль вообще

sub process(@filenames) {
    for @filenames -> $filename {
        say "Processing '$filename'";
    }
}

sub MAIN(*@filenames) {
    process(@filenames);
}

сделав process наш охват и называя его своим длинным именем

module main {
    our sub process(@filenames) {
        for @filenames -> $filename {
            say "Processing '$filename'";
        }
    }
}

sub MAIN(*@filenames) {
    main::process(@filenames);
}

или экспортируя process и импортируя его в тело MAIN

module main {
    sub process(@filenames) is export {
        for @filenames -> $filename {
            say "Processing '$filename'";
        }
    }
}

sub MAIN(*@filenames) {
    import main;
    process(@filenames);
}

На мой взгляд, наиболее подходящим вариантом является добавить MAIN в модуль и импортировать его в основную сеть script. Таким образом, все, что объявлено в модуле, видимо в пределах MAIN без явного экспорта всего:

module main {
    sub process(@filenames) {
        for @filenames -> $filename {
            say "Processing '$filename'";
        }
    }

    sub MAIN(*@filenames) is export(:MAIN) {
        process(@filenames);
    }
}

import main :MAIN;

Обратите внимание, что это не экспортирует MAIN по умолчанию, то есть пользователи вашего модуля получат его только в том случае, если они содержат тег :MAIN.