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


Из Википедии, свободной энциклопедии
  (Перенаправлено с Perl 6 )
Перейти к навигации Перейти к поиску

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

История

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

—  Ларри Уолл [9]

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

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

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

Сегодня при разработке Раку используются три основных метода общения. Первый — это IRC-канал raku на Libera Chat . Второй -- набор списков рассылки на серверах The Perl Foundation по адресу perl.org . [17] Третий — репозиторий исходного кода 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. [ нужна ссылка ]

Талисман

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

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

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

Реализации

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

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

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

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

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

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

Niecza, еще одна крупная работа по внедрению Perl 6, была сосредоточена на исследованиях по оптимизации и эффективному внедрению. Он нацелен на общеязыковую инфраструктуру . [29]

Модульная система

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

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

Основные отличия от Perl

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

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

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

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

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

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

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

мой  $i = "25" + 10 ; # $i равно 35

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

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

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

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

sub  do_something ( Str  $ вещь , Int  $ другое ) { ...
}

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

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

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

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

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

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 параметры всегда необязательны.

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

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

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

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

Сигил-инвариантность

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

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

В Раку сигилы инвариантны, что означает, что они не меняются в зависимости от того, нужен ли массив или элемент массива: [32]

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

Вариантность в Perl вдохновлена ​​числовым соглашением в английском и многих других естественных языках:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

класс  млекопитающих  -  позвоночные { ...
}класс  Собака  - это  млекопитающее { ...
}роль  питомца { ...
}роль  Бродячий { ...
} Руководство по роли { ...
}

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

класс  GuideDog  - это  собака  , которая делает  поводыря { ...
} # Подкласс составляет рольмоя  $dog = новая  собака ;$  dog ведет ; # Отдельный объект составляет роль

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

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

Обычные выражения

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

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

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

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

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

если  верно () { для  @array { ... }
}

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

@массив = 1 , 2 , 3 , 4 ;

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

Сцепленные сравнения

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

if  20 <= $temperature <= 25 { say  "Температура в помещении между 20 и 25!"}

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

Ленивая оценка

Раку использует технику ленивых вычислений списков, которая характерна для некоторых языков функционального программирования , таких как Haskell : [44]

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

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

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

Собирать

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

мои  $squares = ленивый  сбор  для  0 .. Inf { take  $_ * $_ ;
};

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

Соединения

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

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

|указывает значение, равное либо его левому, либо правому аргументу. &указывает значение, равное как его левому, так и правому аргументам. Эти значения можно использовать в любом коде, который использует обычное значение. Операции, выполняемые над узлом, действуют на все члены узла одинаково и объединяются в соответствии с соединительным оператором. Итак, ("apple"|"banana") ~ "s"уступил бы "apples"|"bananas". В сравнениях соединения возвращают единственный истинный или ложный результат для сравнения. Соединения " any" возвращают true, если сравнение истинно для любого из элементов соединения. Соединения " all" возвращают true, если сравнение истинно для всех элементов соединения.

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

подмножество  Color  of  Any ,  где  RGB_Color | CMYK_цвет ;sub  get_tint ( цвет  $ цвет , число  $ непрозрачность ) { ...
}

Макросы

В низкоуровневых языках понятие макросов стало синонимом текстовой подстановки исходного кода из-за широкого использования препроцессора C. Однако языки высокого уровня, такие как Lisp , предшествовали C в использовании макросов, которые были гораздо более мощными. [45] Раку воспользуется концепцией макросов, подобной Лиспу. [33] Сила такого рода макросов заключается в том, что они работают с программой как с высокоуровневой структурой данных , а не как с простым текстом, и имеют в своем распоряжении все возможности языка программирования.

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

макрос  hello ( $what ) { квази { say  "Hello { {{{$what}}} }" };
}

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

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

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

Примеры

Привет мир

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

сказать  «Привет, мир» ;

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

Факториал

Факториальная функция в Раку, определенная несколькими способами:

# Использование рекурсии (с конструкцией `if\else`) sub  fact ( UInt  $n --> UInt ) { if  $n == 0 { 1 } else { $n * fact ( $n-1 ) }
}# Использование рекурсии (с `if` в качестве модификатора оператора) sub  fact ( UInt  $n --> UInt ) { return  1  if  $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 * факт ( $n-1 )
}# Использование множественной отправки multi  fact ( 0 ) { 1 } multi  fact ( UInt  $n --> UInt ) { $n * fact ( $n - 1 )
}# Использование подфакта метаоператора редукции (  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 ); вернуть %известный { $n };     }

Быстрая сортировка

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

# Пустой список сортируется по пустому списку multi  quicksort ([]) { () }# В противном случае извлеките первый элемент как сводную... multi  quicksort ([ $pivot , * @rest ]) { # Partition.  мой  @before = @rest . grep (* перед  $pivot ); мой  @after = @rest . grep (* после  $pivot ); # Сортируем разделы.  плоский ( быстрая сортировка ( @before ), $pivot , быстрая сортировка ( @после ))
}
  1. ^ Если реализация не делает что-то причудливое и загадочное за кулисами, максимально возможная глубина рекурсии равна длине списка, что делает эту реализацию непригодной для больших данных. Глубина рекурсии может быть ограниченаlog2(list_length)итерацией по большему из разделовbeforeи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  say  "Move disk $n from peg $a to peg $c"; # затем переместить последний диск из A в C  hanoi  $n - 1 , $b , $a , $c ; # наконец переместить $n - 1 дисков из B в C}

Книги

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

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

  • А. Рэндал, Д. Сугальский, Л. Тотч. Perl 6 и Parrot Essentials , 1-е издание, 2003 г., ISBN  978-0596004996
  • А. Рэндал, Д. Сугальский, Л. Тотч. Perl 6 и Parrot Essentials , второе издание, 2004 г. ISBN 978-0596007379 
  • С. Уолтерс. Perl 6 сейчас: основные идеи, проиллюстрированные Perl 5. 2004. ISBN 978-1590593950 

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

  • А. Рэндал, А. Уитворт. Руководство разработчика Parrot: Пир. 2009. ISBN 978-0977920129 . 

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

  • Андрей Шитов. Перл 6 с первого взгляда. 2017. ISBN 978-90-821568-3-6 — скачать официальный PDF -файл бесплатно или скачать с GitHub 
  • Лоран Розенфельд, Аллен Б. Дауни. Думайте о Perl 6 2017. ISBN 978-1-4919-8055-2 
  • Мориц Ленц. Основы Perl 6, 2017 г. ISBN 978-1-4842-2898-2 
  • Джей Джей Мерело. Обучение программированию на Perl 6: первые шаги: знакомство с программированием, не выходя из командной строки, 2017 г. ISBN 978-1521795781 
  • Андрей Шитов. Глубокое погружение в Perl 6 . 2017. ISBN 978-1-78728-204-9 . 
  • Андрей Шитов. Использование Perl6 . 2017. ISBN 978-90-821568-1-2 — скачать официальный PDF -файл бесплатно или скачать с GitHub 
  • Мориц Ленц. Поиск и анализ с помощью регулярных выражений Perl 6 2017. ISBN 978-1-4842-3228-6 
  • Брайан Д Фой . Изучение Perl 6 2018 ISBN 978-1491977682 

Книги, изданные под новым именем Раку

  • Андрей Шитов. Using Raku , 2-е издание, 2019 г., ISBN 978-90-821568-8-1 — скачать официальный PDF -файл бесплатно или скачать копию с GitHub 
  • Андрей Шитов. Raku One-Liners , 2019, ISBN 978-90-821568-9-8 — скачать официальный PDF бесплатно или скачать с GitHub 

Книги, которые будут опубликованы

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

  • Андрей Шитов. Переход на Perl 6. Простой переход с Perl 5 . ISBN 978-90-821568-5-0 . Наверное, никогда не будет опубликовано. 
  • Габор Сабо. Разработка веб-приложений на Perl 6 .

использованная литература

  1. ^ a b Джексон, Иоав (23 июля 2010 г.). «Создатель Perl намекает на скорый выпуск долгожданного Perl 6» . Служба новостей IDG . Проверено 8 февраля 2015 г.
  2. ^ http://blogs.perl.org/users/zoffix_znet/2018/11/announce-raku-perl-6-diwali-6d-language-specification-release.html
  3. Викискладе есть медиафайлы по теме модулей .
  4. ^ «Глоссарий терминов и жаргона» . Основа Perl Perl 6 Вики . Фонд Перла . 28 февраля 2011 года. Архивировано из оригинала 21 января 2012 года . Проверено 8 февраля 2015 г.
  5. ↑ b唐鳳, она же Одри Тан (21 апреля 2010 г.). «Как внедрить Perl 6 в 2010 году» .
  6. ^ «О Perl» . perl.org . Проверено 11 июня 2020 г. . «Perl» — это семейство языков, «Raku» (ранее известный как «Perl 6») — часть семейства, но это отдельный язык, у которого есть собственная команда разработчиков. Его существование не оказывает существенного влияния на дальнейшее развитие Perl.
  7. ^ "Perl 6 переименован в Раку" . LWN.net . 15 октября 2019 г. . Проверено 16 октября 2019 г.
  8. ^ «Ответ TPF на переименование Раку» . 29 октября 2019 г.
  9. ^ Бьянкуцци, Федерико; Уорден, Шейн (2009). Вдохновители программирования: беседы с создателями основных языков программирования . ISBN 978-0596515171.
  10. Клайн, Джо (21 августа 2000 г.). «Отчет с Perl-конференции» .
  11. ^ Уолл, Ларри (2000). "Состояние лука 2000" . Сеть О'Райли.
  12. ^ Фонд Perl (2000). «О Perl 6 RFC» .
  13. Уолл, Ларри (2 апреля 2001 г.). «Апокалипсис 1: Уродливый, плохой и хороший» .
  14. ^ "Набор тестов Раку" . Гитхаб . 2019.
  15. Ларри Уолл и дизайнеры Perl 6 (2015). «Дизайн-документы Perl 6» .
  16. ^ Фонд Perl (2001). «экзегезы» .
  17. ^ Фонд Perl (2002). «Разработка Perl: списки рассылки» .
  18. ^ «Ларри Уолл в журнале чата IRC» . 15 января 2016 г. . Проверено 10 ноября 2017 г.
  19. ^ «Архив электронного письма Ларри Уолла «Соображения по поводу логотипа»» . Гитхаб . 24 марта 2009 г. . Проверено 10 ноября 2017 г.
  20. ↑ a b Wall, Ларри (10 августа 2004 г.). «Синопсис 1: Обзор» .
  21. ^ "ракудо / ракудо - GitHub" . Гитхаб.com . Проверено 21 сентября 2013 г.
  22. Мишо, Патрик (16 января 2008 г.). "Компилятор, ранее известный как "perl6 " " . Архивировано из оригинала 18 февраля 2012 года.
  23. Уортингтон, Джонатан (31 мая 2013 г.). «MoarVM: виртуальная машина для NQP и Rakudo» . 6кишки . Проверено 24 июля 2013 г.
  24. ^ "МоарВМ" . Команда МоарВМ . Проверено 8 июля 2017 г.
  25. ^ «Сравнение возможностей компиляторов Perl 6» . Архивировано из оригинала 7 февраля 2019 года.
  26. ^ Уолл, Ларри; и другие. (2007). "Перл 6 СТД" . Гитхаб .
  27. ^ "Часто задаваемые вопросы о mp6/kp6" . Команда разработчиков Perl 6. 2006.
  28. ^ "Япси README" . Гитхаб . 2011.
  29. ↑ О'Риар , Стефан (29 ноября 2011 г.). "Неча README.pod" . Гитхаб . Проверено 12 января 2012 г.
  30. ^ Уолл, Ларри (2004). «Синопсис 11: Модули» .
  31. ^ "Каталог модулей Perl 6" . Модули.raku.org . Проверено 17 мая 2020 г.
  32. ↑ a b Wall, Ларри (20 мая 2009 г.). «Синопсис 2: Биты и кусочки» .
  33. ↑ a b c Wall, Ларри (21 марта 2003 г.). «Синопсис 6: Подпрограммы» .
  34. ↑ a b Wall, Ларри (20 мая 2009 г.). «Синопсис 4: Блоки и операторы» .
  35. Уолл, Ларри (18 августа 2006 г.). «Синопсис 12: Объекты» .
  36. ^ Группа компоновки программного обеспечения (2003). «Черты» . Архивировано из оригинала 11 августа 2006 года . Проверено 22 сентября 2006 г.
  37. ^ Уортингтон, Джонатан (2009). «День 18: Роли» .
  38. ^ хроматический (2009). «Почему роли Perl» .
  39. ^ "Ориентация объекта" . docs.raku.org . Проверено 24 октября 2019 г.
  40. ^ Парланте, Ник (2000). «Essential Perl: обработка строк с помощью регулярных выражений» .
  41. ^ Кристиансен, Том (1996). «Описание регулярного выражения PERL5» . Архивировано из оригинала 31 марта 2010 года . Проверено 25 марта 2010 г. Регулярные выражения Perl «не являются» — то есть они не являются «обычными», потому что также поддерживаются обратные ссылки per sed и grep, что делает язык более не строго регулярным.
  42. Уолл, Ларри (20 мая 2009 г.). «Синопсис 5: Регулярные выражения и правила» .
  43. Уолл, Ларри (4 июня 2002 г.). «Апокалипсис 5: Сопоставление с образцом» .
  44. ↑ a b Wall, Ларри (13 сентября 2004 г.). «Синопсис 9: Структуры данных» .
  45. ↑ Ламкинс , Дэвид Б. (8 декабря 2004 г.). Успешный Лисп: Как понять и использовать Common Lisp . bookfix.com. Архивировано из оригинала 12 сентября 2006 года . Проверено 13 сентября 2006 г.
  46. ^ "Макросы" .
  47. ^ Книги о Perl 6

внешняя ссылка

  • Официальный сайт

Получено с https://en.wikipedia.org/w/index.php?title=Raku_(programming_language)&oldid=1063427237 "