Raku (язык программирования)

редактировать
Язык программирования, производный от Perl
Raku
Камелия. svg Camelia, талисман Raku
Paradigm Многопарадигма
СемействоPerl
Разработано Ларри Уоллом
разработчиком Сообщество Raku
Впервые появилось25 декабря 2015 г.; 4 года назад (25.12.2015)
Стабильный выпуск 2020.09 / 16 сентября 2020 г.; 36 дней назад (2020-09-16)
Дисциплина набора текста Динамический, постепенный
OS Кросс-платформенный
Лицензия Стандартная общественная лицензия GNU или Лицензия Artistic 2
Расширения имен файлов .p6,.pm6,.pod6,.t6,.raku,.rakumod,.rakudoc,.rakutest
Веб-сайтraku.org
Основные реализации
Rakudo
Под влиянием
Perl, Ruby, Smalltalk, Haskell, JavaScript
подверженный влиянию
Perl, Haskell, AntLang

Raku является членом Perl семейства языков программирования. Ранее известный как Perl 6, он был переименован в октябре 2019 года. Raku вводит элементы многих современных и исторических языков. Совместимость с Perl не была целью, хотя режим совместимости является частью спецификации. Процесс разработки Raku начался в 2000 году.

Содержание
  • 1 История
    • 1.1 Начальные цели и последствия
    • 1.2 Mascot
  • 2 Реализации
    • 2.1 Исторические реализации
  • 3 Модульная система
  • 4 Основные изменения по сравнению с Perl
    • 4.1 Спецификация
    • 4.2 Система типов
    • 4.3 Формальные списки параметров подпрограммы
      • 4.3.1 Режимы передачи параметров
      • 4.3.2 Блоки и замыкания
    • 4.4 Сигил инвариантность
    • 4.5 Объектно-ориентированное программирование
      • 4.5.1 Наследование, роли и классы
    • 4.6 Регулярные выражения
    • 4.7 Синтаксическое упрощение
    • 4.8 Связанные сравнения
    • 4.9 Ленивые вычисления
    • 4.10 Gather
    • 4.11 Соединения
    • 4.12 Макросы
    • 4.13 Идентификаторы
  • 5 Примеры
    • 5.1 Hello world
    • 5.2 Факториал
    • 5.3 Quicksort
    • 5.4 Ханойская башня
  • 6 Книги
    • 6.1 Книги, опубликованные до Perl 6 версии 1.0 (известные как версия 6.c)
    • 6.2 Книги, опубликованные после Perl 6 версии 1.0 (известные как версия 6.c)
    • 6.3 Книги, опубликованные под новым именем Raku
    • 6.4 Книги для публикации
  • 7 Ссылки
  • 8 Внешние ссылки
История

В Perl 6 мы решили, что лучше исправить язык, чем исправить пользователя.

— Ларри Уолл

Первым был процесс разработки Raku объявил 19 июля 2000 года, в четвертый день конференции Perl Conference того же года, Ларри Уолл в своем выступлении State of the Onion 2000. В то время первоочередной задачей было удалить с языка «исторические бородавки»; «легкие вещи должны оставаться легкими, сложные - упрощаться, а невозможные - усложняться»; общая очистка внутреннего дизайна и API. Процесс начался с серии запросов на комментарии или «RFC». Этот процесс был открыт для всех участников, и ни один аспект языка не оставался закрытым для изменения.

После завершения процесса RFC Уолл рассмотрел и классифицировал каждый запрос (было получено 361 запрос). Затем он начал процесс написания нескольких «Апокалипсисов», термин, который означает «раскрытие». Хотя первоначальной целью было написать по одному Апокалипсису для каждой главы программирования на Perl, стало очевидно, что по мере написания каждого Апокалипсиса предыдущие Апокалипсисы аннулировались более поздними изменениями. По этой причине был опубликован набор Обзоров, каждый из которых относился к содержанию Апокалипсиса, но с любыми последующими изменениями, отраженными в обновлениях. Сегодня спецификация Raku управляется с помощью набора «жареного» тестирования, в то время как Краткие описания хранятся в качестве исторической справки.

Есть также серия Экзегезов, написанных Дэмианом Конвеем, которые объясняют содержание каждого Апокалипсиса с точки зрения практического использования. Каждый экзегезис состоит из примеров кода, а также обсуждения использования и значения этих примеров.

Сегодня при разработке Raku используются три основных метода коммуникации. Первый - это #raku канал IRC на freenode. Второй - это набор списков рассылки на серверах The Perl Foundation на perl.org. Третий - это Git репозиторий исходного кода, размещенный по адресу https://github.com/raku.

Первоначальные цели и последствия

Основная цель В своей первоначальной речи Уолл предложил удалить исторические бородавки. К ним относятся путаница, связанная с использованием сигилы для контейнеров; неоднозначность между функциями select; синтаксическое влияние файловых дескрипторов. Было много других проблем, решение которых программисты Perl обсуждали в течение многих лет, и они были подробно рассмотрены Уоллом в его речи.

Следствием этих целей было то, что Perl 6 не имел обратной совместимости с существующей кодовой базой Perl. Это означало, что некоторый код, который был правильно интерпретирован компилятором Perl 5, не будет принят компилятором Perl 6. Поскольку обратная совместимость - общая цель при улучшении программного обеспечения, критические изменения в Perl 6 должны были быть указаны явно. Различие между Perl 5 и Perl 6 стало настолько большим, что в конечном итоге Perl 6 был переименован в Raku.

За прошедшие годы Раку претерпел несколько изменений в своем направлении. Введение концепций из Python и Ruby было ранним влиянием. Более того, поскольку Pugs - первый интерпретатор, способный запускать Raku - был написан на языке программирования Haskell, многие элементы функционального программирования были приняты на себя командой разработчиков Raku.

Талисман

Ларри Уолл и Камелия

талисманом языка является «Камелия, жук Раку». Ее имя - дань уважения талисману-верблюду, связанному с Perl, а ее форма, в традициях любящих каламбур сообщества Perl, представляет собой игру на «программной ошибке ». Спиральные узоры, встроенные в ее похожие на бабочки крылья, напоминают символы «P6», популярное прозвище Perl 6, а расположение глаз смещено от центра - это преднамеренный каламбур на «Стеноглазом».

Одна из целей за живым и красочным дизайном логотипа было призвано препятствовать женоненавистничеству в сообществе и дать возможность тем, кто придерживается «мужского убеждения», показать свою чувствительную сторону.

Реализации

Как В 2017 году только реализация Rakudo находится в активной разработке. Никакая реализация не будет обозначена как официальная реализация Raku; скорее, «Raku - это все, что проходит официальный набор тестов».

Rakudo Perl 6 нацелен на ряд виртуальных машин, таких как MoarVM, виртуальная машина Java и JavaScript. MoarVM - это виртуальная машина, созданная специально для Rakudo и NQP Compiler Toolchain. Между Raku и виртуальными машинами существует слой Not Quite Perl 6, или NQP, который реализует правила Raku для синтаксического анализа Raku, а также абстрактное синтаксическое дерево и специфичное для серверной части. генерация кода. Большие части Ракудо написаны на самом Раку или в его подмножестве NQP. Rakudo не является полностью реализацией на собственном хостинге, и на данный момент нет конкретных планов сделать Rakudo загрузочным компилятором.

Исторические реализации

Pugs были начальной реализацией Perl 6, написанной на Haskell. Мопсы были самой продвинутой реализацией Perl 6, но с середины 2007 года она в основном бездействовала (с обновлениями, сделанными только для отслеживания текущей версии GHC ). По состоянию на ноябрь 2014 года Pugs не поддерживался активно.

В 2007 году v6-MiniPerl6 («mp6») и его повторная реализация, v6-KindaPerl6 («kp6») были написаны как средство для начальной загрузки Perl- 6.0.0 STD, с использованием Perl 5. STD - это полная грамматика для Perl 6, написанная на Perl 6. Теоретически все, что способно анализировать STD и генерировать исполняемый код, является подходящей системой начальной загрузки для Perl 6. В настоящее время kp6 скомпилирован mp6 и может работать с несколькими бэкэндами. mp6 и kp6 не являются полноценными реализациями Perl 6 и предназначены только для реализации минимального набора функций, необходимого для начальной загрузки полного компилятора Perl 6.

Yapsi - это компилятор Perl 6 и среда выполнения, написанная на самом Perl 6. В результате для работы требуется существующий интерпретатор Perl 6, такой как один из выпусков Rakudo Star.

Niecza, еще одно крупное усилие по реализации Perl 6, сосредоточенное на оптимизации и исследованиях эффективного внедрения. Он нацелен на Common Language Infrastructure.

Module system

Спецификация Raku требует, чтобы модули были идентифицированы по имени, версии и полномочиям. Можно загрузить только определенную версию модуля или даже два модуля с одинаковым именем, которые различаются версией или полномочиями. Для удобства предоставляется псевдоним короткого имени.

CPAN, система распространения модулей Perl, еще не поддерживает модули Raku. Вместо этого используется система прототипов модулей.

Основные изменения по сравнению с Perl

Perl и Raku принципиально отличаются, хотя в целом целью было «сохранить Raku Perl», так что Raku явно «язык программирования Perl». Большинство изменений предназначены для нормализации языка, чтобы облегчить понимание как начинающими, так и опытными программистами, а также сделать «простые вещи проще, а сложные - более возможными».

Спецификация

Основное нетехническое различие между Perl и Raku состоит в том, что Raku начинался как спецификация. Это означает, что при необходимости Raku может быть повторно реализован, а также означает, что программистам не нужно читать исходный код, чтобы получить окончательные полномочия по любой данной функции. Официальная документация не считается авторитетной и описывает только неформально поведение реального интерпретатора Perl. Любые расхождения, обнаруженные между документацией и реализацией, могут привести к тому, что одна из них будет изменена, чтобы отразить другую, что является движущей силой постоянной разработки и совершенствования выпусков Perl.

Система типов

В Raku система динамических типов Perl была дополнена добавлением статических типов. Например:

my Int $ i = 0; моя Крыса $ r = 3,142; мой Str $ s = "Привет, мир";

Однако статическая типизация остается необязательной, поэтому программисты могут делать большинство вещей вообще без явной типизации:

my $ i = "25" + 10; # $ i is 35

Raku предлагает систему постепенного набора, в которой программист может выбрать использование статической типизации, динамической типизации или сочетания двух.

Формальные списки параметров подпрограммы

Perl определяет подпрограммы вообще без списков формальных параметров (хотя простой подсчет параметров и некоторая очень свободная проверка типов могут быть выполнены с использованием «прототипов» Perl). Переданные аргументы подпрограммы объединяются в элементы массива @_. Если элементы @_изменены, изменения отражаются в исходных данных.

Раку вводит в язык истинные формальные параметры. В Raku объявление подпрограммы выглядит следующим образом:

sub do_something (Str $ thing, Int $ other) {...}

Как и в Perl, формальные параметры (т.е. переменные в списке параметров) являются псевдонимы фактических параметров (передаваемые значения), но по умолчанию псевдонимами являются константа, поэтому их нельзя изменить. Они могут быть объявлены явно как псевдонимы чтения-записи для исходного значения или как копии с использованием директив is rwили is copyсоответственно, если программист потребует их локального изменения.

Режимы передачи параметров

Raku предоставляет три основных режима передачи параметров: позиционные параметры, именованные параметры и параметры slurpy.

Позиционные параметры - это типичный упорядоченный список параметров, который используется в большинстве языков программирования. Все параметры также можно передавать, используя их имена в неупорядоченном виде. Именованные параметры (обозначенные :перед именем параметра) могут быть переданы только путем указания его имени, т.е. он никогда не захватывает позиционный аргумент. Параметры Slurpy (обозначенные *перед именем параметра) - это инструмент Raku для создания вариативных функций. Slurpy-хэш будет фиксировать оставшиеся переданные по имени параметры, тогда как slurpy-массив фиксирует оставшиеся переданные по позициям параметры.

Вот пример использования всех трех режимов передачи параметров:

sub somefunction ($ a, $ b,: $ c,: $ d, * @ e) {...} некоторая функция (1, 2,: d (3), 4, 5, 6); # $ a = 1, $ b = 2, $ d = 3, @ e = (4,5,6)

Позиционные параметры, такие как использованные выше, необходимы всегда, если за ними не следует ?, чтобы указать, что они не являются обязательными. Именованные параметры по умолчанию необязательны, но могут быть отмечены как требуемые, добавив !после имени переменной. Параметры Slurpy всегда необязательны.

Блоки и замыкания

Параметры также можно передавать произвольным блокам, которые действуют как замыкания. Так называются, например, дляи , аитераторы цикла. В следующем примере просматривается список, по 3 элемента за раз, и передается в блок цикла как переменные $ a, $ b, $ c.

для @list ->$ a, $ b, $ c {...}

Это обычно называется «заостренным подгруппой» или «заостренным блоком», а стрелка ведет себя почти так же, как ключевое слово подгруппа, вводя анонимное закрытие ( или анонимная подпрограмма в терминологии Perl).

Инвариантность сигил

В Perl сигилы - знаки пунктуации, предшествующие имени переменной - изменяются в зависимости от того, как используется переменная :

# Perl-код my @array = ('a', 'b', 'c'); мой $ element = $ array [1]; # элемент $ равен 'b', мой @extract = @array [1, 2]; # @extract equals ('b', 'c') my $ element = @array [1]; # 'b' выводится с предупреждением (опция 5.10)

В Raku сигилы инвариантны, что означает, что они не меняются в зависимости от того, нужен ли массив или элемент массива:

# Код Раку мой @array = 'a', 'b', 'c'; мой $ element = @array [1]; # элемент $ равен 'b' my @extract = @array [1]; # @extract равно ('b') my @extract = @array [1, 2]; # @extract equals ('b', 'c')

Дисперсия в Perl основана на согласовании чисел в английском и многих других естественных языках:

"Это яблоко. "# $ a CORRECT "Эти яблоки." # @A CORRECT "Это третье яблоко." # $ A [3] CORRECT "Эти третье яблоко." # @A [ 3] НЕПРАВИЛЬНО

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

# Perl-код: получить список из листа хэша, содержащего хеши, содержащие массивы my @trans_verbs = @ {$ dictionary {'verb'} {'transitive'}};

Эта сложность не имеет эквивалента ни в обычном использовании естественного языка, ни в других языках программирования, и вызывает высокую когнитивную нагрузку при написании кода для управления сложными структурами данных. Это тот же код в Raku:

# Код Раку: получить список из листа хэша, содержащий хеши, содержащие массивы my @trans_verbs =% dictionary <>;

Объектно-ориентированное программирование

Perl поддерживает объектно-ориентированное программирование с помощью механизма, известного как благословение. Любая ссылка может стать объектом определенного класса. Благословенный объект может иметь методы, вызванные к нему с использованием «синтаксиса стрелок», который заставит Perl найти или «отправить» соответствующую подпрограмму по имени и вызвать ее с благословенной переменной в качестве первого аргумента.

Будучи чрезвычайно мощным, он делает излишне сложным наиболее распространенный случай объектной ориентации - struct -подобный объект с некоторым связанным кодом. Кроме того, поскольку Perl не может делать никаких предположений об используемой объектной модели, вызов методов нельзя оптимизировать очень хорошо.

Стремясь сделать «легкое - легким, а сложное - возможным», Раку сохраняет модель благословения и предлагает более надежную объектную модель для общих случаев. Например, класс для инкапсуляции декартовой точки может быть определен и использован следующим образом:

class Point is rw {has $.x; имеет $.y; расстояние метода (Point $ p) {sqrt (($! x - $ px) ** 2 + ($! y - $ py) ** 2)} расстояние метода до центра {self.distance: Point.new ( x =>0, y =>0)}} my $ point = Point.new (x =>1,2, y =>- 3,7); произнесите "Местоположение точки: (", $ point.x, ',', $ point.y, ')'; # ВЫВОД: расположение точки: (1.2, -3.7) # Изменение x и y (обратите внимание на методы "x" и "y", используемые как lvalue): $ point.x = 3; $ point.y = 4; произнесите "Местоположение точки: (", $ point.x, ',', $ point.y, ')'; # ВЫВОД: Расположение точки: (3, 4) my $ other-point = Point.new (x =>- 5, y =>10); $ point.distance ($ other-point); # =>Расстояние до центра 10 $; # =>5

Точка заменяет стрелку указанием на многие другие языки (например, C ++, Java, Python и т. Д.), Которые объединились вокруг точки в качестве синтаксиса для вызова метода.

В терминологии Раку, $.xназывается «атрибутом». В некоторых языках эти поля называются членами. Метод, используемый для доступа к атрибуту, называется «аксессором». Метод автоматического доступа - это метод, созданный автоматически и названный в честь имени атрибута, как в примере выше метод x. Эти функции доступа возвращают значение атрибута. Когда класс или отдельный атрибут объявляется с модификатором is rw(сокращение от «чтение / запись»), автоматическим средствам доступа может быть передано новое значение для установки атрибута, или оно может быть напрямую присвоено как lvalue (как в примере). Автоматические средства доступа могут быть заменены определяемыми пользователем методами, если программисту потребуется более богатый интерфейс для атрибута. К атрибутам можно получить доступ только непосредственно из определения класса с помощью синтаксиса $!независимо от того, как атрибуты объявлены. Весь другой доступ должен осуществляться через методы доступа.

Объектная система Raku вдохновила фреймворк Moose, который вводит многие функции ООП Raku в Perl.

Наследование, роли и классы

Наследование - это метод, с помощью которого объект или тип могут повторно использовать код или определения из существующих объектов или типов. Например, программисту может понадобиться стандартный тип, но с дополнительным атрибутом. Наследование на других языках, таких как Java, обеспечивается тем, что классы могут быть подклассами существующих классов.

Raku обеспечивает наследование через классы, похожие на классы на других языках, и роли.

Роли в Raku берут на себя функции интерфейсов в Java, миксинов в Ruby и черт в Smalltalk вариант Писк. Они очень похожи на классы, но обеспечивают более безопасный механизм композиции. Они используются для выполнения композиции при использовании с классами, а не для добавления к их цепочке наследования. Роли определяют номинальные типы; они предоставляют семантические имена для коллекций поведения и состояния. Фундаментальное различие между ролью и классом состоит в том, что классы могут быть созданы; роли не являются.

Хотя роли отличаются от классов, можно написать код Raku, который напрямую создает экземпляр роли или использует роль в качестве объекта типа, Raku автоматически создает класс с тем же именем, что и роль, что позволяет прозрачно использовать роль, как если бы она была классом.

По сути, роль - это набор (возможно, абстрактных) методов и атрибутов, которые могут быть добавлены к классу без использования наследования. Роль можно даже добавить к отдельному объекту; в этом случае Raku создаст анонимный подкласс, добавит роль в подкласс и изменит класс объекта на анонимный подкласс.

Например, Собака является млекопитающим, потому что собаки наследуют определенные характеристики от млекопитающих, такие как молочные железы и (через родителя млекопитающего, Позвоночное ) позвоночник. С другой стороны, собаки также могут иметь один из нескольких различных типов поведения, и это поведение может со временем меняться. Например, Собака может быть Домашним животным, Бродячим (брошенное домашнее животное приобретет поведение для выживания, не связанное с домашним животным) или Проводником для слепые (собак-поводырей дрессируют, поэтому они не начинают жизнь как собаки-поводыри). Однако это наборы дополнительных моделей поведения, которые можно добавить к собаке. Также можно описать это поведение таким образом, чтобы его можно было с пользой применить к другим животным, например, Кот может в равной степени быть домашним животным или бродячим. Следовательно, и собака, и кошка отличаются друг от друга, но оба остаются в более общей категории млекопитающих. Итак, Mammal - это класс, а Dog и Cat - классы, унаследованные от Mammal. Но поведение, связанное с Pet, Stray и Guide, - это роли, которые можно добавить в классы, или объекты, созданные из классов.

