FAQ: наиболее часто задаваемые вопросы о Perl 6
Общие вопросы
Правильнее будет сказать, что Rakudo — это реализация Perl 6. На данный момент это самая полная версия реализации, но существуют и другие, а в будущем их может стать ещё больше. Perl 6 — это определение языка. В настоящее время можно использовать термины «Rakudo» и «Perl 6» как синонимы.
Да, официальная версия Rakudo 2015.12 была выпущена 25 декабря 2015 года.
Нет, первая официальная версия Perl 6 была v6.c (от Рождества Христова). Последующие версии были с точечными (например, v6.3.2) или большими (v6.d) номерами.
Чтобы узнать версию компилятора, выполните команду perl6 -v
. Вы получите ответ, например: «This is Rakudo version 2017.07 built on MoarVM version 2017.07 implementing Perl 6.c».
Есть надежда на выпуск в течение нескольких следующих месяцев. Более подробную информацию можно найти на странице Lhttps://github.com/perl6/6.d-prep.
Фактически, поддержка многих новых функций 6.d уже реализована в 6.c с помощью прагмы use v6.d.PREVIEW L<pragma|https://docs.perl6.org/language/pragmas>.
На Mac вы можете установить Rakudo Star с помощью пакета DMG. Загрузите его с сайта: http://rakudo.org/downloads/star.
Пользователи Windows могут установить Rakudo Star через MSI. Вам необходимо заранее установить Windows Git и Strawberry Perl5, а затем использовать zef для установки модулей Perl 6.
Linux-пользователи могут напрямую загрузить Rakudo Star Lhttp://www.perl6.org/downloads/, а затем скомпилировать и установить. Пользователи Linux и Mac также могут устанавливать Rakudo через дистрибутивы или сторонние двоичные пакеты, хотя версии из дистрибутивов могут быть немного устаревшими. Мы рекомендуем избегать использования версий Rakudo до 2015.12 (не официальных).
Мы также предоставляем образы Docker для Rakudo Star, доступные по адресу https://hub.docker.com/_/rakudo-star/.
Самый простой способ — клонировать репозиторий L (https://github.com/rakudo/rakudo) и скомпилировать его.
Некоторые люди также выбирают L (https://github.com/tadzik/rakudobrew), который позволяет нам устанавливать несколько версий rakudo и выбирать ту, которая нам нравится.
Пожалуйста, сначала ознакомьтесь с документацией L<rakudobrew|https://github.com/tadzik/rakudobrew#making-new-scripts-available>. Этот инструмент похож на perlbrew для Perl 5 или аналогичные инструменты для Python, Ruby и других языков.
Независимо от выбранного метода вам потребуется установить zef и p6doc из экосистемы.
Ознакомьтесь с официальной документацией (особенно с разделом «Language») на сайте https://docs.perl6.org/. Также посетите страницу ресурсов https://perl6.org/resources/.
Для справки мы составили таблицу ресурсов L (https://raw.githubusercontent.com/rakudo/star/master/docs/cheatsheet.txt). При использовании сторонних документов обратите внимание на дату публикации — документация, выпущенная до официального выпуска Perl 6 в 2015 году, может быть устаревшей.
Вы можете обратиться за помощью в онлайн-канал Perl 6 L (https://webchat.freenode.net/?channels=#perl6) или поискать записи чата через Google L (https://www.google.com/search?q=site:irclog.perlgeek.de+inurl:perl6).
Да, у нас есть p6doc, доступный в одноимённом теге в экосистеме. Он выпускается вместе с Rakudo Star, но вам нужно получать его через ежемесячные выпуски.
Спецификация Perl 6 относится к официальному набору тестов Perl 6, который мы называем L (https://github.com/perl6/roast) и размещаем на GitHub. Любой компилятор, прошедший тесты, добавляется в спецификацию Perl 6.
Основная ветка roast соответствует текущей разрабатываемой версии, но она ещё не включена в спецификацию. Другие ветки соответствуют различным версиям specific, таким как «6.c.errata». Версия 6.c-errata — это ветка, содержащая только исправления ошибок (errata) в уже выпущенной версии 6.c, а master — это невыпущенная версия. По мере продвижения работы формируется следующая версия. Текущее состояние не обязательно является характеристикой следующей версии, и некоторые новые функции могут пройти проверку перед включением в следующий выпуск.
Да, он доступен по ссылке L (#language-glossary).
В разделе «Language» документации L<language|docs.perl6.org> есть несколько руководств «5to6-». Наиболее важным из них является L<5to6-nutshell guide> (https://docs.perl6.org/language/5to6-nutshell).
Ознакомьтесь с руководством L (https://docs.perl6.org/language/rb-nutshell).
Модули
Да, как и у Perl 5, у Perl 6 есть свой CPAN. Единственное отличие заключается в том, что при обновлении модуля через PAUSE вы должны выбрать Perl 6 в качестве целевого каталога. Инструмент LApp::Mi6 (https://modules.perl6.org/l/App::Mi6) упрощает этот процесс обновления. Последняя версия инструмента L для установки модулей автоматически проверяет наличие последних версий модулей на CPAN и в экосистеме на основе GitHub L (https://github.com/perl6/ecosystem/).
Через CPAN вы можете быстро перейти к модулям, посетив главную страницу L<modules.perl6.org>. (Временно вы можете просматривать модули через L (https://github.com/ugexe/Perl6-ecosystems/blob/master/cpan.json)).
Конечно, вы можете использовать большинство модулей Perl через LInline::Perl5 (https://github.com/niner/Inline-Perl5/). Это включает Catalyst и DBI.
L (docs.perl6.org/language/nativecall) делает это очень простым.
Это распространённая проблема при работе Nativecall на Debian-подобных системах Linux. Вам нужно установить пакет C и создать символическую ссылку на отсутствующий файл.
Их легко вызвать через Nativecall. Существует также модуль экосистемы L (https://github.com/cspencer/perl6-posix), который можно использовать.
Пакеты Rakudo Star включают множество полезных модулей L (https://github.com/rakudo/star/tree/master/modules). В то же время, Rakudo Compiler Release включает только некоторые из наиболее часто используемых базовых модулей L<basic modules|docs.perl6.org>, а дополнительные модули доступны в L (http://modules.perl6.org/). Есть ли подобный B::Deparse модуль?
Я могу использовать команду --target=optimize
для предварительного просмотра абстрактного синтаксического дерева (AST) в программе. Например:
perl6 --target=optimize -e 'say "hi"'
После статической оптимизации цель ast
присваивается AST, а цель optimize
обрабатывается перед AST.
Можно получить список всех доступных целей с помощью команды perl6 --stagestats -e ""
.
Что такое предварительная компиляция?
Когда вы впервые загружаете модуль, Rakudo компилирует его в байт-код и сохраняет на диске. При последующей загрузке этого модуля Rakudo сразу считывает скомпилированный байт-код, что экономит время компиляции и значительно повышает скорость выполнения.
Как я могу вывести данные Perl 6 (есть ли модуль наподобие Data::Dumper из Perl 5)?
Обычно используется процедура say
для вывода данных. Для объектов типа «gist» можно использовать метод gist
. Более подробную информацию можно получить с помощью метода perl
, который обычно возвращает код в стиле EVAL
.
Если вы используете реализацию Rakudo, то можете использовать нестандартную процедуру dd
для вывода, которая похожа на .perl
и содержит больше информации. Например:
my $foo = %( foo => 'bar' );
say $foo.perl; # вывод: «${:foo("bar")}»
say $foo; # вывод: «{foo => bar}»
# В реализации Rakudo можно использовать нестандартную процедуру dd
dd $foo; # вывод: «Hash $foo = ${:foo("bar")}»
Также в экосистеме Perl 6 есть несколько специализированных модулей, которые предоставляют более совершенный вывод данных, включая поддержку цветного вывода.
Как получить историю команд в командной строке Perl 6 (REPL)?
Установите модуль Linenoise.
Для операционных систем семейства Unix также существует другой способ — использование rlwrap. На Debian-подобных системах его можно установить с помощью следующей команды:
sudo apt-get install rlwrap
Почему Rakudo выдаёт эту ошибку при компиляции?
Если это ошибка времени компиляции, в противном случае это ошибка времени выполнения.
Например:
=begin code :skip-test
say 1/0; # попытка деления на ноль
sub foo( Int $a, Int $b ) {...}
foo(1) # ===ошибка!=== ошибка компиляции ...
=end code
Что такое (Any)
?
Any
— это самый верхний базовый класс, от которого наследуются большинство других классов. Объекты типа Any
являются значениями по умолчанию для переменных и параметров, когда не указано явное значение. Это означает, что когда вы присваиваете значение переменной без определённого типа, будет выведено (Any)
. Например, используя процедуру say
:
=begin code
my $foo;
say $foo; # вывод: «(Any)»
my Int $baz;
say $baz; # вывод: «(Int)»
my $bar = 70;
say $bar; # вывод: «70»
=end code
Чтобы проверить, имеет ли переменная определённое значение, используйте процедуры L и L. Есть и другие способы проверки определения структуры: <//>
, /
, andthen
, notandthen
и orelse
, а также операторы и смайлики ограничения типов.
Что означает so
?
so
— это оператор слабого приоритета, который принудительно преобразует значение в логическое. Он имеет ту же семантику, что и оператор ?
, похожий на and
и низкоприоритетный &&
.
Пример:
say so 1|2 == 2; # вывод: «True»
В этом примере сравнивается результат (объект Junction), который преобразуется в логическое значение.
В чём разница между :D
и :U
?
В Perl 6 классы и другие типы являются объектами, и их можно проверять только с использованием их собственных типов.
Например, если вы определяете переменную:
my Int $x = 42;
то вы можете присвоить ей значение целого числа (экземпляр класса Int), а также сам объект типа Int.
Если вам нужно исключить объекты типа, вы можете добавить модификатор :D
, который обозначает «определённый».
=begin code :skip-test
my Int:D $x = 42;
$x = Int; # исключение: присвоение значения типу Int является ошибкой проверки типа; ожидается Int:D, но присваивается Int
=end code
Аналогично, :U
ограничивает неопределёнными значениями, то есть объектами типа. Если вы ограничиваете значения, которые не могут быть ни объектами типа, ни экземплярами, вы можете использовать _
.
Какова роль модификатора -->
?
Модификатор -->
используется для ограничения возвращаемого значения типом или определённым значением.
Пример ограничения типом:
=begin code :skip-test
sub divide-to-int( Int $a, Int $b --> Int ) {
return ($a / $b).narrow;
}
divide-to-int(3, 2)
# возвращаемое значение не соответствует типу, ожидается Int, но возвращается Rat
=end code
Пример ограничения определённым значением:
sub discard-random-number( --> 42 ) { rand }
say discard-random-number;
# вывод: «42»
Здесь возвращаемое значение уже определено, поэтому окончательное значение игнорируется.
Как извлечь значение из Junction?
Если вы хотите извлечь значение из объекта Junction, возможно, вы делаете что-то неправильно, и вам нужен объект Set.
Junctions представляют собой соответствие, а не операции. Если вы настаиваете на этом, вы можете злоупотреблять автоматическим потоком:
sub eigenstates(Mu $j) {
my @states;
-> Any $s { @states.push: $s }.($j);
@states;
}
say eigenstates(1|2|3).join(', ');
# выводит 1, 2, 3 или перестановку.
Если Str неизменяем, как работают s///
и $i++
?
Во многих основных типах значений в Perl 6 значения являются неизменяемыми, но переменные, содержащие эти значения, изменяемы. Оператор s///
работает с переменной, создавая новый строковый объект. Аналогично, $i++
работает с переменной $i
, а не со значением.
Зная это, мы обычно не пытаемся изменить строку (например, 'hello' ~~ s/h/H/
), но можем случайно сделать это с помощью map
:
my @foo = <hello world>.map: { s/h/H/ } ; # исключение: "Cannot modify an immutable Str (hello)"
my @bar = <hello world>».subst-mutate: 'h', 'H'; # исключение: "Cannot resolve caller subst-mutate(Str: Str, Str); the following candidates match the type but require
Обратите внимание, что перевод может содержать неточности или ошибки, так как некоторые термины и конструкции языка программирования могут иметь разные названия и особенности в разных реализациях.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )