JSONからプログラミング言語を作成した方法

数ヶ月の努力の末、ついにiOS関連アプリをリリースしました。 これにより、ネットワーク上のサービスやコンテンツとの相互作用の既存の基盤が破られるため、ユーザーは使い慣れたものに費やす時間が大幅に短縮されます。 これは、アプリケーションとWebサービスをカードの形式で提示することで実現されます(詳細はこちら )。



独立したインタラクティブユニットとしてのカードは、モバイルインターフェースの未来を示しています。

画像

Relevantの作業を始めたとき、2つのことだけが明確でした。カードは美しくなければならず、普遍的であるべきです。 つまり、最小限の制限でネットワーク上のあらゆる情報ソースからコンテンツを作成できます。 可愛さについては、別の記事に値します。ここでは触れませんが、普遍性について話しましょう。



JSONオブジェクトとしてのカード



関連するカードは簡単でダウンロード可能である必要があるため、ネットワーク上のさまざまな情報ソースおよびAPIにアクセスする方法、および受信したデータをカードのコンテンツに変換する方法に関する指示を含むJSONファイルの形式で提示することにしました。

画像

カードを作成するプロセスを複雑にしない、非常に柔軟なカード構造が必要でした。 たとえば、APIから一連の商品を受け取り、それぞれの商品に関する詳細な情報を取得できるようにする必要があります。 さらに、異なるAPIを介してデータを取得し、これらすべてをまとめて収集することができます。



したがって、ユニバーサルAPIアグリゲーターが必要であることが明らかになりました。柔軟で、簡単に変更でき、外部ファイルに保存されます。 これにより、開発者が単純にハードコーディングするため、ユーザーがコンテンツにアクセスできないアプリケーションとは異なり、カードが開発できるエコシステムが作成されます。



APIは非標準です



WebサービスとAPIにはさまざまな形があります。 一部のAPIは、リストを返したい場合、単に配列を返しますが、他のAPIは、返されたオブジェクトの腸のどこかにそれを押し込みます。 ページネーションを使用するものもあれば、明示的なページパラメータを受け入れるものもあります。 [ 暗黙の違いが何であるかは明確ではありません ]何百もの日付と時刻の形式標準、いくつかのURL標準を追加し、引用符で整数と小数をランダムにラップします。 複数のAPIの集約システムを作成しようとするほとんどの開発者は、if-elseブロックからマルチレベルの地獄に素早く突入します。



もっと強力なものが欲しかった。 プラットフォームをAPIとそのデータの設計の品質から独立させる必要がありました。 多くの試行錯誤の後、Relevant CardのJSONは次のようになり始めました。

画像



API集約インフラストラクチャのほとんどは、複雑なサーバーシステムとクライアントシステムにあります。 ただし、私たちが発明したJSON指向のREL言語は特筆に値します。



RELの簡単な紹介



RELは装飾されたJSONのように見えますが、実際には遅延不変変数(つまり、必要な場合にのみ計算および取得される)と動的スコープを持つ純粋に機能的なプログラミング言語です。



タイプと変数



RELの型は、数値、文字列、オブジェクト、および配列の標準JSON型です。 ほとんどの場合、それらは直接解析されます。 ただし、一部のオブジェクトは特に重要です。 「_RETURN」キーを持つオブジェクトのキーと値のペアは、変数と値のペアとして解析されます。 変数には中括弧を使用してアクセスします: "{variable_name}"。



たとえば、次のオブジェクト

{ "foo":1, "var":2, "_RETURN":{"_MATH":"{foo}+{var}"} }
      
      



RELは数値3を表します。



機能



多くの場合、新しい組み込み関数をRELに追加します。 これらの関数は、アンダースコアで始まる特定の特殊キーを持つオブジェクトのように見えます。 上記の例の関数「_MATH」は、文字列を数式として解析し、その結果を返します。



他の組み込み関数には、指定されたアドレスでJSONをロードする「_URL」や、JSONオブジェクトまたは配列内の値を検索する「_PATH」が含まれます。 これら2つの関数は、RELエンジンでAPIを集約するために使用される主なものです。



カスタム関数を作成することもできます。 詳細については、ドキュメントを参照してください



注文管理



{"_IF":、 "_THEN":、 "_ELSE":}および{"_LOOP":{"_ARRAY":、 "_EACH":}}などの組み込み関数は、実行順序を制御するために使用されますが、非機能言語(CやJavaなど)では、常に値を返します。



RELの現在のバージョンに関する詳細については、 ドキュメントを参照してください



RELの例と説明が記載された、進化するカードライブラリも利用できます。



翻訳者から



一部の場所での翻訳は非常に無料ですが、意味や内容を損なうものではありません。 オリジナルに直接関係のないものはすべてノートに含まれています。 パブリケーションの作成者はパートタイムであり、アプリケーションの作成者であるため、ソーステキストはやや宣伝的なものです。 私は開発言語に焦点を移そうとしました。 多数のリンクとさまざまなアピールについては、オリジナルを参照してください。

提案、要望、コメントは、いつものようにPMで。



All Articles