0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

特徴量エンジンKaskadaの宣言型クエリ言語Fenl〜シンタックス

Posted at

はじめに

先日、以下の記事を発表しました。

新しいテクノロジーに触れる時はいつでも楽しいものです。

まだまだ勉強中ですが、公式ドキュメントの学習過程の記録として、以下の記事をまとめてみました。

本稿情報のソースとして、下記ドキュメントを参照ください。

構文

Fenl は式で構成されます。すべての Fenl 式は値のストリームを記述します。

また、式を合成して新しい式を形成することができます。

単項演算と二項演算

算術演算は、ほとんどのプログラミング言語と同様に表現できます。

1 + 2 / (3 * 4)

論理演算では標準的な比較記号とともに、andおよび orというキーワードを組み合わせることができます 。

true and (5 >= 2) or !false

ドット構文

以下のようなJSONスタイルで複数の値を構成することができます。

{ a: 10, b: true }

複数の値を構成するデータ型では、ドット構文を使用して個々の値を参照できます。

{ a: 10, b: true }.a

上記の結果は、10になります。

条件分

すべての Fenl 式は値を生成します(Fenlは、命令型ではなく宣言型であることを思い出してください)。
ifwhenのような条件文は、式の値を決定するために使用されます。

たとえば、次の式の結果は、5という値です。

5 | if(true)

そして、次の式の値はnullになります。

5 | if(false)

Let バインディング

Let バインディングは、式に(ローカル)名を割り当てる特別な操作です。
これは、特定の式を複数回参照する必要がある場合や、複雑な式をより小さな部分に分割する場合に有益です。

バインディングには 2 つのコンポーネントがあります。名前と式のバインディングの後に、バインドされた名前を参照できる本体式が続きます。

let the_answer = 42
in the_answer * 2

letの部分を繰り返すことによって、複数の(入れ子の)バインディングを導入することができます。バインディングは以前のバインディングを参照することができます。

let the_answer = 42
let not_the_answer = the_answer * 2
in the_answer != not_the_answer

let 式で定義した値は、in式で利用されます。

パイプ構文

Fenl では、パイプ演算子|を使用して関数呼び出しを連鎖させることができます。パイプ演算子の基本的な構造としては、左側の式の結果を、右側の式内の$inputにバインドします。

42 | mul(2, $input)

上記の省略表現として、下記のような表現が可能です。パイプ式の 右項内で使用される関数では、$inputを使用する引数の記載を省略することができます。

42 | mul(2)

パイプ演算子は、以下のように、複数の操作を順番に適用する場合に便利です。

the_answer
  | add(10)
  | div(2)
  | gt(0)

パイプ操作LHS | RHSは、 let $input = LHS in RHSと同等と言うことも言えます。

(RHS = right-hand side, LHS = left-hand side)

関数呼び出し

関数は括弧を付けて呼び出されます。関数パラメータには名前が付けられます。

substring(s = "input", start = 0, end = 2)

パラメーターには、デフォルト値を持つものがあります。デフォルト値を持つパラメータは関数呼び出しの記載から省略できます。

substring("input")

名前付きパラメータの値をデフォルト値で指定する場合は、パラメータ名を含める必要があります。

substring("input", 0) # 無効なシンタックス
substring("input", start = 0) # 有効なシンタックス

関数の設計

Fenlでは、多くの関数が「data」パラメータと「config」パラメータを持つ設計となっています。

たとえば、substring関数では、開始オフセットから終了オフセット (「config」パラメータ) までの文字範囲指定により、文字列 (「data」パラメータ) を変換します。

substring(zipcode, start=0, end=6)

Fenl の関数は、「data」パラメータを最後の必須パラメータまたは位置パラメータとして配置しようとします。「data」パラメーターを最後に配置すると、パイプ構文を使用するときにそれらを簡単に省略できます。

この設計の結果として、コード記述においては、「config」パラメーター指定が強調されます。

名前解決

Fenl の名前解決はコンテキストに依存します。コンテキストは通常​​、ユーザーが定義したテーブル名(ref:tableservice[tables]) およびビュー名( ref:viewservice[views] )のセットが存在しているところから始まります。

式で使う名前が、これらの名前と重複しないことが必要です。

letおよび|演算子を使用して名前をコンテキストに追加できます。これらの方法でバインドされた名前は、関連付けられた部分式 (たとえば、 letin句や の RHS 式)でのみ表示されます。

名前は複数回バインドされる場合があります。名前が 2 回バインドされている場合、2 番目のバインディングは2 番目のバインディング後のin部分式内でのみ利用できます。

let current_favorite = "pizza"
let first_favorite = current_favorite
let current_favorite = "hot dogs"

in { current_favorite, first_favorite }

一旦、名前Aによってバインドされた名前Bは、その後名前Aが新たにバインドされても、影響を受けません。
この例では、名前current_favoriteは、別の名前first_favoriteの宣言時に、その値としてバインドされ 、その後、名前current_favoriteは 別の値にバインドされます。しかし、first_favoriteの値は、current_favorite の再バインドの影響を受けません。

{ "current_favorite": "hot dogs", "first_favorite": "pizza"}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?