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

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

История [ править ]

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

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

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

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

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

Сегодня при разработке Раку используются три основных метода общения. Первый - это канал IRC #raku connect на freenode . Второй - это набор списков рассылки на серверах 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 загрузочным компилятором.

Исторические реализации [ править ]

Мопсы были начальной реализацией Perl 6, написанной на Haskell . Мопсы были самой продвинутой реализацией Perl 6, но с середины 2007 года она в основном бездействовала (с обновлениями, сделанными только для отслеживания текущей версии GHC ). По состоянию на ноябрь 2014 года Мопс активно не поддерживался. [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.

Система типов [ править ]

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

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

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

мой  $ i = "25" + 10 ; # $ i - 35 лет

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

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

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

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

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

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

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

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

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

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

суб  SomeFunction ( $ а , $ Ь ,: $ C ,: $ д , * @e ) { ...}SomeFunction ( 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-кодмой @ array = ('a', 'b', 'c');мой $ element = $ array [1]; # элемент $ равен 'b',мой @extract = @ array [1, 2]; # @extract равно ('b', 'c')мой $ element = @ array [1]; # 'b' приходит с предупреждением (вариант 5.10)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Наследование, роли и классы [ править ]

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

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

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

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

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

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

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

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

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

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

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

Регулярные выражения [ править ]

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

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

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

Синтаксическое упрощение [ править ]

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

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

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

@array = 1 , 2 , 3 , 4 ;

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

Цепные сравнения [ править ]

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

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

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

Ленивая оценка [ править ]

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

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

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

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

Собрать [ править ]

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

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

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

Соединения [ править ]

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

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

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

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

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

Макросы [ править ]

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

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

макрос  hello ( $ what ) { quasi { сказать  "Hello {{{{$ what}}}}" };}

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

Идентификаторы [ править ]

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

Примеры [ править ]

Привет, мир [ править ]

Программа hello world - это обычная программа, используемая для знакомства с языком. В Raku 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 )}# Использование сокращения metaoperator мульти  факт ( UInt  $ п -> UInt ) { [*] 1 .. $ n}# Создание факторный оператора и с помощью сокращения metaoperator суб  суффикса: <!> (UInt $ п ->  UInt ) {[*] 1 .. $ п }# Использование `state` описатель для создания memoized факторный суб  факт ( UInt  $ п -> UInt ) { состояние  % известно = 0 => 1 ; вернуть  % known { $ n }, если  % known { $ n }: существует ; % известно { $ n } = $ n * факт ( $ n-1 ); вернуть  % known { $ n };}

Быстрая сортировка [ править ]

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

# Пустой список сортируется в пустой список multi  quicksort ([]) {()}# В противном случае извлечь первый элемент как сводную ... multi  quicksort ([ $ pivot , * @rest ]) { #  Разделить . мой  @before = @rest . grep (* перед  $ pivot ); мой  @after = @rest . grep (* после  $ pivot ); # Сортировать разделы.  плоский ( быстрая сортировка ( @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,  скажите:  "Переместите диск $ n с привязки $ a на привязку $ 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: Pir. 2009. ISBN 978-0977920129. 

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

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

Книги, изданные под новым именем Раку [ править ]

  • Андрей Шитов. Использование 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. ^ https://docs.raku.org/language/modules#Basic_structure
  4. ^ «Глоссарий терминов и жаргонизмов» . Фонд Perl Perl 6 Wiki . Фонд Perl . 28 февраля 2011 года Архивировано из оригинала 21 января 2012 года . Проверено 8 февраля 2015 года .
  5. ^ a b 唐鳳, она же Одри Танг (21 апреля 2010 г.). «Как внедрить Perl 6 в '10» .
  6. ^ "О Perl" . perl.org . Проверено 11 июня 2020 . «Perl» - это семейство языков, «Raku» (ранее известный как «Perl 6») - это часть семейства, но это отдельный язык, у которого есть собственная команда разработчиков. Его существование не оказывает существенного влияния на дальнейшее развитие Perl.
  7. ^ «Perl 6 переименован в Raku» . LWN.net . 15 октября 2019 . Дата обращения 16 октября 2019 .
  8. ^ "Ответ TPF на переименование Раку" . 29 октября 2019.
  9. ^ Федерико Бьянкуцци; Шейн Уорден (2009). Идеи программирования: беседы с создателями основных языков программирования . ISBN 978-0596515171.
  10. Клайн, Джо (21 августа 2000). "Репортаж с Perl конференции" .
  11. Перейти ↑ Wall, Larry (2000). «Состояние лука 2000» . Сеть О'Рейли.
  12. ^ Фонд Perl (2000). «О Perl 6 RFC» .
  13. Перейти ↑ Wall, Larry (2 апреля 2001 г.). «Апокалипсис 1: Уродливое, плохое и хорошее» .
  14. ^ "Набор тестов Raku" . 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 Уолл, Ларри (10 августа 2004 г.). «Синопсис 1: Обзор» .
  21. ^ "ракудо / ракудо - GitHub" . Github.com . Проверено 21 сентября 2013 года .
  22. Мишо, Патрик (16 января 2008 г.). «Компилятор ранее известный как„Perl6 » . Архивировано из оригинального 18 февраля 2012 года.
  23. ^ Уортингтон, Джонатан. «MoarVM: виртуальная машина для NQP и Rakudo» . 6гц . Проверено 24 июля 2013 года .
  24. ^ "MoarVM" . Команда MoarVM . Проверено 8 июля 2017 года .
  25. ^ "Сравнение характеристик компиляторов Perl 6" . Архивировано из оригинала 7 февраля 2019 года.
  26. ^ Уолл, Ларри; и другие. (2007). "Perl 6 STD" .
  27. ^ "mp6 / kp6 FAQ" . Команда разработчиков Perl 6. 2006 г.
  28. ^ "Yapsi README" . 2011 г.
  29. ^ O'Rear, Стефан (29 ноября 2011). "Niecza README.pod" . Проверено 12 января 2012 года .
  30. Перейти ↑ Wall, Larry (2004). «Сводка 11: Модули» .
  31. ^ "Каталог модулей Perl 6" . Modules.raku.org . Дата обращения 17 мая 2020 .
  32. ^ a b Wall, Ларри (20 мая 2009 г.). «Сводка 2: Кусочки и кусочки» .
  33. ^ a b c Уолл, Ларри (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 «не являются» - то есть они не «обычные», потому что также поддерживаются обратные ссылки на sed и grep, что делает язык более не строго регулярным.
  42. Перейти ↑ Wall, Larry (20 мая 2009 г.). «Сводка 5: регулярные выражения и правила» .
  43. Перейти ↑ Wall, Larry (4 июня 2002 г.). «Апокалипсис 5: сопоставление с образцом» .
  44. ^ a b Уолл, Ларри (13 сентября 2004 г.). «Сводка 9: структуры данных» .
  45. ^ Lamkins, David B. (8 декабря 2004). Успешный Лисп: как понять и использовать Common Lisp . bookfix.com.
  46. ^ «Макросы» .
  47. ^ Книги о Perl 6

Внешние ссылки [ править ]

  • Официальный веб-сайт