class Mammal is Vertebrate {...} class Dog is Mammal {...} role Pet {...} role Stray {...} role Guide {...}

Роли добавляются в класс или объект с ключевым словом does. Чтобы показать наследование от класса, существует другое ключевое слово -. Ключевые слова отражают различное значение двух функций: состав ролей дает классу поведение роли, но не указывает на то, что это действительно то же самое, что и роль.

class GuideDog is Dog does Guide {...} # Подкласс составляет роль my $ dog = new Dog; $ dog делает Гид; # Отдельный объект составляет роль

Хотя роли отличаются от классов, оба являются типами, поэтому роль может появиться в объявлении переменной там, где обычно помещается класс. Например, роль «Слепой» для человека может включать атрибут типа «Проводник»; этот атрибут может содержать собаку-поводыря, лошадь-поводырь, человека-поводыря или даже машину-поводырь.

class Human {имеет Dog $ dog; # Может содержать любую собаку, независимо от того, выполняет она... # роль проводника или нет} роль Слепой {имеет проводника $ guide; # Может содержать любой объект, выполняющий роль проводника,... # будь то собака или что-то еще}

Регулярные выражения

Perl регулярное выражение и поддержка обработки строк имеет всегда была одной из его определяющих черт. Поскольку конструкции Perl для сопоставления с образцом в течение некоторого времени превосходили возможности выражений регулярного языка, документация Raku будет называть их исключительно регулярными выражениями, отделяя термин от формального определения.

Raku предоставляет расширенный набор функций Perl по отношению к регулярным выражениям, сворачивая их в более крупную структуру под названием «rules », которая обеспечивает возможности контекстно-зависимых синтаксического анализа формализмов (таких как синтаксические предикаты из синтаксического анализа грамматик выражений и ANTLR ), а также действия в качестве замыкания относительно их лексической области. Правила вводятся с помощью ключевого слова rule, использование которого очень похоже на определение подпрограммы. Анонимные правила также могут быть введены с помощью ключевого слова regex(или rx), или их можно просто использовать встроенными, как регулярные выражения в Perl, через m(соответствие) или s(замещающие) операторы.

В «Апокалипсисе 5» Ларри Уолл перечислил 20 проблем с «текущей культурой регулярных выражений». Среди них было то, что регулярные выражения Perl были «слишком компактными и« симпатичными »», «слишком сильно полагались на слишком мало метасимволов», «слабо поддерживали именованные захваты», «слабо поддерживали грамматики» и «плохо интегрировались с« реальным » language ".

Синтаксическое упрощение

Некоторые конструкции Perl были изменены в Raku, оптимизированы для различных синтаксических подсказок для наиболее распространенных случаев. Например, круглые скобки (круглые скобки ), необходимые в конструкциях потока управления в Perl, теперь необязательны:

if is_true () {для @array {...}}

Кроме того, оператор ,(запятая) теперь является конструктором списка, поэтому заключительные скобки вокруг списков больше не требуются. Код

@array = 1, 2, 3, 4;

теперь превращает @arrayв массив с элементами «1», «2», «3» и «4».

Цепные сравнения

Raku разрешает сравнения «по цепочке». То есть разрешена такая последовательность сравнений, как следующая:

if 20 <= $temperature <= 25 { say "Room temperature is between 20 and 25!" }

Это обрабатывается так, как если бы каждое сравнение слева направо выполнялось само по себе, и результат логически объединяется с помощью иоперации.

Ленивое вычисление

Raku использует технику отложенного вычисления списков, которая была особенностью некоторых языков функционального программирования, таких как Haskell :

@integers = 0..Inf; # целые числа от 0 до бесконечности

Приведенный выше код не приведет к сбою при попытке назначить список бесконечного размера массиву @integers, а также не будет зависать бесконечно при попытке расширить список, если ограниченный количество слотов ищется.

Это упрощает многие общие задачи в Raku, включая операции ввода / вывода, преобразования списков и передачу параметров.

Gather

С ленивым вычислением связано построение ленивых списков с использованием gatherи take, которые ведут себя как генераторы в таких языках, как Значок или Python.

my $ squares = lazy gather for 0..Inf {take $ _ * $ _; };

$ squaresбудет бесконечным списком квадратных чисел, но ленивое вычисление gatherгарантирует, что элементы вычисляются только при доступе к ним.

Соединения

Раку вводит концепцию соединений: значений, которые являются составными частями других значений. В своей простейшей форме соединения создаются путем объединения набора значений с помощью операторов перехода :

# Пример для | ("любой") Перекресток: мой $ color = 'white'; если только $ color eq 'white' | «черный» | «серый» | 'серый' {die "Цветная печать не поддерживается \ n"; } # Пример для соединения ("all"): my $ password = 'secret! 123'; если $ password ~~ / <:alpha>/ / <:digit>/ / <:punct>/ {скажет: «Ваш пароль достаточно безопасен»; }

|указывает значение, равное его левому или правому аргументу. указывает значение, равное его левому и правому аргументу. Эти значения могут использоваться в любом коде, который использует нормальное значение. Операции, выполняемые на стыке, действуют на все его элементы одинаково и объединяются в соответствии с оператором стыка. Итак, ("яблоко" | "банан") ~ "s"даст "яблоки" | "бананы". В сравнениях соединения возвращают единственный истинный или ложный результат для сравнения. «любые» соединения возвращают истину, если сравнение истинно для любого из элементов соединения. «все» соединения возвращают истину, если сравнение истинно для всех элементов соединения.

Соединения также могут использоваться для более богатого расширения системы типов путем введения стиля универсального программирования, который ограничен соединениями типов:

подмножество Color of Any, где RGB_Color | CMYK_Color; sub get_tint (Color $ color, Num $ opacity) {...}

Макросы

В языках низкого уровня концепция макросов стала синонимом текстовой подстановки источника -код из-за широкого использования препроцессора C. Однако языки высокого уровня, такие как Lisp, предшествовали C в использовании гораздо более мощных макросов. Raku воспользуется преимуществом именно этой концепции макросов, подобных Lisp. Мощь этого вида макроса проистекает из того факта, что он работает с программой как высокоуровневая структура данных , а не как простой текст, и имеет в своем распоряжении все возможности языка программирования.

Определение макроса Raku будет выглядеть как определение подпрограммы или метода и может работать с неанализируемыми строками, AST, представляющим предварительно проанализированный код, или их комбинацией. Определение макроса будет выглядеть так:

macro hello ($ what) {quasi {say "Hello {{{{$ what}}}}"}; }

В этом конкретном примере макрос не более сложен, чем текстовая подстановка в стиле C, но поскольку синтаксический анализ параметра макроса происходит до того, как макрос воздействует на вызывающий код, диагностические сообщения были бы гораздо более информативными. Однако, поскольку тело макроса выполняется во время времени компиляции каждый раз, когда оно используется, могут применяться многие методы оптимизации. Можно даже полностью исключить сложные вычисления из результирующих программ, выполнив работу во время компиляции.

Идентификаторы

В Perl имена идентификаторов могут использовать буквенно-цифровые символы ASCII и символы подчеркивания, также доступные на других языках. В Raku буквенно-цифровые символы могут включать большинство символов Unicode. Кроме того, можно использовать дефисы и апострофы (с некоторыми ограничениями, например, без цифры). Использование дефисов вместо подчеркиваний для разделения слов в имени приводит к стилю именования, называемому «kebab case ».

Примеры

Hello world

Программа hello world - это обычная программа, используемая для знакомства с языком. В Raku hello world:

сказать "Hello, world";

- хотя есть несколько способов сделать это.

Factorial

Функция factorial в Raku, определенная несколькими разными способами:

# Использование рекурсии (с конструкцией ʻif \ else`) sub fact (UInt $ n ->UInt) {if $ n == 0 {1} else {$ n * fact ($ n-1)}} # Использование рекурсии ( с ʻif` в качестве модификатора утверждения) sub fact (UInt $ n ->UInt) {возвращает 1, если $ n == 0; вернуть $ n * факт ($ n-1); } # Использование рекурсии (с конструкцией `when`) sub fact (UInt $ n ->UInt) {when $ n == 0 {1} default {$ n * fact ($ n-1)}} # Использование троичного оператор sub fact (UInt $ n ->UInt) {$ n == 0 ?? 1 !! $ n * fact ($ n-1)} # Использование множественной отправки multi fact (0) {1} multi fact (UInt $ n ->UInt) {$ n * fact ($ n - 1)} # Использование редукции metaoperator multi fact (UInt $ n ->UInt) {[*] 1.. $ n} # Создание факториального оператора и использование суб-постфикса метаоператора редукции: (UInt $ n ->UInt) {[* ] 1.. $ n} # Использование декларатора `state` для создания мемоизированного факториального субфакта (UInt $ n ->UInt) {state% known = 0 =>1; вернуть% known {$ n}, если% known {$ n}: существует; % известное {$ n} = $ n * факт ($ n-1); вернуть% known {$ n}; }

Quicksort

Quicksort - хорошо известный алгоритм сортировки. Работающую реализацию, использующую парадигму функционального программирования, можно кратко записать на Raku:

# Пустой список сортируется в пустой список multi quicksort () {()} # В противном случае извлеките первый элемент как сводный... multi quicksort ([$ pivot, * @ rest]) {# Раздел. мой @before = @ rest.grep (* перед $ pivot); мой @after = @ rest.grep (* после $ pivot); # Сортировать разделы. flat (quicksort (@before), $ pivot, quicksort (@after))}

Ханойская башня

Ханойская башня часто используется для введения рекурсивного программирования в информатику. В этой реализации используется механизм мульти-диспетчеризации Raku и параметрические ограничения:

multi sub hanoi (0, $, $, $) {} # Нет диска, поэтому не делайте ничего multi sub hanoi ($ n, $ a = 'A ', $ b =' B ', $ c =' C ') {# Начните с $ n дисков и трех колышков A, B, C hanoi $ n - 1, $ a, $ c, $ b; # сначала переместите верхний $ n - 1 диск из A в B, скажите: «Переместите диск $ n из peg $ a в peg $ c»; # затем переместить последний диск из A в C hanoi $ n - 1, $ b, $ a, $ c; # наконец переместите диск $ n - 1 с B на C}
Книги

В истории Raku было две волны написания книг. Первая волна последовала за первым анонсом Perl 6 в 2000 году. Эти книги отражают состояние дизайна языка того времени и содержат в основном устаревшие материалы. Вторая волна, последовавшая за анонсом версии 1.0 в 2015 году, включает несколько книг, которые уже были опубликованы, и некоторые другие, которые находятся в процессе написания.

Книги, опубликованные до Perl 6 версии 1.0 (известной как версия 6.c)

Кроме того, в 2009 году была опубликована книга, посвященная одной из первых виртуальных машин Perl 6, Parrot.

Книги, опубликованные после Perl 6 версии 1.0 (известной как версия 6.c)

Книги, изданные под новым именем Raku

Книги для публикации

Есть несколько отчетов от разных авторов о новых книгах, которые будут опубликованы в ближайшее время, и все они основаны на текущей версии 1.0 (известной как версия 6.c) Perl 6.

Ссылки
Внешние ссылки
В Викиучебниках есть книга по темам: Программирование на Perl 6

.

Последняя правка сделана 2021-06-03 07:16:57
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте