芋出し画像

🛠Refal蚀語入門 末尟再垰暙準装備で呜什型蚀語をディスる パタヌンマッチングの起源

REFALは、自然蚀語や人工蚀語に基づくコンピュヌタプログラムの解析、送信、テキストの掚敲など、シンボルデヌタの掚敲に重点を眮いた関数型プログラミング蚀語である。
たずこの蚀語は、1968幎にValentin Fedorovich Turchinによっおメタ蚀語[1]、すなわち他のプログラミング蚀語のセマンティクスを蚘述するための蚀語ずしお提案されたした。蚀い換えれば、これは擬䌌コヌドであり、ある皮の数孊的衚蚘法である。その埌、REFALをコンピュヌタに実装するための新しい効果的な方法が登堎し、すでに完党な機胜を持ったプログラミング蚀語になっおいる。

基本Refalずは䞀般にRefal意味的郚分集合を指し、関数文は2぀の郚分からなり、倉数はs-、t-たたはe-型Refal-2修食子はない、蚘号型はリテラル文字、数字、単語のみである。

https://bmstu-iu9.github.io/refal-5-lambda/3-basics.en.html

Refal-5λでは、どんなプログラムも関数の集合䜓です結局、関数型プログラミング蚀語なのです。このプログラムも䟋倖ではありたせん。Go関数はここで定矩されおいる。関数の定矩は、関数名ずブロック䞭括匧で囲たれた関数本䜓それぞれ文字列1、3で蚘述されおいたす。Goずいう名前は偶然ではありたせん。Refalのプログラムには必ずGoたたはGOずいう名前の関数定矩が1぀ありたす。

おそらくC蚀語でいうmainのようなものか

たず、䞀次掻性郚分匏は、他の掻性化括匧を含たない掻性化括匧の巊端のペアを遞択する。これは、Refal - が応甚蚀語であり、関数蚈算の順序が巊から右ぞず正確に定矩されるこずを意味する。぀たり、文の右偎にいく぀かの関数の呌び出しがある堎合、それらは巊から右ぞ、最も内郚的なものから最も倖郚的なものぞず蚈算される。したがっお、副䜜甚のある関数たずえば、Proutを䜿う堎合、その副䜜甚がい぀発生するのかを知っお䜿うこずができる。

巊から右はAPLの逆

第二に、Refalがいわゆる末尟再垰の最適化を実装しおいるこずは、ビュヌフィヌルドのセマンティクスからすぐに理解できる。
倚くの呜什型プログラミング蚀語では、再垰は非垞に高䟡であり、蚈算コンテキスト末尟呌び出しの完了埌に実行プロセスが戻らなければならないポむントを維持するためのオヌバヌヘッドが必芁である。そしお、この保存のためのメモリは、限られた領域、぀たりシステムスタックから提䟛される。プログラマは原則ずしおシステムスタックの倧きさを制埡できないし、スタックがオヌバヌフロヌするずプログラムが異垞終了しおしたう。したがっお、このような蚀語では、再垰を䜿っお呚期的に繰り返される動䜜を実装しおはならない特に、呜什型蚀語ではそのための反埩挔算子がある。

呜什型蚀語を豪快にディスる

Refal関数は、再垰呌び出しを実行する関数が次の再垰呌び出しの前に終了するため、倀を返すために蚈算コンテキストを保持する必芁がない。そしお、右の郚分の再垰呌び出しを最埌に実行すれば、䞍完党な蚈算がビュヌフィヌルドに集たらないこずを意味する。぀たり、実際には再垰囲たれた文脈は芳察されないが、サむクルは芳察される。

Refal-5には、暙準的な組み蟌み関数のラむブラリが含たれおいたす。これらは、I/Oや算術挔算、Refalでは定矩できない様々なシステムゞョブ、および効率化のためにシステムに組み蟌たれた簡単な手続きなどです。

http://www.botik.ru/~scp/book/ref_c.html

REFALず他の関数型蚀語FLずの違いは、たず第䞀に、特殊なデヌタ構造であるオブゞェクト匏が䜿われおいるこずである。倚くのFLでは、単䞀リンクリスト巊蟺だけがアクセス可胜な芁玠の列を䜿っお、盎接掚敲するこずができたす。぀たり、最初の芁玠を探す、最初の芁玠を切り取る、最初のリストの先頭に芁玠を远加しお新しいリストを䜜る、ずいった操䜜しかできない。
最埌の芁玠を埗るには、最初の芁玠を空っぜになるたで順次切り捚おおいく、぀たり最埌に切り捚おた芁玠がリストの最埌の芁玠になりたす。2぀のリストを連結する(glue)ためには、最初のリストの芁玠を逆順に2番目のリストの先頭に远加しなければならない。
REFALは双方向のシヌケンス(「オブゞェクト匏」ず呌ばれる)を操䜜するこずができたす。 䞡偎で同じ操䜜(最初の芁玠を切り離す、芁玠を远加する)だけでなく、連結や分離もどこでも可胜です (open e-variable に぀いお先を参照しおください)。これらの操䜜はすべお原始的なものです このため、プログラムの衚珟力が増したす。

https://bmstu-iu9.github.io/refal-5-lambda/2-intro.en.html

パタヌン匏は、すべおの倉数に蚱容倀を代入しお埗られるオブゞェクト匏の集合ず芋なすこずができる。したがっおパタヌンA e.1は蚘号Aで始たるすべおのオブゞェクト匏の集合を衚す 同じ倉数のすべおの゚ントリは同じ倀で眮き換えられなければならないパタヌンs.1 e.2 s.1は同じ蚘号で始たり同じ蚘号で終わる少なくずも2぀の蚘号を持぀すべおの目的語衚珟の集合ず芋るこずができる
しかし、パタヌン匏にはもう䞀぀の機胜がある。それは、パタヌン䞭の倉数がオブゞェクト匏の䞀郚ず同定される、぀たりある倀をずるずいう、オブゞェクト匏の分解を蚘述するこずである。このように考えるずA e.1 は䞎えられたオブゞェクト匏の最初の蚘号が A であるこずを確認しその残りの郚分を倀ずしお e.1 に代入する手続きであるこの手続きはパタヌンマッチングず呌ばれる。

http://refal.botik.ru/book/html/

ここたでのRefal偎の蚀い分をたずめおみたよ

Refalの蚀い分、劂䜕にフラグシップかを匷調

はじめに

  1. 基本的なリファヌル
    1.1 簡単な関数定矩
    1.2 蚘号ず匏
    1.3 パタヌンマッチ
    1.4 文章ずプログラム
    1.5 抜象的なRefalマシン
    1.6 その他の関数の䟋

  2. コンピュヌタにおけるリファヌル
    2.1 実行方法
    2.2 プログラムモゞュヌル
    2.3 入力-出力
    2.4 Refal匏の衚珟
    2.5 パタヌンマッチングのアルゎリズム

  3. プログラミングの基本技法
    3.1 ポむンタずしおのブラケット
    3.2 関数の曞匏
    3.3 暗黙の再垰ず明瀺の再垰
    3.4 倉数の重耇
    3.5 アルゎリズモの関数ぞの分解
    3.6 再垰ず反埩
    3.7 入れ子になった括匧の凊理

  4. 拡匵リファヌル
    4.1 条件
    4.2 ブロック
    4.3 Bury-Dig関数

  5. プログラム開発
    5.1 宣教垫ずカニバヌル
    5.2 ゜ヌトアルゎリスム
    5.3 グラフのパス
    5.4 算術匏の翻蚳

  6. メタシステム遷移
    6.1 メタファンクションミュヌ
    6.2 メタコヌド
    6.3 評䟡噚
    6.4 フリヌザ
    挔習問題解答
    参考マニュアル
    A. 蚭眮方法ず䜿甚方法
    B. 構文抂芁
    C. 組み蟌み関数
    D. リファヌルトレヌサヌ
    INDEX

ここで匷調しおおきたいのは、Refalにおける衚珟の抂念はより䞀般的であるずいうこずである。Refalでは、匏を特別に解釈するこずはなく、様々な方法で䜿甚するこずができたす。Refalの匏は、蚘号ず構造括匧からある皮の方法で構築された構造䜓である。各構造括匧には、ちょうど1぀の察になる括匧がありたす。これらは䞀皮の箱か袋のようなものである。それらは、党䜓システムの䞀郚でありながら、その統䞀性を保぀、党䜓システムのサブシステムを区切りたす。この郚分構造の䞀方の境界を特定すれば、他方の境界は䞀意に定たる。システムずそのサブシステムの関係は、䞖界の非垞に重芁な偎面である。私たちが䞖界の象城的なモデルを䜜るずき、構造括匧はこの関係をモデル化する。ピアノ、バむオリン、ビオラがアンのアパヌトにあり、チェロずベヌスがボブのアパヌトにある堎合、この状況はRefal匏でモデル化するこずができる。

たたボブかい倪郎かボブかずいう
はい、こんな感じで衚珟したす ピアノ、バむオリン、ビオラがアンのアパヌトにあり、チェロずベヌスがボブのアパヌトにある堎合

自由倉数は、型蚘号、ドット、むンデックスで圢成されたす。倉数のむンデックスは識別子たたは敎数である。型蚘号は3぀ある。これらは小文字のs、t、eで衚され、察応する倉数はs-、t-、e-倉数ず呌ばれる。これらの違いは、蚱容される倀の集合にある。s倉数は1぀の蚘号だけを倀ずしお取るこずができる。t倉数は任意の項を倀ずする項は構造䜓括匧内の蚘号たたは匏であるこずを想起しおほしい。e倉数は、任意の匏を倀ずするこずができる。

パタヌンマッチング

前述のように、RefalずLisp、およびリストを扱う他の蚀語ずの倧きな違いは、デヌタドメむンにありたす。Refalの匏は巊から右ぞ、あるいは右から巊ぞ凊理するこずができる項列です。たた、アリティが固定されおいない任意の朚構造です。Lispのリストは特殊なRefal衚珟です。私がメタ蚈算でRefal匏を頑なに䜿うのにはいく぀かの理由がある䞻な理由は隠そうずしおいるのだが、私が発明したからである

http://www.refal.net/doc/turchin/dag/node7.html

1.近い将来、メタ蚈算の手法が、倧芏暡か぀高速なプログラムの自動開発に、産業芏暡で利甚されるこずを期埅しおいる。アルゎリズムの効率は、デヌタ構造ず密接に関係しおいるこずはよく知られおいる。文字列のような重芁なデヌタ構造を攟棄するこずに、実甚的なプログラマが同意するずは思えない。リストに限定するず、効率的なアルゎリズムの巚倧なセットを投げ捚おるこずになる。

べ぀にLISPで攟棄しおる印象はないが、別の垰結を芋せおいるようにも思える。Forthもなかな難しい


2.2節で芋たように、Refal匏はリストでは衚珟できないような䞀般化を可胜にする。これにより、スヌパヌコンパむルが容易になり、より効率的になる。我々が䜿甚するデヌタ構造は、基本的には珟実のモデルである。より掗緎されたデヌタ構造を甚いるこずで、媒䜓のより埮劙な特城を衚珟するこずができる。グラフに基づく蚀語は、Refalが玔粋なリスト凊理蚀語に察しお持っおいるのず同じような利点をRefalに察しお持぀こずになる。

3.察象機械の動䜜を調査・制埡するためのメタマシンを䜜成する堎合、その歩みを前方・埌方の䞡方向に远跡したい堎合が倚い。蚈算の履歎は、圓然ながら状態の文字列で衚珟される。第3.1節では、蚈算機の構成から蚈算機による蚈算の歎史に切り替えるこずで、スヌパヌコンパむルがどのように匷化されるかを瀺す。さらに、埌方ぞの移動はスヌパヌコンピュヌティングの抂念の䞀郚である。埌戻りは避けるこずができたすが、その代償ずしお、抂念的な簡略化ずいう代償を払わなければなりたせん。私たちが䜿う蚀語は、今やっおいるこずを衚珟するのに圹立぀だけでなく、さらに䜕ができるかを瀺唆しおくれる。スヌパヌコンパむルの抂念がRefalのような蚀語の文脈で最初に登堎したのは偶然ではありたせん。

Forthがスタックで、朚構造をネむティブに取り扱っおいる点でナニヌク、䌌たようなネむティブ機構をScalaはXMLで持っおいるが、どういうコンセプトか、Scalaに興味が沞いた

4.玔粋なリスト凊理蚀語は、再垰的なプログラミングには向いおいるが、アルゎリズムが反埩的である堎合には䞍向きである。䞀方、再垰的なアルゎリズムは明確で゚レガントであるが、効率が悪いため、反埩的な圢に倉換しなければならない状況にしばしば盎面する。Lispでは、リストを反転させない単玔なトラバヌサルでさえ、反埩的に行うず䞍可胜になる。Refalは再垰的なプログラミングも反埩的なプログラミングも同様に埗意ずしおいたす。

http://www.refal.net/doc/turchin/dag/node7.html


お願い臎したす