なぜJaopなのか ラケットを遞ぶ理由

これは、 「なぜラケットなのか」ずいう蚘事の続きです。 なぜLispなのか 初心者ずしお、私はあらゆる偎面からLispに泚がれた称賛を理解できたせんでした。 䜕を考えればいいのか分かりたせんでした。 Lispが最終的に「深い啓発」を匕き起こすこずを理解する方法。 さお、あなたは蚀いたす。



私は簡単な質問がありたした 䜿甚は䜕ですか 前回の蚘事で、私はそれに答えようずし、誰かがLisp、特にラケットを孊びたい理由を芁玄したした。



ラケットの初心者ずしお私にずっお最も䟡倀のある9぀の蚀語機胜のリストをたずめたした。 たずえば、機胜番号5は「新しいプログラミング蚀語の䜜成」です。 このメ゜ッドは、 蚀語指向プログラミング 、たたはJOPずも呌ばれたす 。



それ以来、IOPは私の倧奜きなRacketの郚分になり、ROPテクニックずRacketツヌルに぀いお説明しおいるオンラむンブックBeautiful Racketで賞賛を共有したした。



私の仕事の䞀䟋は花粉です。 このプログラミング蚀語は、オンラむンブックの掻版印刷のために䜜成したした。 花粉では、前の段萜は次のようにプログラムされおいたす。



#lang pollen     ◊link["https://beautifulracket.com/appendix/why-racket-why-lisp.html#so-really-whats-in-it-for-me-now"]{  },        Racket. ,  № 5 — «   ».     ◊em{- },  ◊em{}.
      
      





もう1぀の䟋は、゜ヌスコヌドずしおBNF文法を䜿甚するパヌサヌゞェネレヌタヌ lex/yacc



スタむルであるbragです。 bf蚀語の簡単な䟋



 #lang brag bf-program : (bf-op | bf-loop)* bf-op : ">" | "<" | "+" | "-" | "." | "," bf-loop : "[" (bf-op | bf-loop)* "]"
      
      





どちらの蚀語もRacketに実装されおおり、通垞のRacketむンタヌプリタヌたたはRacket IDEDrRacketず呌ばれる内で実行できたす。



䞻な問題



そしおそれでも...この本は䜕千人もの人々にラケットの探玢を開始させたずいう事実にもかかわらず、私がか぀お批刀したLispファンず同じ玠早い螏み台に足を螏み入れおいるように思えたす。



NOPがずおもクヌルなら、なぜ本を読むのに数日費やすのでしょう。 そうだね 苊劎せずにすべおを簡単に説明できたす。 2぀の簡単な質問に答える必芁がありたす。



  1. 蚀語プログラミングに最適な問題は䜕ですか

  2. ラケットが蚀語の䜜成に最適なのはなぜですか


2番目の質問は簡単です。 最初はいいえです。 私は圌に䜕床も尋ねられたした。 ポッタヌスチュワヌト刀事の有名なフレヌズをよく匕甚したした。芋ればわかるでしょう。 答えは本圓に興味がある人には十分です。 しかし、埅機しおいお実質的な議論を聞きたい人のためではありたせん。



だから、私はしようずしたす。 私はコンピュヌタヌサむ゚ンスの教授ではなく、プログラミング蚀語の理論に぀いお話すこずはできないこずに泚意しおください。 むしろ、私は実甚的な目的のためにラケットずドメむン固有蚀語DSLを䜿甚しおいたす。私の毎日の仕事はそれらに䟝存しおいたす。 したがっお、私は実甚的な偎面に焊点を圓おたす。



短い答え



  1. JOPは実際にはむンタヌフェヌス蚭蚈方法です。 最倧粟床を維持しながら、 最小限の衚蚘を必芁ずするタスクに最適です。 最小衚蚘ずは、蚱可される唯䞀の衚蚘を意味したす。 これ以䞊。 最倧粟床、぀たりこの衚蚘の意味は、たさにあなたの蚀うこずです。 あいたいさやパタヌンはありたせん。 IOPは他に類を芋ないほどポむントを獲埗したす。



    入院患者は、NOPの恩恵を受ける特定のカテゎリのタスクに進むこずができたす 。

  2. ラケットはマクロシステムのため、OOPに最適です。 コンパむラヌスタむルで動䜜し、コヌド倉換を簡玠化したす。 ラケットマクロシステムは他のどのシステムよりも優れおいたす。


この時点で、蚘事の読者の半数は、私の論文を批刀する匿名のコメントを公開したいず思うでしょう。 しかし、心に留めおおいおくださいいずれにしおも、私は勝った。 JOPずRacketにより、プログラミングの生産性が非垞に向䞊したした。 あなたもこれらの利点を掻甚できるように、この知識を共有できるこずを嬉しく思いたす。 しかし、これらのツヌルが私の秘密の歊噚のたたであるならば、私も喜んでいるでしょう。 この堎合、私は最も生産性の高いプログラマヌの0.01にずどたり、残りの99.9よりも印象的で有益な結果を埗たす



したがっお、遞択はあなた次第です。



長い答え



最も重芁な質問に぀いお考えるず、それらは1぀のメタ質問に垰着したす栞兵噚の利点を説明するのはなぜ難しいのですか



おそらく、 蚀語に぀いお話すずき、甚語には、蚀語ずは䜕か、それが䜕をするのかに぀いおの期埅が蟌められおいたす。 私たちはこのパラダむムの䞭にいたすが、プログラミング蚀語の䟡倀を理解するこずは困難です。



しかし、芏暡を瞮小し、蚀語を人間ずコンピュヌタヌのむンタヌフェむスのより広いカテゎリの䞀郚ず芋なすず、NOPの特定の利点を理解しやすくなりたす。 やっおみたしょう。



䞀般的な蚀語ずドメむン固有の蚀語



たず、少し甚語を説明したす。 蚀語指向プログラミングOOPずも呌ばれたすは、新しい蚀語を䜜成し、その䞊でプログラムを䜜成するこずにより、プログラミングの問題を解決するアむデアです。 倚くの堎合、このような「小さな蚀語」はドメむン固有蚀語DSLず呌ばれたす。



名前が瀺すように、サブゞェクト指向蚀語は特定の分野のタスクに適合しおいたす。 たずえば、PostScript、SQL、 make



、正芏衚珟、 .htaccess



およびHTMLは、サブゞェクト指向蚀語ず芋なされたす。 圌らはすべおをしようずしおいるわけではありたせん。 むしろ、圌らは䞀぀のこずをうたくやるこずに集䞭しおいたす。



スペクトルのもう䞀方の端には、 汎甚蚀語がありたす。 ここでは、C、Pascal、Perl、Java、Python、Ruby、Racketなどが衚瀺されたす。なぜこれらはサブゞェクト指向ず芋なされないのですか なぜなら、圌らは広範囲のコンピュヌティングタスクに身を眮くからです。



実際には、汎甚蚀語は特定の分野に特化しおいたす。 たずえば、Cは他のシステムプログラミングよりも優れおいたす。 Perl-システム管理のスクリプト甚。 Pythonは初心者向けの蚀語ずしお際立っおいたす。 蚀語指向プログラミング甚のラケット。 いずれの堎合も、これは蚀語が元々蚭蚈されたものです。



DSLず汎甚蚀語の間には现かい境界線がありたす。 たずえば、Rubyは汎甚蚀語ずしお䜜成されたしたが、Ruby on Railsずの関連付けにより、䞻にWebアプリケヌションで人気を博しおいたす。 䞀方、JavaScriptは、もずもずはWebブラりザヌスクリプト甚のサブゞェクト指向蚀語でした。 しかし、圌はりむルスのように倉異し、それ以来、元のタスクをはるかに超えお成長したした。



蚀語ずは䜕ですか



この広い範囲党䜓が蚀語ず呌ばれる堎合、蚀語の定矩機胜は䜕ですか



あなたが考えおいるこずは知っおいたす。 HTMLは蚀語ではありたせん。 これは単なるマヌクアップです。 圌はアルゎリズムを説明するこずはできたせん。」 たたは「正芏衚珟は蚀語ではありたせん。 圌らは自分で働きたせん。 別の蚀語の単なる構文です。」



私もそう思っおいたした。 しかし、よく芋るず、これらの違いがより曖昧に芋えたした。 したがっお、私の最初の䞻芁なステヌトメント3぀のうちは、プログラミング蚀語は本質的に亀換の媒䜓であるずいうこずです 。 これは、人ずコンピュヌタヌが理解できる衚蚘システムです 。



衚蚘法衚蚘法は、蚀語に構文があるこずを意味したす。 「明確」ずは、その構文で蚀語が意味を䌝えるこずを意味したす たたは、より掟手な単語が䜿甚されおいる堎合は、 セマンティクス 。 この定矩は、すべおの汎甚プログラミング蚀語を察象ずしおいたす。 そしおすべおのDSL。 ただし、すべおのデヌタストリヌムではありたせん。これに぀いおは埌で詳しく説明したす。



ずころで、「プログラミング」ず「蚀語」は慣甚的に䞀緒に䜿甚される単語ですが、これらの蚀語はコンピュヌタヌをプログラムするために人々によっお䜿甚されるだけではありたせん。コンピュヌタヌによっお私たちず通信するために䜿甚される堎合がありたすたずえば、S匏、時には互いに通信するためにたずえば、XML、JSON、HTML。間違いなく、これらの機胜を陀倖するのは間違っおいるように思えたすが、実際には、はい-プログラミング蚀語で通垞行うこずは、実際にはプログラミングです。



HTMLコヌドを怜蚎しおください。コンピュヌタヌ、特にWebブラりザヌにWebペヌゞを描画する方法を䌝える方法です。 これは、人間ずコンピュヌタヌが理解できる衚蚘法山括匧、タグ、属性などです charset



属性は文字゚ンコヌドを瀺し、 p



タグには段萜などが含たれたす。



これが小さなHTMLペヌゞです。



 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>My web page</title> </head> <body> <p>Hello <strong>world</strong></p> </body> <html>
      
      





HTMLがプログラミング蚀語であるこずに同意しないず仮定したす。 いいね Pythonでペヌゞを衚瀺したす。 これは本圓のプログラミング蚀語ですよね



 print "<!DOCTYPE html>" print "<html>" print "<head>" print "<meta charset=\"UTF-8\">" print "<title>My web page</title>" print "</head>" print "<body>" print "<p>Hello <strong>world</strong></p>" print "</body>" print "<html>"
      
      





Pythonがプログラミング蚀語であるがHTMLがそうでない堎合、このPythonサンプルはプログラムですが、HTMLサンプルはそうではありたせん。



明らかに、これは拷問された違いです。 ここで、Python化は耇雑さずステレオタむプ化以倖には䜕も远加したせん。 気の毒なこずは、Webプログラムを管理するずいう芳点から芋たPythonプログラムの唯䞀の興味深いセマンティックコンテンツは、HTMLに埋め蟌たれおいるこずですおそらくDOCTYPE



、 meta



、 strong



などのHTMLタグは匕数を取る関数ず考えるこずができたす。 ロゞックを䜿甚するず、HTMLは単玔で柔軟性は劣りたすが、プログラミング蚀語のたたであるず結論付けられたす。



埋め蟌み蚀語



HTMLずPythonを䜿甚した䟋。 しかし、DSLを別の蚀語に埋め蟌むこずはいたるずころにありたす。 この方法で䜿甚される蚀語は、 組み蟌みず呌ばれたす。 それらは、蚀語プログラミングの最も䞀般的な圢匏を衚しおいたす。 プログラマヌずしお、あなたはその名前を知らなくおもJOPに長幎頌っおきたした。



たずえば、正芏衚珟他の䟋文字列の曞匏蚭定甚のprintf



、日付/時刻パタヌン甚のCLDR、SQL。 正芏衚珟を独立した蚀語ず考えるこずはできたせん。 しかし、すべおのプログラマヌはそれが䜕であるかを知っおいたす



 ^fo+(bar)*$
      
      





さらに、おそらくこの正芏衚珟をお気に入りのプログラミング蚀語に導入すれば、うたくいくでしょう。 このような䞀貫した動䜜は、正芏衚珟衚蚘が倖郚蚀語 POSIX であるためにのみ可胜です。



HTMLず同様に、ホスト蚀語衚蚘で同等の匏を䜜成できたす。 たずえば、ラケットはSchemeの正芏衚珟 SREをサポヌトしおいたす。これらはS匏衚蚘の正芏衚珟です。 䞊蚘のテンプレヌトは次のように蚘述されたす。



 (seq bos "f" (+ "o") (* (submatch "bar")) eos)
      
      





しかし、ラケットプログラマはSRE匏をほずんど䜿甚したせん。 それらは長すぎお芚えにくい。



埋め蟌たれたDSLの別の遍圚的な䟋数匏。 すべおのプログラマヌは、これが䜕を意味するか知っおいたす



 (1 + 2) * (3 / 4) - 5
      
      





数孊的な衚珟だけでは、興味深いプログラムは䜜成されたせん。 それらを他の蚀語構成芁玠ず組み合わせる必芁がありたす。 しかし、正芏衚珟ず同様に、これは人間工孊的で実甚的な蚘録です。 数匏には、人ずコンピュヌタヌの䞡方が理解できる独自の衚蚘法ず意味が​​あるため、別個の組み蟌み蚀語ずしおの資栌がありたす。



HTMLがプログラミングされおいるず冗談を蚀っおいたすか



いいえ、そうです。 HTML正芏衚珟ず数孊衚珟の䞡方が初歩的なプログラミング蚀語ずしお適栌であるこずを確認したす。 これは、HTMLたたは正芏衚珟や数孊衚珟を曞くこずが初歩的なプログラミングずしお適栌であるこずを意味したす。



パニックしないでください。 もちろん、HTMLず算術のみの知識を持぀LinkedInの「プログラマヌ」ですが、これはナンセンスですただし、1週間でおそらく18䞇ドルの仕事に就くでしょう。 しかし、これは別の問題です。劎働垂堎で「プログラマヌ」ずはどういう意味ですか。 私たちはそれに぀いお話しおいたせん。



チュヌリング党䜓トラップ



プログラミング蚀語のこの定矩がいらいらする堎合は、おそらく、実際のプログラミング蚀語はすべおの可胜なアルゎリズムを衚珟する必芁があるず思いたす。぀たり、 チュヌリング完党であるべきです。



私は盎感的にそのような考えが瀺唆するこずを理解しおいたす。 各汎甚プログラミング蚀語はチュヌリング完党です。



しかし、問題はこれが䜎いバヌであるこずです。 チュヌリング完党性は、実䞖界での蚀語の䜿甚に察応しない技術的な枬定基準です。 たずえば、正芏衚珟はチュヌリング完党ではありたせんが、最小限の衚蚘で倚くの蚈算を衚珟する堎合に圹立ちたす。 HTMLもチュヌリング完党ではありたせんが、ブラりザヌを制埡するのに䟿利な方法です。 それどころか、 bf蚀語はチュヌリング完党ですが、最も些现なタスクでさえ、䜕マむルもの通過䞍可胜なコヌドを必芁ずしたす。



蚀語制限



蚀語の定矩の䞋に䜕かありたすか いや





むンタヌフェむスずしおの蚀語



䞊蚘では、プログラミング蚀語を人ずコンピュヌタヌの間の「亀換の媒䜓」ずしお説明したした。 したがっお、蚀語はより広いカテゎリヌに分類され、これをむンタヌフェヌスず呌びたす 。



これは、2぀目の基本的なステヌトメント3぀のうちに぀ながりたす 。぀たり、 蚀語プログラミングは基本的にむンタヌフェむスを蚭蚈する方法です 。 むンタヌフェヌスに぀いお考えたいなら、JOPが奜きです。 そうでない堎合でも、他の方法では達成できない可胜性のあるむンタヌフェむスを䜜成するJOPが倧奜きです。



むンタヌフェヌスずしおの蚀語の私のお気に入りの䟋の1぀はbragで、これはRacketで䜜成されたパヌサヌゞェネレヌタヌ蚀語です。 lex / yaccツヌルチェヌンを䜿甚したこずがある堎合、倚くの堎合、目暙はBNF文法からパヌサヌを生成するこずであるこずを知っおいたす。 たずえば、 bfの堎合 、次のようになりたす。



 bf-program : (bf-op | bf-loop)* bf-op : ">" | "<" | "+" | "-" | "." | "," bf-loop : "[" (bf-op | bf-loop)* "]"
      
      





汎甚蚀語でパヌサヌを䜜成するには、この文法を倚数のネむティブコヌドに翻蚳する必芁がありたす。 これは退屈な仕事です。 そしお無意味です-文法をすでに曞き留めおいたせんか なぜ再びするのですか



しかし、 brag



私たちの欲望を満たしたす。 パヌサヌを䜜成するには、ファむルに#Lang brag



ずいう行を远加するだけで、BNF文法をbrag



゜ヌスコヌドに魔法のように倉換したす。



 #Lang brag bf- : (Bf-op | Bf-loop)* bf-op : ">" | "<" | "+" | "-" | "."| "," Bf-loop : "["(Bf-op | Bf-loop)* "]"
      
      





できた コンパむル時に、このファむルはこのBNF文法を実装parse



関数を゚クスポヌトしたす。



これは他のオプションよりも明らかに優れおいるため、私のお気に入りの䟋の1぀です。 さらに、汎甚蚀語では、このようなむンタヌフェむスは実際には䞍可胜です。



しかし、JOPプログラマヌは垞にそのようなむンタヌフェヌスを䜜成したす。



蚀語が最高のむンタヌフェヌスである堎合



これにより、 蚀語にはむンタヌフェヌスよりも優れた独自の利点があるずいう 、3番目の最終的な基本理論に至りたす 。 もちろん、以䞋のカテゎリは網矅的でも排他的でもありたせん。 しかし、そのような状況では、IOPには倚くのメリットがあるこずがわかりたした。



1.スキルの䜎いプログラマヌ、非プログラマヌ、たたは怠zyなプログラマヌ甚のむンタヌフェヌスを䜜成する堎合埌者のカテゎリヌのサむズを過小評䟡しないでください。



たずえば、ラケットには掗緎されたWebアプリケヌションラむブラリがありたす。 ただし、Web web-server/insta



蚀語を䜿甚しお簡単なWebサヌバヌをすばやく起動するこずもできweb-server/insta



。



 #lang web-server/insta (define (start request) (response/xexpr '(html (body "Hello LOP World"))))
      
      





Matthew Flattの蚘事「Craating Languages in Racket」は、プレむ可胜なテキストアドベンチャヌを生成する蚀語を瀺しおいたす。 brag



ように、プログラムずいうよりは仕様のように芋えたすが、動䜜したす



 #lang txtadv ===VERBS=== north, n "go north" south, s "go south" get _, grab _, take _ "get" ===THINGS=== ---cactus--- get "Ouch!" ===PLACES=== ---desert--- "You're in a desert. There is nothing for miles around." [cactus, key] north meadow south desert
      
      





2.衚蚘を簡略化する堎合。 1぀の䟋は正芏衚珟です。 別の䟋は、オンラむンの本を曞くための私の䞻題指向蚀語である花粉です。 PollenはRacketに䌌おいたす。ここでのみ、テキストモヌドで䜜業を開始し、コンテンツに埋め蟌たれたRacketコマンドを瀺すために特殊文字を䜿甚したすPollenはScribbleず呌ばれるRacketドキュメント蚀語に基づいおおり、これは負荷の倧郚分を占めたす。 したがっお、この段萜の始たりは次のようにプログラムされおいたす。



     .    —  .   —  -  ◊link["https://pollenpub.com/"]{Pollen}   -.
      
      





Pollenは、必芁なすべおのタグを貌り付け、それらを絶察的なHTMLに倉換するこずを重芖しおいたす。 手動のマヌクアップペヌゞを完党に制埡のすべおの利点はただありたすが、欠点はありたせんたずえば、誀っお閉じられおいないタグを残すこずはできたせん。



簡易衚蚘法のもう1぀の䟋は、次のようなLindenmayerシステムのフラクタル生成および描画蚀語であるlindenmayer



です。











兞型的なラケットでは、Lindenmayerプログラムは次のようになりたす。



 #lang racket/base (require lindenmayer/simple/compile) (define (finish val) (newline)) (define (A value) (display 'A)) (define (B value) (display 'B)) (lindenmayer-system (void) finish 3 (A) (A -> AB) (B -> A))
      
      





ただし、ファむルの先頭にある#lang



衚蚘を倉曎するだけで、簡易衚蚘を䜿甚できたす。



 #lang lindenmayer/simple ## axiom ## A ## rules ## A -> AB B -> A ## variables ## n=3
      
      





この蚀語は、あなたがすでにLシステムに粟通しおいるこずを前提ずしおいたす。 しかし、簡略化された衚蚘法により、垌望するこずを実行するプログラムに垌望を簡単に曞き留めるこずができたす。



3.既存の衚蚘を䜿甚する堎合。 䞊蚘で、 brag



が゜ヌスコヌドずしおBNF文法を䜿甚する方法を芋たした。



 #lang brag bf-program : (bf-op | bf-loop)* bf-op : ">" | "<" | "+" | "-" | "." | "," bf-loop : "[" (bf-op | bf-loop)* "]"
      
      





別の䟋。 Pollenを詊した人は、「はい、それは玠晎らしいこずですが、Markdownが奜きです。」ず蚀いたした。 問題ありたせん pollen/markdown



ダりンは、花粉セマンティクスを提䟛する花粉匁ですが、通垞のマヌクダりン衚蚘を受け入れたす。



     .    —  .   —  -  [Pollen]("https://pollenpub.com/")   -.
      
      





最も楜しいこずは Markdownパヌサヌず既存のコヌドを組み合わせお、この方蚀をたった1時間で曞きたした。



4.他の蚀語の䞭間タヌゲットを䜜成する堎合。 JSON、YAML、S匏、およびXMLはすべお、マシンの読み取りおよび曞き蟌み甚のデヌタ圢匏を定矩するドメむン固有の蚀語です。



Perfect Racketでは、1぀のトレヌニング蚀語はjsonic



ず呌ばれjsonic



。 JSONにラケット匏を埋​​め蟌むこずができるため、JSONをプログラム可胜にできたす。 ゜ヌスコヌドは次のようになりたす。



 #lang jsonic // a line comment [ @$ 'null $@, @$ (* 6 7) $@, @$ (= 2 (+ 1 1)) $@, @$ (list "array" "of" "strings") $@, @$ (hash 'key-1 'null 'key-2 (even? 3) 'key-3 (hash 'subkey 21)) $@ ]
      
      





通垞のJSONにコンパむルしたす。



 [ null, 42, true, ["array","of","strings"], {"key-1":null,"key-3":{"subkey":21},"key-2":false} ]
      
      





5.プログラムの䞻芁郚分が構成である堎合。 たずえば、DotfilesはDSLずしお蚘述できたす。 ラケットのより耇雑な䟋は、JSON AlamaのRiposte、JSONベヌスのHTTP APIテスト蚀語です。



 #lang riposte $productId := 41966 $qty := 5 $campaignId := 1 $payload := { "product_id": $productId, "campaign_id": $campaignId, "qty": $qty } POST $payload cart/{uuid}/items responds with 200 $itemId := /items/0/cart_item_id GET cart responds with 200
      
      





ミニチュアスクリプト蚀語ずしお、Riposteは平均的なドットファむルよりもはるかにスマヌトです。 HTTPトランザクションに必芁なすべおの䞭間コヌドを隠し、ナヌザヌがテストの䜜成に集䞭できるようにしたす。 これはただハりスクリヌニングです。 しかし、少なくずもあなたが気にする䞖垯に集䞭するこずができたす。



ラケットを遞ぶ理由



倚くの堎合、JOPの批刀者は次のように尋ねたす。「ドメむン固有の蚀語を䜜成する理由は䜕ですか ネむティブラむブラリを䜜成する方が簡単ですか」



いいえ、適切なツヌルがあれば簡単ではありたせん。 ラケットは普通ではありたせん。NOP専甚にれロから蚭蚈されおいたす。したがっお、ラケットにDSLを実装するこずは、他の方法よりも速く、安く、簡単です。たずえば、私の本の最初のレッスンでは、ラケットを䜿甚したこずがない堎合でも、1時間で新しい蚀語を開発する方法を瀺したした。



RacketのすべおのDSLの内郚では、゜ヌスから゜ヌスぞのコンパむラヌが実際に動䜜し、DSL衚蚘ずセマンティクスを同等のRacketプログラムに倉換したす。このため、Racket DSLは手動で蚘述されたCコヌドほど高速に実行できたせんが、すべおのRacketツヌルずラむブラリは各DSLで䜿甚できたす。生産性は䜎䞋したすが、利䟿性は繰り返し勝ちたす。 DSLの䜜成が䟿利で簡単な堎合、それははるかに広範な問題の珟実的な遞択肢になりたす。



したがっお、批刀に答えるために-いいえ、DSLは必ずしもネむティブラむブラリよりも倚くの䜜業を必芁ずしたせん。さらに、すでに芋たように、むンタヌフェむスずしお、蚀語はネむティブラむブラリではできないこずを実行できたす。



なぜマクロなのか



すべおのDSLはRacketにコンパむルされるため、プログラマはDSL衚蚘をネむティブのRacketに倉換する構文倉換プログラムを䜜成する必芁がありたす。これらの構文コンバヌタはマクロず呌ばれたす。実際、それらはRacketコンパむラの拡匵ずしお説明できたす。



ラケットマクロシステムは広倧で゚レガントで、間違いなく王冠の真珠です。私の本の倚くはラケットマクロを扱う喜びに぀いおです。次の2぀の優れた機胜に名前を付けるこずができたす。



  1. Racket , . . , , Racket , , , , , . ( . « » ).

  2. ラケットマクロは衛生的です。぀たり、デフォルトでは、マクロによっお䜜成されたコヌドは、マクロが定矩されおいるレキシカルコンテキストを保持したす。実際には、これにより、DSLで通垞必芁ずされる膚倧な量の䞍芁なゞェスチャヌがなくなりたす詳现に぀いおは、「衛生」の章を参照しおください。


たずえば、PythonでDSLを実装するこずはできたすか もちろん。実際、私は最初のDSLを特にPythonで䜜成したしたが、それでも私のタむプデザむン䜜業で䜿甚しおいたす。たあ、それ。䞀床だけで十分でした。それ以来、私はラケットを䜿甚しおいたす。



結論YaOPでの勝利



珟時点では、次の2぀の反応のいずれかがありたす。



  1. « , , » . , . , , . . . , . .

  2. «, , c Racket » . , - Riposte , — ( ):



    [ ] - Racket. , , - 
 : « API , ?» : « Riposte». , , [DSL], , . «» Racket. DSL , .


蚘事の最埌に「なぜラケットなぜLispなのか「 Lisp蚀語」は、プログラマヌや思想家ずしおの可胜性を解き攟ち、それによっお達成できるこずぞの期埅を高める機䌚を䞎えるず蚀いたした。」



IOPは同様の機䌚を提䟛したすプログラミング蚀語が私たちのために䜕ができるかに぀いおの期埅を高めるこずです。蚀語はブラックボックスではありたせん。これらは、蚭蚈可胜なむンタヌフェむスです。同時に、私たちはプログラムの助けを借りお䜕ができるかずいう新しい可胜性を切り開いおいたす。



最適なプログラミング手法が芋぀かったら、それを䜿甚しおください。OOPずRacketができたので、二床ず戻っおきたせん。



さらに読む






All Articles