PerlとRAKU:最良の敵


PerlとRAKUプログラミング言語は一緒に複雑な歴史を持っています.後者はenvisioned in the year 2000 Perl 6として、Perlの完全な再設計と書き換えは、困難なメンテナンスの問題と13年の後方互換性の負担を解決します.残念ながら、最初のメジャーリリースに向けての開発努力は10年にわたって引きずられました、そして、開発者の何人かは、遅れがPerlの市場の衰退に貢献していて、プログラミング言語の間でMindShareに貢献したと信じ始めました.
その間にwork continued on Perl 5 , そして結局、Perlpositioned 「姉妹言語、Perlファミリの一部として、Perlのための置き換えとして意図されません.」年前はrenamed Raku より良いプロジェクトとしてそれを示すために.
つの言語はソース互換性がないが、Inline::Perl5 モジュールはRAKU開発者がPerlコードを実行し、RAKU内でPerlモジュールを使うことを可能にします.RAKUでPerlクラスをサブクラス化し、PerlコードからRAKUメソッドを呼び出すことさえできます.私は最近まで、Perlのサポートは非常に異なっているにもかかわらず、RUKUでは非常に強力だったことに気づいていなかったので、私は機会を物事の行う方法を理解するために、両方の言語でいくつかのサンプルコードを書くようになるだろうと思った.
単純ではなく“Hello World” program , 私は簡単なシンジケートニュースリーダーを書くことを決めた.The Raku modules directory Perlに匹敵する何かを持っているように見えませんでしたWWW::Mechanize and XML::RSS モジュールで、Perl RAKU相互運用性をテストするのに最適な方法のようです.

Perlフィードファインダ


まず、Perlスクリプト.私はそれを直接スマートフィードを取得するか、サイトのHTMLページにそれを見つけるのに十分スマートでした.
< div >
< p >初めに、ビットプレートが少しあることに気付きます.use v5.24 ( released in 2016 ) 有効にするrestricting unsafe code , the say 関数とpostfix dereferencing ネストしたカーリーブレースからノイズを減らすために.私も持っている first and none list processing 関数からList::Util WWW ::Mechanize WebページレトリーバーとパーサーとXML ::RSSフィードパーサーp >
nextは可能な配列ですmedia (formerly MIME) types 奉仕するのに用いられるRSS news feed format ウェブ上でPerlとRAKUのように、RSS形式はAを持ちますlong and sometimes contentious history , したがって、ニュースリーダーはページでそれらを識別するいくつかの異なる方法をサポートする必要がありますp >
それから、プログラムは、新しいWWW ::Mechanize(短いためには< em > Mech )とXML ::RSSオブジェクトを作成して、そのコマンドライン引数から閲覧するURLを得ますmy blog を返します.Em>(私のサイト、私の規則、右)/それから、ウェブからそのURLを取り出します.メッシュがそのURLを信じるならcontains an HTML page 見つけることができますlink タグ付きrel="alternate" 可能性のある任意のニュースフィードを識別する属性は、その後、RSSの種類の以前のリストに対して、これらのリンクのメディアタイプをチェックして検索する最初のものを取得します.p >
次に、このスクリプトによって行われた唯一のエラーチェックが行われます.取得したフィードのメディアタイプが実際に以前に定義されたリストに一致するかどうかをチェックします.これは、RSSパーサーがプレーンなWebページを処理しようとするのを防ぎます.これは大きく複雑なプログラムではないので、die関数は末尾の改行文字と呼ばれます.\n ) エラーが発生した行を報告するのを抑制するp >
最後に、ヘッドラインとリンクを出力する時間ですが、その前にPerlはUnicode standard しかし、平野ででなくASCII それが通常使用する.これはタイポグラフィーのようなものを含んでいます.私は時々私のタイトルで使用します.スクリプトのループの最後の2行は、フィードのパースされた項目を通して、タイトルとリンクを取り出し、タブで印刷します\t ) それらの間のセパレータ
< P >


楽フィードファインダー


< p >プログラミングはしばしばライブラリとAPIを一緒に縫っているので、上記のRAKUバージョンがとても似ていることは驚くべきではありませんでした.しかし、いくつかの重要な(そして時々歓迎)違いがあります.
< div class ="LagagCount - gig - Link - tag "
"スクリプトのID "https://gist.github.com/mjgardner/094b6c90e5957b5d336aa2dc3496f826.js//>
< div >
< p >最初に気付かなければならないのは、最初に少し少ないボイラープレートコードです.RAKUは若い言語であり、以下の下位互換性のある機能を有効にする指示を追加する必要はありません.また、このフィードファインダプログラムはまだ、WWW ::MechanizeとXML ::RSSをアノテーションで持ってくる必要がありますが、モジュールから読み込む必要がある関数とメソッドを持つ大きな言語ですPerl5 フェンスの側面p >
私はプログラムの大多数をラップすることを決めた MAIN ハンディキャップgives me command line arguments as variables だけでなくusage message 誰かがそれを呼ぶならば--help オプション.これは、スクリプトの作者のためのきちんとした等級性の機能は巧みに機能署名を再利用します、そして、私はそれをsignatures 特徴p >
また、rakuとperlは前者も違うhas a different concept of context , 式がその結果が単一の値(スカラー)または値のリストであることになっているかどうかによって異なって評価されるかもしれないところ.inline ::perl 5はデフォルトでリストコンテキストでPerl機能を呼びます、しかし、あなたはScalar 最初の引数としてtypeオブジェクトを呼び出します find_all_links (配列リファレンスを返す)content_type からreturn the first parameter HTTP内容型ヘッダの場合)p >
もう一つの興味深い違いは (elem) 演算子は、集合内のメンバーシップを決定します.これはRAKUのASCII方法のスペルです∈ シンボルを使うこともできます.!(elem) も綴られる . 両方とも私のキーボードでタイプするのが難しいので、私はより詳細な選択肢を選びました、しかし、あなたがあなたのコードがより数学的な表記法によく似ているならば、オプションがそこにあるのを知ってうれしいですp >
私もラクのものを使わなかった die エラーが発生した行を抑制する方法の主な理由で、エラーでプログラムを終了するルーチン.必要using a CATCH block そして、そのような小さなスクリプトのためにoverkillのように思われるその動作をカスタマイズするためにスローされた例外の型をキーにします.それはこんな感じだったでしょう
<> P >
クラスをハイライト表示する
{
    die $mech.uri ~ ' does not have an RSS feed'
        if $response.content_type(Scalar) !(elem) @rss_types;
    CATCH {
        default {
            note .message;
            exit 1;
        }
    }
}
< div >
疑う余地がないgolfed 読みやすさを犠牲にしてその冗長性を減らすために、しかし、私はPerlと1対1の比較をしようとするとき、巧妙なトリックに訴えたくありませんでした.より経験豊かなRAKU開発者は、下記のコメントでまっすぐに私をセットするために歓迎しますp >
私が指摘する最後の違いは、RAKUの歓迎の欠如ですdereferencing Perlと比較した演算子これは前者のコンセプトによるものですcontainers , どちらですstill learning about . かなりらしいDWIM 私のように、私は心配しません、しかし、それの背後に理解可能なメカニズムがあるということを知っていてうれしいですp >
私は全体的に私はラクにこの最初の冒険に満足していると私は今までの言葉を学んだことを楽しんだ.それは私が予想したようにPerlとは異なりません、そして、私がより多くを学ぶように、私はより多くのプロジェクトをコード化するのを予知することができます.地域社会 #raku IRC channel また、非常に友好的で親切だったので、時間許可としてそこにぶら下がっていますp >
あなたはどう思いますか?PerlとRAKUはより共存することを学ぶことができます、あるいは、彼らはライバルである運命にありますか?以下のコメントを残してください.p >
< hr/>
カバーイメージ:“Frenemies 2” そばMauricio Delgado ライセンス下CC BY-SA 2.0