# HG changeset patch # User anatofuz # Date 1550489350 -32400 # Node ID a456a90f9f35b578cbff4259c1ba3af4ad3cfcbf # Parent 2327c951dfb988e3564b50e92d79d50051409c3d add perl6 sample code diff -r 2327c951dfb9 -r a456a90f9f35 paper/chapter3.tex --- a/paper/chapter3.tex Mon Feb 18 19:46:14 2019 +0900 +++ b/paper/chapter3.tex Mon Feb 18 20:29:10 2019 +0900 @@ -8,8 +8,16 @@ 実装は歴史的に様々なものが開発されており、 Haskellで実装されたPugs、 Pythonとの共同実行環境を目指したParrotなどが存在する。 PugsやParrotは現在は歴史的な実装となっており、 開発は行われていない。 現在の主要な実装であるRakudoは、 Parrotと入れ替わる形で実装が進んでいる。 -Perl6そのものはスクリプト言語として実装されており、 漸進的型付け言語である。 + +Perl6そのものはスクリプト言語として実装されている。 +また、 Perl5の様に型が無い様にも振る舞えるが、 TypeScriptの様に型がある様にも振る舞う事が出来る。 +この型システムの特徴を、漸進的型付けと呼び、 Perl6は漸進的型付け言語である。 言語的な特徴としては、 独自にPerl6の文法を拡張可能なGrammer、 Perl5と比較してオブジェクト指向言語としての機能の強化などが見られる。 +Perl6の実際のサンプルコードをソースコード\ref{perl6_grammer}とソースコード\ref{p6_fizzbuzz}に示す。 + +\lstinputlisting[frame=lrbt, label=perl6_grammer, caption=Perl6のGrammerを利用したサンプルコード]{./codes/grammer.p6} +\lstinputlisting[frame=lrbt, label=p6_fizzbuzz, caption=Perl6の型システムを利用したfizzbuzz]{./codes/fizzbuzz.p6} + Perl6は言語的な仕様や、 実装がPerl5と大幅に異なっており、 言語的な互換性が存在しない。 その為、 現在ではPerl5とPerl6は別言語として開発されており、 Perl6は主要な処理系であるRakudoから名前を取り、 Rakuという別名がついている。 diff -r 2327c951dfb9 -r a456a90f9f35 paper/codes/fizzbuzz.p6 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/codes/fizzbuzz.p6 Mon Feb 18 20:29:10 2019 +0900 @@ -0,0 +1,12 @@ +my subset Fizz of Int where * %% 3; +my subset Buzz of Int where * %% 5; +my subset FizzBuzz of Int where Fizz&Buzz; +my subset OtherNumber of Int where none Fizz|Buzz; + +proto sub fizzbuzz ($) { * } +multi sub fizzbuzz (FizzBuzz) { "FuzzBuzz" } +multi sub fizzbuzz (Fizz) { "Fizz" } +multi sub fizzbuzz (Buzz) { "Buzz" } +multi sub fizzbuzz (OtherNumber $number) { $number } + +fizzbuzz($_).say for 1..15; diff -r 2327c951dfb9 -r a456a90f9f35 paper/codes/grammer.p6 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/codes/grammer.p6 Mon Feb 18 20:29:10 2019 +0900 @@ -0,0 +1,11 @@ +grammar Parser { + rule TOP { I } + token love { '♥' | love } + token lang { < Perl Rust Go Python Ruby > } +} + +say Parser.parse: 'I ♥ Perl'; +# OUTPUT: 「I ♥ Perl」 love => 「♥」 lang => 「Perl」 + +say Parser.parse: 'I love Rust'; +# OUTPUT: 「I love Rust」 love => 「love」 lang => 「Rust」 diff -r 2327c951dfb9 -r a456a90f9f35 paper/main.pdf Binary file paper/main.pdf has changed