絵文字Lisp

(金曜日)

それは、私がスタニスラフ・レムと共に小説「地球上の平和」(1985)で読んだという事実から始まりました。将来、言語でのコミュニケーションは絵文字の助けを借りたコミュニケーションに置き換えられるでしょう。 さまざまな絵文字や他のタイプの大きな絵への関心の高まりに関連して、私はむしろ予言的なように思えました。絵文字を使ってプログラムしたらどうなるでしょうか。 ネットワークを検索して、私はそのような考えがすでに人々の頭に入っていて、プロジェクトhttps://github.com/wheresaddie/Emojinalで具体化されたと確信しました

しかし、このプロジェクトは私を感心させませんでした。第一に、言語が完全ではなく、一般的に演算子の一部を絵文字に置き換える試みとしての著者のアプローチはあまり面白くありませんでした。



Lispは絵文字の上に置く方がはるかに良いと思った、閉じて開く括弧は絵文字のようなものであり、さらに言語自体は非常に簡単で、コンパイラは非常に迅速に記述でき、すべてを機能させるのに多くの実装を必要としない異なるデザイン。



ユーザーにこの新しい言語を簡単に試す機会を提供したかったので、ブラウザに埋め込むことを決定しました。 コンパイラー言語として、JavaScriptでコンパイルする任意の言語を選択できますが、JavaScriptのみを選択し、node.jsの環境とブラウザーの両方でコンパイルできるように記述することにしました。 私が達成したい2番目のポイントは、絵文字セットの可変性です。最初の操作から、絵文字表現の選択が本当に曖昧でないことを疑い始め、他の開発者がこの文字セットを置き換えて新しいものを見つけることができるようにすべてを行うことにしました絵文字プログラム。 このため、すべてのテストケースは、現在のセットが置き換えられるテンプレートとして書き込まれます。



文法を記述するための言語としてPEGを選択しましたが、唯一の問題は、条件の列挙によってUnicode文字を作成できないことでした(複数の文字であるため、最初と2番目の文字を個別に反復する必要がありました)。 さらに、PEGパーサーの再コンパイルに関連する困難がありました。そのたびに識別子の定義を変更し(括弧をかむ)、PEG.jsを使用してパーサーを再構築する必要があったためです。 かなり単純な決定が行われました-字句解析のためにプログラムを送信する前に、セットのブラケットの現在の文字を通常のブラケットに置き換えてから、通常のブラケットで解析します。 このようなPEGが判明しました。

start = s:sexpr* {return {type:"Program", body:s}} leftBracket = "(" rightBracket = ")" identifier = [\uD83D][\uDC36-\uDE4F] / [\uD83D][\uDE80-\uDEC5] / [\uFE0F] / [\u2702-\u27B0] / [\u24C2] / [\uD83C][\uDC04-\uDFE2] / [\u20E3-\u3299] number = [0-9]+ _ "whitespace" = [\t\v\f \n\u00A0\uFEFF]* sexpr = a:atom { return a; } / list list = leftBracket _ head:sexpr tail:(_ sexpr)* _ rightBracket _ { var result = [head]; for (var i = 0; i < tail.length; i++) { result.push(tail[i][1]); } return {type: 'List', contents:result}; } atom = d:number _ { return {type: 'Literal', value: parseInt(d.join(""), 10)}} / '"' d:(!'"' [az])* '"' _ { return {type: 'Literal', value: d }} / s:identifier _ { return {type: 'Identifier', name: s.join?s.join(""):s}}
      
      







さらに、簡単に:単純な標準ライブラリーに入る一連の関数を選択しました。これは次のとおりです。



そして彼らの仕事を実証するために、彼はフィボナッチ数の計算、それ自身の計算、そしていくつかの簡単なプログラムを書きました。

さらに、彼はより視覚的なデモンストレーションのためにgemojiプロジェクトの写真とコードを爆発させました。



これは、それ自体を計算するプログラムがどのように見えるかです:



ここで、月は括弧、動物は識別子、残りの構造は上にあります。



フィボナッチ数のプログラムは次のようになります。



これは、名前が犬である再帰関数です。 絵文字は連続して書くことができますが、異なる数字を参照する場合、連続する数字はスペースで区切る必要があります。



最初のバージョンでは、月の代わりに悲しい面白い顔文字が使用されましたが、その類似性のために、コードを構築するのがはるかに困難でした。そのため、月に切り替えました。 確かに、絵文字の標準セットに異なる方向を見る月が存在する理由は、私には完全には明らかではありません。



その過程で、絵文字はあまりサポートされていないことがわかりました。たとえば、sublimeではそれらの一部のみをコピーできます。計算するプログラムのテキストをコピーしようとすると、クリップボードでは空になります。 デスクトップブラウザのうち、Safariは多かれ少なかれ普通の絵文字です。 コンパイラはユニコード文字の形で絵文字をサポートしており、replもありますが、端末を書くことはそのような文字をあまりよくサポートせず、お互いを攻撃しますが、将来状況が改善され、コマンドラインですぐに絵文字ユーティリティ呼び出しを書くことができることを願っています。



すべてのソースはhttps://github.com/parsifal-47/emojilispで入手できます標準ライブラリを展開したり、リクエストを作成したりできます。さらに、 emojilisp.comのこの簡単な関数セットでプログラミングを試すことができます。 そして、冒頭で書いたように、機能に対応する絵文字のセットを簡単に再定義できるようにしたかったのです。 これは、githubのプロジェクトのconfフォルダー内のファイルを変更するか、サイトで「独自のセットを作成」ボタンをクリックすることで実行できます。その後、他のプログラムと同様にセットを共有できます。 ここに、例えば、 リスト操作のためのより興味深い文字を持つバリアントがあります



さらに、そのような言語はおそらく子供たちにとって理解しやすいだろうというテストするのが難しいアイデアが浮上し、おそらく何らかのプログラミングが将来のためになるでしょう。



All Articles