式
WELステップは1つの式であり、ステートメント、代入、returnはありません。式は単一の値を生成し、その値が出力になります。
これは制約ではありません。WELのすべての構成要素は値を生成するためです。条件式は値を生成し、letバインディングも値を生成します。それぞれは、mapリテラル内を含め、値を使用できる任意の場所で合成できます。
機能の提供状況
WELは現在、一部のお客様にご利用いただけます。ご利用のワークスペースで利用可能かどうかを確認するには、Customer Success Representativeにお問い合わせください。
入力変数
アンダースコア(_)は入力変数です。これは、Transform dataアクションで宣言した入力フィールドを保持します。
ピリオド(.)は_からフィールドを読み取ります。
_ // the whole input
_.order_id // the order_id field
_.customer.email // email, inside the customer field
_.line_items // the whole list_.order_idは1つではなく2つの部分で構成されます。_は入力に名前を付け、.order_idは_からフィールドを読み取ります。 WELに_.演算子はありません。
入力フィールドが_上のキーになる仕組みについては、Transform dataアクションを参照してください。
フィールドへのアクセス
単純な名前にはピリオド(.)を使用し、キーが計算される場合やベア識別子ではない場合は角かっこ([])を使用します。
_.customer.email
_.customer['email']
_['order-id']存在しないキーを読み取ると、nullを生成するのではなくE104が発生します。これにより、フィールド名のタイプミスが欠落値として暗黙的に伝播することを防ぎます。フィールドが本当にオプションであることを示すには、|?を使用します。
_.customer.nickname |? 'none'null値を処理する|と、エラーを捕捉する|?の違いについては、演算子を参照してください。
出力の構築
ほとんどの変換は、値が式であるmapリテラルです。
{
order_id: upper(_.order_id),
email: lower(trim(_.customer.email)),
item_count: count(_.line_items)
}キーはベア識別子として記述します。値には、フィールド、呼び出し、パイプライン、条件式、ネストされたmapなど、任意のものを使用できます。
条件
if ... then ... else ...は値を生成します。
| Formula | 結果 |
|---|---|
if 5 > 3 then 'yes' else 'no' | yes |
if 1 > 2 then 'a' else if 3 > 2 then 'b' else 'c' | b |
3つ以上の分岐を連結するには、else ifを使用します。条件式全体が値であるため、そのまま出力に入ります。
{
tier: if _.total > 1000 then 'gold'
else if _.total > 100 then 'silver'
else 'standard'
}中間値に名前を付ける
let name = value do bodyは、body内で使用する名前をバインドします。
| Formula | 結果 |
|---|---|
let x = 10 do x * 2 | 20 |
let a = 1, b = 2 do a + b | 3 |
複数のバインディングはカンマで区切ります。後のバインディングは前のバインディングを使用できます。
値を複数回再利用するには、letを使用します。
let parts = _.results >> partition_by(r ~> r.status == 'ok')
do {
succeeded: parts >> at(0),
failed: parts >> at(1)
}letは、式が長くなりすぎて読みづらい場合にも役立ちます。パイプラインの途中にある名前付きステップは、途切れない1本のチェーンよりも明確なことが多く、同じ手法でE014(ネストが深すぎる)も修正できます。
WELはシャドーイングを許可しません
すでにスコープ内にある名前を再バインドすると、E009が発生します。これにより、内側のバインディングが外側のバインディングを暗黙的にキャプチャすることを防ぎます。エラーを解決するには、別の名前を使用します。
ガード
ガードは条件をテストし、条件がfalseの場合にE203を発生させます。
let total = _.total
guard total > 0
do totalオプションのelseでカスタムメッセージを指定できます。
let total = _.total
guard total > 0 else 'total must be positive'
do totalガードは、処理を許可しない入力に使用します。負の合計は、デフォルト値で済ませるべきものではありません。これはペイロードが誤っていることを意味し、誤った請求書が送信されるよりも、ジョブが明確に失敗するほうが適切です。想定される欠落に使用する|?と比較してください。
Lambda
ラムダは、~>で記述するインライン関数です。高階のリスト関数は、ラムダを引数として受け取ります。
| Formula | 結果 |
|---|---|
[1,2,3] >> map_by(x ~> x * 2) | [2, 4, 6] |
[1,2,3] >> map_with_index_by((x, i) ~> x + i) | [1, 3, 5] |
~>の前のパラメーターには任意の名前を選択できます。 2つ以上のパラメーターは丸かっこ(())で囲みます。
ラムダは、それを受け取る関数への引数としてのみ有効です。スタンドアロンの値として使用すると、E107が発生します。
->と=>はラムダ矢印ではありません
WELでは、ラムダに~>のみを使用します。 x -> x * 2またはx => x * 2を記述すると、パースエラーが発生します。これは、他の言語に精通しているユーザーやAIに最もよくある誤りです。他の言語では、ラムダに->または=>を使用することがよくあります。 AIエージェントにWELを扱うために必要なコンテキストを提供するには、WELキットを参照してください。
名前付き関数
fun name = lambda do bodyはラムダを名前にバインドするため、同じロジックを再度書き出すことなく複数の場所で再利用できます。
| Formula | 結果 |
|---|---|
fun double = x ~> x * 2 do double(21) | 42 |
他のラムダと同様に、名前付き関数を高階関数に渡します。
| Formula | 結果 |
|---|---|
fun is_open = o ~> o.status == 'open' do [{status: 'open'}, {status: 'closed'}] >> filter_by(is_open) | [{status: "open"}] |
各funには独自のdoがあり、後の定義は前の定義を呼び出すことができます。
fun net = li ~> Decimal(li.unit_price) * li.qty do
fun taxed = li ~> net(li) * Decimal('1.20') do
_.line_items >> map_by(taxed) >> sumルールが複数回出現する場合は、funを使用します。
まとめる
let items = _.line_items
guard count(items) > 0 else 'order has no line items'
do {
order_id: upper(_.order_id),
item_count: count(items),
total: items >> map_by(li ~> Decimal(li.unit_price) * li.qty) >> sum,
tier: if count(items) > 10 then 'bulk' else 'standard'
}前のブロックは1つの式です。バインディング、ガード、mapリテラル、パイプライン、条件式はそれぞれ値を生成し、それらの値が合成されてステップが返す値になります。
関連情報
最終更新日: