Raku(プログラミング言語)

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
Camelia.svg
楽焼のマスコット、カメリア[1]
パラダイムマルチパラダイム
家族Perl
によって設計されたラリーウォール
デベロッパー楽コミュニティ
初登場2015年12月25日; 6年前 (2015-12-25
安定リリース
6.d 'ディワリ' [2] / 2020年10月24日; 15か月前 (2020-10-24
規律の入力動的段階的
OSクロスプラットフォーム
ライセンスGNU General PublicLicenseまたはArtisticLicense 2
ファイル名拡張子.p6、.pm6、.pod6、.t6、.raku、.rakumod、.rakudoc、.rakutest [3]
Webサイトraku .org
主な実装
楽道
に影響を受けた
PerlRubySmalltalkHaskell[4] JavaScript
影響を受ける
Perl[5] Haskell[5] AntLang

Rakuは、プログラミング言語のPerlファミリーのメンバーです[6]以前はPerl6として知られていたが、2019年10月に名前が変更された。[7] [8] Rakuは、多くの現代および歴史的言語の要素を紹介している。互換モードは仕様の一部ですが、Perlとの互換性は目標ではありませんでした。楽のデザインは2000年に始まりました。

歴史

Perl 6では、ユーザーを修正するよりも言語を修正する方がよいと判断しました。

— ラリーウォール[9]

楽焼の設計プロセスは、2000年7月19日、その年のPerl会議の4日目[10]に、ラリーウォール2000年のオニオン州での講演で最初に発表しました。[11]当時の主な目標は、言語から「歴史的疣贅」を取り除くことでした。「簡単なことは簡単にとどまり、難しいことは簡単になり、不可能なことは難しくなるはずです」; 内部設計とAPIの一般的なクリーンアップ。プロセスは、コメントまたは「RFC」の一連の要求から始まりました。このプロセスはすべての貢献者に開かれており、言語のどの側面も変更することができませんでした。[12]

RFCプロセスが完了すると、Wallは受け取った361の要求のそれぞれを確認して分類しました。それから彼は、「明らかにする」という用語の本来の意味を使用して、いくつかの「黙示録」を書くプロセスを開始しました。[13]当初の目標は、プログラミングPerlの各章に1つの黙示録を書くことでしたが、各黙示録が書かれるにつれて、以前の黙示録は後の変更によって無効にされることが明らかになりました。このため、一連の概要が公開されました。各概要は黙示録の内容に関連していますが、その後の変更は更新に反映されています。現在、Rakuの仕様は、「ロースト」テストスイート[14]によって管理されていますが、概要は履歴の参照として保持されています。[15]

ダミアン・コンウェイによって書かれた一連の聖書釈義もあり、実際の使用法の観点から各黙示録の内容を説明しています。各Exegesisは、コード例と、例の使用法と意味についての説明で構成されています。[16]

今日の楽焼の開発で使用されるコミュニケーションの3つの主要な方法があります。1つ目はLiberaChatのrakuIRCチャンネルです2つ目は、 perl.orgにあるPerlFoundationサーバー上の一連のメーリングリストです。[17] 3つ目は、https://github.com/rakuでホストされているGitソースコードリポジトリです

最初の目標と影響

ウォールが最初の演説で提案した主な目標は、歴史的な疣贅の除去でした。これらには、コンテナーの印章の使用を取り巻く混乱、関数間のあいまいさ、およびベアワードファイルハンドルselectの構文上の影響が含まれていましたPerlプログラマーが何年にもわたって修正について話し合っていた他の多くの問題があり、Wallは彼のスピーチで明示的に対処しました。[要出典]

これらの目標の意味するところは、Perl6には既存のPerlコードベースとの下位互換性がないということです。これは、Perl5コンパイラーによって正しく解釈された一部のコードがPerl6コンパイラーによって受け入れられないことを意味しました。ソフトウェアを拡張する際の下位互換性は一般的な目標であるため、Perl6での重大な変更を明示的に記述する必要がありました。Perl5とPerl6の違いは非常に大きくなり、最終的にPerl6はRakuに名前が変更されました。

マスコット

ラリーウォールとカメリア

言語のマスコットは「カメリア、楽焼」です。[1]彼女の名前は、 Perlに 関連するラクダのマスコットにちなんでいます。彼女の形は、Perlコミュニティのしゃれを愛する伝統であり、「ソフトウェアバグ」の遊びです。彼女の蝶のような翼に埋め込まれたスパイラルデザインは、Perl 6の愛称である「P6」のキャラクターに似ており、中心から外れた目の配置は「目を細めた」の意図的なしゃれです。[18]

ロゴの活気に満ちたカラフルなデザインの背後にある目標の1つは、コミュニティでのミソジニーを思いとどまらせ、「男性的な説得」の人々が敏感な側面を示す機会になることでした。[19]

実装

2017年現在、 Rakudoの実装のみが活発に開発されています。公式のRaku実装として指定される実装はありません。むしろ、「楽は公式のテストスイートに合格するものです。」[20]

Rakudo Perl 6 [21] [22]は、 MoarVMJava仮想マシンJavaScriptなどの多数の仮想マシンを対象としていますMoarVMは、Rakudo [23]およびNQPコンパイラツールチェーン用に特別に構築された仮想マシンです。[24] Rakuと仮想マシンの間には、Not Quite Perl 6(NQP)と呼ばれるレイヤーがあります。これは、Rakuを解析するためのRakuルール、および抽象構文ツリーとバックエンド固有のコード生成を実装します。Rakudoの大部分は、Raku自体またはそのサブセットNQPで記述されています。Rakudoは完全にセルフホスティングの実装ではありません、また、現時点では、Rakudoをブートストラップコンパイラにする具体的な計画はありません。

過去の実装

Pugsは、 Haskellで書かれたPerl6の最初の実装でしたパグは以前はPerl6の最も高度な実装でしたが、2007年半ば以降、ほとんど休止状態になっています(GHCの現在のバージョンを追跡するためだけに更新が行われています)。2014年11月の時点で、パグは積極的にメンテナンスされていませんでした。[25]

2007年、v6-MiniPerl6( "mp6")とその再実装であるv6-KindaPerl6( "kp6")は、Perl5を使用してPerl-6.0.0STDをブートストラップする手段として作成されました。STDはPerlの完全な文法です。 6であり、Perl 6で記述されています。理論的には、STDを解析して実行可能なコードを生成できるものはすべて、Perl 6に適したブートストラップシステムです。kp6は現在mp6によってコンパイルされ、複数のバックエンドで動作します。[26] [27] mp6とkp6は完全なPerl6実装ではなく、完全なPerl6コンパイラーをブートストラップするために必要な最小限の機能セットを実装するためだけに設計されています。

YapsiはPerl6コンパイラであり、Perl6自体で記述されたランタイムでした。その結果、実行するには、RakudoStarリリースの1つなどの既存のPerl6インタープリターが必要でした。[28]

もう1つの主要なPerl6実装作業であるNieczaは、最適化と効率的な実装研究に焦点を当てています。共通言語基盤を対象としています。[29]

モジュールシステム

Raku仕様では、モジュールを名前、バージョン、および権限で識別することが要求されています。[30]モジュールの特定のバージョンのみ、またはバージョンや権限が異なる同じ名前の2つのモジュールをロードすることも可能です。便宜上、短い名前への エイリアシングが提供されています。

Perlモジュール配布システムであるCPANは、まだRakuモジュールを処理していません。代わりに、プロトタイプモジュールシステムが使用されています。[31]

Perlからの主な変更点

PerlとRakuは根本的に異なりますが、一般的には「Raku Perlを維持する」ことを目的としているため、Rakuは明らかに「Perlプログラミング言語」です。ほとんどの変更は、言語を正規化し、初心者と上級のプログラマーが同様に理解しやすくし、「簡単なことをより簡単にし、難しいことをより可能にする」ことを目的としています。

仕様書

PerlとRakuの技術的でない主な違いは、Rakuが仕様として始まったことです。[20]これは、必要に応じてRakuを再実装できることを意味します。また、プログラマーが特定の機能の最終的な権限を得るためにソースコードを読み取る必要がないことも意味します。対照的に、Perlでは、公式ドキュメントは信頼できるものとは見なされず、実際のP​​erlインタープリターの動作を非公式に説明しているだけです。ドキュメントと実装の間に矛盾が見つかった場合は、どちらかが変更されてもう一方が反映される可能性があります。これは、Perlリリースの継続的な開発と改良を推進するダイナミクスです。

型システム

Rakuでは、Perlの動的型システムが静的型の追加によって拡張されています[32]例:

my  Int  $ i = 0 ;
私の ラット $ r = 3.142 ;
my  Str  $ s = "Hello、world" ;

ただし、静的型付けはオプションのままであるため、プログラマーは明示的な型付けをまったく行わなくてもほとんどのことを実行できます。

私の $ i = "25" + 10 ; #$ iは35です

Rakuは漸進的型付けシステムを提供しており、プログラマーは静的型付けを使用するか、動的型付けを使用するか、またはその2つを混合するかを選択できます。

正式なサブルーチンパラメータリスト

Perlは、正式なパラメーターリストをまったく使用せずにサブルーチンを定義します(ただし、Perlの「プロトタイプ」を使用して、単純なパラメーターのカウントと非常に緩い型のチェックを行うことができます)。渡されたサブルーチン引数は、配列の要素にエイリアスされ@_ます。の要素@_が変更された場合、その変更は元のデータに反映されます。

Rakuは、言語に真の正式なパラメーターを導入します。[33] Rakuでは、サブルーチン宣言は次のようになります。

sub  do_somethingStr  $ things 、Int  $ other){
    ..。
}

Perlの場合と同様に、仮パラメーター(つまり、パラメーターリスト内の変数)は実際のパラメーター(渡された値)のエイリアスですが、デフォルトでは、エイリアスは定数であるため、変更できません。これらは、元の値の読み取り/書き込みエイリアスとして明示的に宣言することも、プログラマーがローカルで変更する必要がある場合は、それぞれ is rworディレクティブを使用してコピーとして宣言することもできます。is copy

パラメータ受け渡しモード

Rakuは、パラメーターの受け渡しの3つの基本モードを提供します。位置パラメーター、名前付きパラメーター、およびスラーピーパラメーターです。

位置パラメータは、ほとんどのプログラミング言語が使用するパラメータの一般的な順序付きリストです。すべてのパラメーターは、それらの名前を順序付けられていない方法で使用して渡すこともできます。名前付きのみのパラメーター(:パラメーター名の前にaで示される)は、その名前を指定することによってのみ渡すことができます。つまり、位置引数をキャプチャすることはありません。不機嫌なパラメーター(パラメーター名の前に示されている)は、可変個引数関数*を作成するためのRakuのツールですslurpyハッシュは、残りの名前渡しパラメーターをキャプチャしますが、slurpy配列は、残りのpassed-by-positionパラメーターをキャプチャします。

3つのパラメータ受け渡しモードすべての使用例を次に示します。

sub  somefunction$ a$ b、:$ c、:$ d、* @e){
    ..。
}

somefunction1、2d34、5、6; _ _ _ #$ a = 1、$ b = 2、$ d = 3、@ e =(4,5,6)

?上記で使用されているような位置パラメータは、オプションであることを示すために続く場合を除いて、常に必要です。名前付きパラメーターはデフォルトではオプションですが!、変数名の後に追加することで必須としてマークできます。Slurpyパラメータは常にオプションです。

ブロックとクロージャ

パラメータは、クロージャとして機能する任意のブロックに渡すこともできますこれは、たとえば、ループイテレータの名前の付け方forですwhile次の例では、リストが一度に3つの要素でトラバースされ、変数としてループのブロックに渡されます$a, $b, $c[34]

 @list場合-> $ a$ b$ c {
    ..。
}

これは一般に「pointysub」または「pointyblock」と呼ばれ、矢印はsubキーワードとほぼ同じように動作し、匿名クロージャ(またはPerl用語では匿名サブルーチン)を導入します。[33]

印章の不変性

Perlでは、sigils(変数名の前にある句読文字)は、変数の使用方法に応じて変わります。

#Perlコード
my @ array =( 'a'、 'b'、 'c');
私の$ element = $ array [1]; #$ elementは 'b'に等しい、
私の@ extract = @ array [1、2]; #@ extract equals( 'b'、 'c')
私の$ element = @ array [1]; # 'b'には警告が付いています(5.10オプション)

Rakuでは、シジルは不変です。つまり、必要なのが配列であるか配列要素であるかに基づいて、シジルは変化しません。[32]

#楽コード
my @ array = 'a'、 'b'、 'c';
私の$ element = @ array [1]; #$ elementは 'b'に等しい
私の@ extract = @ array [1]; #@ extract equals( 'b')
私の@ extract = @ array [1、2]; #@ extract equals( 'b'、 'c')

Perlの差異は、英語や他の多くの自然言語での数の一致に触発されています。

このリンゴ。」#$ a正解これらのリンゴ。」#@ a正解この3番目のリンゴ。」#$ a [3]正解これらの3番目のリンゴ。」#@ a [3]間違っている

ただし、参照を使用すると、スカラーであってもデータ構造を参照する可能性があるため、この概念マッピングは機能しなくなります。したがって、ネストされたデータ構造を処理するには、単一の用語で単数形と複数形の両方の表現が必要になる場合があります。

#Perlコード:配列を含むハッシュを含むハッシュのリーフからリストを取得します
my  @trans_verbs  =  @ {  $ dictionary {  'verb'  } {  'transitive'  }  };

この複雑さは、自然言語の一般的な使用法でも他のプログラミング言語でも同等のものはなく[疑わしい ] 、複雑なデータ構造を操作するコードを書くときに高い認知的負荷を引き起こします。これはRakuの同じコードです:

#Rakuコード:配列を含むハッシュを含むハッシュのリーフからリストを取得します
my  @trans_verbs = %dictionary <verb> <transitive> <> ;

オブジェクト指向プログラミング

Perlは、 blessingと呼ばれるメカニズムを介してオブジェクト指向プログラミングをサポートしています。どの参照も、特定のクラスのオブジェクトになるように祝福することができます。blessedオブジェクトは、「矢印構文」を使用してメソッドを呼び出すことができます。これにより、Perlは名前で適切なサブルーチンを検索または「ディスパッチ」し、blessed変数を最初の引数として呼び出します。

非常に強力ですが、オブジェクト指向の最も一般的なケースである、関連するコードを持つ構造体のようなオブジェクトを不必要に難しくします。さらに、Perlは使用中のオブジェクトモデルについて想定できないため、メソッドの呼び出しを適切に最適化することはできません。

「簡単なことと難しいことを可能にする」という精神で、楽は祝福モデルを保持し、一般的なケースに対してより堅牢なオブジェクトモデルを提供します。[35]たとえば、デカルト をカプセル化するクラスを定義して、次のように使用できます。

クラス Point  rw {
     has  $ .x ;
    $ .y あります;
    
    メソッド 距離Point  $ p){
         sqrt(($!x- $ p .x** 2 + $!y- $ p .y** 2
    }
    
    メソッド 中心までの距離{
         self距離: ポイントnewx => 0y => 0
    }
}

私の $ point = Pointnewx => 1.2y =>- 3.7);
言う "ポイントの場所:("$ point .x'、'$ point .y、 ' ' ;
#出力:ポイントの位置:(1.2、-3.7)

#xとyの変更(左辺値として使用されるメソッド「x」と「y」に注意):
$ pointx = 3 ;
$ pointy = 4 ;
言う "ポイントの場所:("$ point .x'、'$ point .y、 ' ' ;
#出力:ポイントの位置:(3、4)

私の $ other-point = Pointnewx =>- 5y => 10);
$ point距離$ other-point); #=> 10 
$ point中心までの距離;     #=> 5

ドットは、メソッド呼び出しの構文としてドットの周りに合体し た他の多くの言語( C ++JavaPythonなど)にうなずく矢印を置き換えます。

楽の用語で$.xは、「属性」と呼ばれます。一部の言語では、これらのフィールドまたはメンバーを呼び出します。属性にアクセスするために使用されるメソッドは、「アクセサー」と呼ばれます。オートアクセサーメソッドは、x上記の例のように、自動的に作成され、属性の名前にちなんで名付けられたメソッドです。これらのアクセサ関数は、属性の値を返します。クラスまたは個々の属性がis rw修飾子(「読み取り/書き込み」の略)で宣言されている場合、自動アクセサーに属性を設定するための新しい値を渡すか、左辺値として直接割り当てることができます。(例のように)。プログラマーが属性へのより豊富なインターフェースを望む場合、自動アクセサーはユーザー定義のメソッドに置き換えることができます。$!属性は、属性の宣言方法に関係なく、構文を介してクラス定義内からのみ直接アクセスできます。他のすべてのアクセスは、アクセサメソッドを経由する必要があります。

Rakuオブジェクトシステムは、RakuのOOP機能の多くをPerlに導入するMooseフレームワークに影響を与えました。[説明が必要]

継承、役割、クラス

継承は、オブジェクトまたはタイプが既存のオブジェクトまたはタイプのコードまたは定義を再利用できる手法です。たとえば、プログラマーは標準タイプを追加の属性で使用したい場合があります。Javaなどの他の言語での継承は、クラスを既存のクラスのサブクラスにすることで提供されます。

Rakuは、他の言語のクラスと同様のクラス、およびロールを介した継承を提供します。

Rakuでの役割は、Javaでのインターフェース、RubyでのミックスインPHPおよびSmalltalkバリアントSqueakでの特性[36]の機能を引き受けます。これらはクラスによく似ていますが、より安全な構成メカニズムを提供します。[37]これらは、継承チェーンに追加するのではなく、クラスで使用するときに構成を実行するために使用されます。役割は名目型を定義します。それらは、動作と状態のコレクションの意味名を提供します。ロールとクラスの基本的な違いは、クラスをインスタンス化できることです。役割はそうではありません。[38]

ロールはクラスとは異なりますが、ロールを直接インスタンス化する、またはロールを型オブジェクトとして使用するRakuコードを記述できます。Rakuは、ロールと同じ名前のクラスを自動的に作成し、ロールを透過的に使用できるようにします。まるでクラスのように。[39]

基本的に、ロールは、継承を使用せずにクラスに追加できる(場合によっては抽象化された)メソッドと属性のバンドルです。個々のオブジェクトに役割を追加することもできます。この場合、Rakuは匿名サブクラスを作成し、そのサブクラスにロールを追加し、オブジェクトのクラスを匿名サブクラスに変更します。

たとえば、乳腺や(哺乳類の親である脊椎動物を介して)背骨など、哺乳類から特定の特性を継承するため、犬は哺乳類です。一方、犬はまた、いくつかの異なるタイプの行動の1つを持っている可能性があり、これらの行動は時間の経過とともに変化する可能性があります。たとえば、犬はペット野良犬(捨てられたペットはペットに関連付けられていない状態で生き残るための行動を獲得します)、またはガイドである可能性があります盲導犬のために(盲導犬は訓練されているので、盲導犬としての生活を始めません)。ただし、これらは犬に追加できる追加の動作のセットです。これらの行動を他の動物に有効に適用できるように説明することも可能です。たとえば、はペットでも野良猫でもかまいません。したがって、犬と猫は互いに区別されますが、どちらもより一般的なカテゴリの哺乳類にとどまります。つまり、哺乳類はクラスであり、犬と猫は哺乳類から継承するクラスです。ただし、Pet、Stray、およびGuideに関連付けられている動作は、クラスに追加できるロール、またはクラスからインスタンス化されたオブジェクトです。

クラス 哺乳類  脊椎動物です{
    ..。
}
クラス   哺乳類です{
    ..。
}
役割 ペット{
    ..。
}
役割 ストレイ{
    ..。
}
役割 ガイド{
    ..。
}

役割は、doesキーワードを使用してクラスまたはオブジェクトに追加されます。クラスからの継承を示すために、別のキーワードがありisます。キーワードは、2つの機能の異なる意味を反映しています。役割の構成は、クラスに役割の動作を与えますが、それが役割と本当に同じであることを示すものではありません

クラス GuideDogis  Dog does Guide { _   
    ..。
}    #サブクラスは役割を構成します

私の $ dog =新しい ;
$ dog  ガイドを行います;       #個々のオブジェクトが役割を構成します

ロールはクラスとは異なりますが、どちらもタイプであるため、通常はクラスを配置する変数宣言にロールを表示できます。たとえば、人間のブラインドロールには、ガイドタイプの属性を含めることができます。この属性には、盲導犬、盲導馬、盲導馬、さらには盲導犬を含めることができます。

class  Human {
     has  Dog  $ dog ;      
    #それが...                 #ガイドの役割を果たしているかどうかにかかわらず、あらゆる種類の犬を含めることができます
}
ロール ブラインド{
    には ガイド $ guideがあります;  #ガイドの役割を実行する任意のオブジェクトを含めることができます
    ...                 #それが犬か何か他のものかどうか
}

正規表現

Perlの正規表現と文字列処理のサポートは、常にその定義機能の1つです。[40] Perlのパターンマッチング構造は、しばらくの間、正規言語表現の機能を超えていたため、[41] Rakuのドキュメントでは、それらを正規表現として排他的に参照し正式な定義から用語を遠ざけています。

Rakuは、正規表現に関するPerl機能のスーパーセットを提供し、それらを「ルールと呼ばれるより大きなフレームワークに折りたたんで、状況依存の 構文解析形式(式の文法ANTLRの構文解析の構文述語など)の機能を提供します。それらの語彙スコープに関するクロージャとして[42]ルールは、サブルーチン定義と非常によく似た使用法を持つキーワードで導入されています。匿名ルールは、(または)キーワードを使用して導入することもできます。または、正規表現がPerlで使用されていたように、単にインラインで使用することもできます。ruleregexrxm(マッチング)またはs(置換)演算子。

黙示録5で、ラリーウォールは「現在の正規表現文化」に関する20の問題を列挙しました。これらの中には、Perlの正規表現が「コンパクトすぎて「かわいい」」、「メタ文字が少なすぎる」、「名前付きキャプチャのサポートが少なすぎる」、「文法のサポートが少なすぎる」、「「本物」との統合が不十分」などがありました。言語"。[43]

構文の簡略化

一部のPerl構造は、Rakuで変更され、最も一般的なケースのさまざまな構文キュー用に最適化されています。たとえば、Perlの制御フロー構造に必要な括弧(丸括弧)はオプションになりました: [34]

if  is-true(){
     for  @array {
        ..。
    }
}

また、,(コンマ)演算子がリストコンストラクターになったため、リストを囲むかっこは不要になりました。コード

@array = 1、2、3、4 ;
 _ _ _ _ _ _

これ@arrayで、要素「1」、「2」、「3」、および「4」を正確に含む配列が作成されます。

連鎖比較

楽は「チェーン」との比較を可能にします。つまり、次のような一連の比較が許可されます。

 20 <= $ temperature <= 25の場合{
     「室温は20〜25です!」と言います。 
}

これは、左から右への各比較が単独で実行されたかのように扱われ、結果は操作によって論理的に結合されandます。

遅延評価

Rakuは、 Haskellなどの関数型プログラミング言語の機能であるリストの遅延評価の手法を使用しています[44]

@integers = 0 .. Inf ; #0から無限大までの整数

上記のコードは、無限のサイズのリストを配列に割り当てようとしてクラッシュすることはありませ@integersん。また、限られた数のスロットが検索された場合に、リストを拡張しようとして無期限にハングすることもありません。

これにより、入出力操作、リスト変換、パラメーターの受け渡しなど、Rakuの多くの一般的なタスクが簡素化されます。

収集

遅延評価に関連するのは、とを使用した遅延リストの作成gatherであり、 IconPythontakeなどの言語のジェネレーターのように動作します

私の $ squares = 0の怠惰な 集まり..Inf  { take
     $ _ * $ _ ;  
};

$squares平方数の無限リストになりますが、遅延評価gatherにより、要素がアクセスされたときにのみ計算されることが保証されます。

ジャンクション

楽はジャンクションの概念を紹介します:他の値の複合である値。[44]最も単純な形式では、ジャンクションは、値のセットをジャンクティブ演算子と組み合わせることによって作成されます

#の例| ( "any")ジャンクション:
my  $ color = 'white' ;
$ color eq '白'でない限り | 「黒」 | '灰色' | 'grey' {
     die "カラー印刷はサポートされていません\ n" ;   
}

#&( "all")ジャンクションの例:
my  $ password = 'secret!123' ;
if  $ password ~~ / <:alpha> /&/ <:digit> /&/ <:punct> / {
     「パスワードはかなり安全です」と言い ます;
}

|左側または右側の引数のいずれかに等しい値を示します。左側と右側の&両方の引数に等しい値を示します。これらの値は、通常の値を使用する任意のコードで使用できます。ジャンクションで実行される操作は、ジャンクションのすべてのメンバーに等しく作用し、ジャンクション演算子に従って結合されます。したがって、を生成します。比較では、ジャンクションは比較のために単一の真または偽の結果を返します。" "ジャンクションの要素のいずれかについて比較が真の場合、ジャンクションは真を返します。" "ジャンクションのすべての要素について比較が真の場合、ジャンクションは真を返します。 ("apple"|"banana") ~ "s""apples"|"bananas"anyall

ジャンクションは、型のジャンクションに制約される ジェネリックプログラミングのスタイルを導入することにより、型システムをより豊富に拡張するためにも使用できます。

サブセット Colorof  Any where RGB_Color | _  CMYK_Color ;
sub get_tintColor $ colorNum $ opacity){     
    ..。
}

マクロ

低水準言語では、 Cプリプロセッサが広く使用されているため、マクロの概念はソースコードのテキスト置換と同義になっていますただし、 Lispなどの高級言語は、はるかに強力なマクロの使用においてCよりも古いものでした。[45] Rakuが利用するのはこのLispのようなマクロの概念です。[33]この種のマクロの力は、プログラムを単純なテキストではなく 高レベルのデータ構造として操作し、プログラミング言語の全機能を自由に使用できるという事実に由来しています。

Rakuマクロ定義は、サブルーチンまたはメソッド定義のように見え、未解析の文字列、事前に解析されたコードを表すAST 、またはその2つの組み合わせを操作できます。マクロ定義は次のようになります。[46]

マクロ hello$ what){
     quasi { say  "Hello {{{{$ what}}}}" };
}

この特定の例では、マクロはCスタイルのテキスト置換ほど複雑ではありませんが、マクロが呼び出し元のコードで動作する前にマクロパラメーターの解析が行われるため、診断メッセージの方がはるかに有益です。ただし、マクロの本体は、使用するたびにコンパイル時に実行されるため、多くの最適化手法を使用できます。コンパイル時に作業を実行することにより、結果のプログラムから複雑な計算を排除することも可能です。

識別子

Perlでは、識別子名は他の言語でも利用可能なASCII英数字とアンダースコアを使用できます。Rakuでは、英数字にほとんどのUnicode文字を含めることができます。さらに、ハイフンとアポストロフィを使用できます(数字が続かないなどの特定の制限があります)。アンダースコアの代わりにハイフンを使用して名前の単語を区切ると、「ケバブケース」と呼ばれる名前のスタイルになります。

Hello world

hello worldプログラムは、言語を紹介するために使用される一般的なプログラムです。Rakuでは、HelloWorldは次のとおりです。

 「Hello、world」と言います;

それを行うには複数の方法がありますが

階乗

いくつかの異なる方法で定義されたRakuの階乗関数:

#再帰の使用( `if \ else`構文を使用)
sub  factUInt  $ n- > UInt){
     if  $ n == 0 { 1 }
     else        { $ n * fact$ n-1)}
}

#再帰を使用(ステートメント修飾子として `if`を使用)
sub  factUInt  $ n- > UInt){
     $ n == 0の場合は1を返し ます;
    $ n * fact$ n-1);を返します。   
}

#再帰の使用( `when`構文を使用)
sub  factUInt  $ n- > UInt){
     when  $ n == 0 { 1 }
     default       { $ n * fact$ n-1)}
}

#三項演算子の
サブ ファクトを使用する(UInt  $ n- > UInt){
     $ n == 0  ?? 1  !! $ n *事実$ n-1
}

#多重ディスパッチの使用
multi  fact0){ 1 }
 multi  factUInt  $ 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 }を返し ます:存在します;
    %known { $ n } = $ n *事実$ n-1);
    %known { $ n }を返します;  
}

クイックソート

クイックソートはよく知られているソートアルゴリズムです。関数型プログラミングパラダイムを使用した実用的な実装[a]は、Rakuで簡潔に記述できます。

#空のリストは空のリストにソートされます
multi  quicksort([]){()}

#それ以外の場合は、最初のアイテムをピボットとして抽出します... 
multi  quicksort([ $ピボット、* @rest ]){
     #パーティション。
    私の @ before = @ restgrep(* $ピボットの );
    私の@ after   = @ restgrep(* $ピボットの);  

    #パーティションを並べ替えます。
    フラットクイックソート@before)、$ピボットクイックソート@after))
}
  1. ^ 実装が舞台裏で何か空想的で神秘的なことをしない限り、可能な最大の再帰の深さはリストの長さであり、この実装はビッグデータには不適切です。再帰の深さはlog2(list_length)を反復処理し、小さい方のパーティションにのみ再帰することで制限できます。beforeafter

ハノイの塔

ハノイの塔は、コンピュータサイエンスに再帰プログラミングを導入するためによく使用されます。この実装では、Rakuのマルチディスパッチメカニズムとパラメトリック制約を使用します。

multi  sub  hanoi0、$、$、$){}                          #ディスクがないので何もしない
multi  sub  hanoi$ n$ a = 'A'$ b = 'B'$ c = 'C'){      #$ nディスクと3つのペグ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に移動します
}

書籍

楽の歴史には、2つの本の書き方の波がありました。最初の波は2000年のPerl6の最初の発表に続きました。これらの本は当時の言語の設計の状態を反映しており、ほとんどが時代遅れの資料を含んでいます。2015年にバージョン1.0が発表された後の第2の波には、すでに出版されている本と、執筆中の本が含まれています。

Perl 6バージョン1.0(バージョン6.cとして知られている)より前に出版された本

  • A. Randal、D。Sugalski、L。Totsch Perl6およびParrotEssentials 、第1版、2003年、ISBN  978-0596004996
  • A. Randal、D。Sugalski、L。Totsch Perl6およびParrotEssentials 第2版2004。ISBN978-0596007379 
  • S.ウォルターズ。Perl 6 Now:Perl5で説明されているコアアイデア。2004。ISBN978-1590593950 

また、最初のPerl6仮想マシンの1つであるParrotに捧げられた本が2009年に出版されました。

Perl 6バージョン1.0(バージョン6.cとして知られている)以降に発行された書籍

新しい楽名で出版された本

出版される本

間もなく出版される予定の新しい本について、さまざまな著者から いくつかの報告[47]があります。これらはすべて、Perl 6の現在のバージョン1.0(バージョン6.cとして知られています)に基づいています。

参考文献

  1. ^ a b ジャクソン、ヨアブ(2010年7月23日)。「Perlクリエーターは待望のPerl6のリリースが差し迫っていることを示唆しています」IDGニュースサービス2015年2月8日取得
  2. ^ http://blogs.perl.org/users/zoffix_znet/2018/11/announce-raku-perl-6-diwali-6d-language-specification-release.html
  3. ^ 「モジュール」
  4. ^ 「用語集と専門用語」Perl Foundation Perl 6WikiPerlFoundation2011年2月28日。2012年1月21日のオリジナルからアーカイブ2015年2月8日取得
  5. ^ a b 唐鳳、別名唐鳳 2010年4月21日)。「'10でPerl6を実装する方法」
  6. ^ 「Perlについて」perl.org 2020年6月11日取得「Perl」は言語のファミリーであり、「Raku」(以前は「Perl 6」と呼ばれていました)はファミリーの一部ですが、独自の開発チームを持つ別の言語です。その存在は、「Perl」の継続的な開発に大きな影響を与えません。
  7. ^ 「Perl6はRakuに名前が変更されました」LWN.net2019年10月15日2019年10月16日取得
  8. ^ 「RakurenameへのTPF応答」2019年10月29日。
  9. ^ Biancuzzi、Federico; ウォーデン、シェーン(2009)。プログラミングの首謀者:主要なプログラミング言語の作成者との会話ISBN 978-0596515171
  10. ^ クライン、ジョー(2000年8月21日)。「Perl会議からの報告」
  11. ^ ウォール、ラリー(2000)。「タマネギ2000の状態」オライリーネットワーク。
  12. ^ Perl Foundation(2000)。「Perl6RFCについて」
  13. ^ ウォール、ラリー(2001年4月2日)。「黙示録1:醜い、悪い、そして良い」
  14. ^ 「楽テストスイート」GitHub2019年。
  15. ^ LarryWallとPerl6デザイナー(2015)。「Perl6デザインドキュメント」
  16. ^ Perl Foundation(2001)。「聖書釈義」
  17. ^ Perl Foundation(2002)。「Perl開発:メーリングリスト」
  18. ^ 「IRCチャットログのラリーウォール」2016年1月15日2017年11月10日取得
  19. ^ 「ラリーウォールからのアーカイブされた「ロゴの考慮事項」の電子メール」GitHub2009年3月24日2017年11月10日取得
  20. ^ a b ウォール、ラリー(2004年8月10日)。「概要1:概要」
  21. ^ 「rakudo / rakudo-GitHub」Github.com 2013年9月21日取得
  22. ^ Michaud、Patrick(2008年1月16日)。「以前は「perl6」と呼ばれていたコンパイラ"2012年2月18日のオリジナルからアーカイブ。
  23. ^ ワージントン、ジョナサン(2013年5月31日)。「MoarVM:NQPとRakudo用の仮想マシン」6ガッツ2013年7月24日取得
  24. ^ 「MoarVM」MoarVMチーム2017年7月8日取得
  25. ^ 「Perl6コンパイラの機能比較」2019年2月7日にオリジナルからアーカイブされました。
  26. ^ 壁、ラリー; etal。(2007)。「Perl6STD」GitHub
  27. ^ 「mp6 / kp6FAQ」Perl6開発チーム。2006年。
  28. ^ 「YapsiREADME」GitHub2011年。
  29. ^ O'Rear、Stefan(2011年11月29日)。「NieczaREADME.pod」GitHub2012年1月12日取得
  30. ^ ウォール、ラリー(2004)。「概要11:モジュール」
  31. ^ 「Perl6モジュールディレクトリ」Modules.raku.org 2020年5月17日取得
  32. ^ a b ウォール、ラリー(2009年5月20日)。「あらすじ2:断片」
  33. ^ a b c ウォール、ラリー(2003年3月21日)。「概要6:サブルーチン」
  34. ^ a b ウォール、ラリー(2009年5月20日)。「概要4:ブロックとステートメント」
  35. ^ ウォール、ラリー(2006年8月18日)。「あらすじ12:オブジェクト」
  36. ^ ソフトウェア構成グループ(2003)。「特性」2006年8月11日にオリジナルからアーカイブされました2006年9月22日取得
  37. ^ ワージントン、ジョナサン(2009)。「18日目:役割」
  38. ^ クロマチック(2009)。「Perlの役割の理由」
  39. ^ 「オブジェクト指向」docs.raku.org 2019年10月24日取得
  40. ^ Parlante、Nick(2000)。「EssentialPerl:正規表現を使用した文字列処理」
  41. ^ クリスチャンセン、トム(1996)。「PERL5正規表現の説明」2010年3月31日にオリジナルからアーカイブされました2010年3月25日取得Perlの正規表現は「そうではありません」-つまり、sedおよびgrepごとの後方参照もサポートされているため、「正規表現」ではありません。これにより、言語が厳密に正規表現ではなくなります。
  42. ^ ウォール、ラリー(2009年5月20日)。「概要5:正規表現とルール」
  43. ^ ウォール、ラリー(2002年6月4日)。「黙示録5:パターンマッチング」
  44. ^ a b ウォール、ラリー(2004年9月13日)。「概要9:データ構造」
  45. ^ Lamkins、David B.(2004年12月8日)。成功したLisp:CommonLispを理解して使用する方法bookfix.com。2006年9月12日にオリジナルからアーカイブされました2006年9月13日取得
  46. ^ 「マクロ」
  47. ^ Perl6に関する本

外部リンク