value}上記のように、ユーザは次のような方法でモデルを記述できるようになりました。構築するために使用される別の一般的なパターンは、可変長関数です。このような関数はオプションの引数を定義することを可能にします。持つモデルを定義できるようにしたいと考えていますが、タイプに余分な長さの値も必要です。関数に余分なオプション引数を与えることができます。パッケージ変数を構築するパッケージ関数です。引数や可変関数などの匿名関数のように使いやすくするために使用される一般的なパターンがいくつかあります。構築するのに非常に役立つあらゆる値を渡すことができます。うまく動作しますが、明らかにかなり制限されています。構築されず、エラーをあまりうまく処理しません。エンジンが付属しており、再帰的なデータ構造を構築し、エラーの記録と報告のための標準フレームワークを提供します。実装する詳細に飛ぶ前に、実行中のステップをハイレベルで理解することは役に立ちます。ランタイムは、ジェネレータプログラムがロードされるときにグローバル変数を評価します。関数が実行され、最初の定義セットが生成されます。これらの関数の中には、遅延実行の定義データ構造体に匿名関数を保存するものがあります。エンジンは、追加の定義を作成して初期化する可能性のあるこれらの機能を実行します。無名関数を直ちに実行しました。これは、コードが最初に作成される他の定義に依存する可能性があるため、常に可能なわけではありません。関数を定義自体の中に格納することから成ります。エンジンは、すべての「トップレベル」定義が作成されたら、その機能を実行します。したがって、実行の流れは次のようになります。ランタイムは、最初の定義セットを作成するデザインパッケージ変数を評価します。エンジンは、定義を検証する別のパスを作成します。エンジンは、定義を確定するために最終的なパスを行います。バリデーションとファイナライズについては以下で詳しく説明しますが、定義が一貫していること、情報が欠落していないこと、およびジェネレータがそれらを消費する前に内容をマッサージする機会を与えることを検証しています。実行フローに関する最後の注意:エラーがいずれかのステージで発生した場合、そのステージが完了した後で実行が停止されます。これにより無効なデータでステージの実行を開始することを避けながら、複数のエラーを同時に報告することができます。インタフェースを実装する必要があります。文字列の値は、エラーが発生した場所をユーザーが理解するのに役立ちます。上の例では、メソッドはモデル名を返すことができます。パッケージは、オプションで実装可能な4つの追加インタフェースを定義します。関数で構築された定義で実装する必要があります。それを実行することができます。メソッドを公開します。場合、実装は意味のあるエラーを返す必要があります。関数で行うことができます。呼び出される関数です。定義フィールドにデフォルト値を設定したり、フィールドを非正規化して、ジェネレータによって消費されやすいデータ構造にすることができます。データ構造をどのように実装できるかを以下に示します。エンジンは正しい方法で各メソッドを呼び出し、エラーを一貫した方法でユーザーに報告します。パッケージで登録する必要があります。インタフェースを実装しています。メソッドを公開します。定義のスライスを返します。異なるタイプの定義を実行する順番を制御できます。拡張して、ハードコードされたリストを持たずにモデルタイプを定義できるようにしたとします。型定義はモデル定義の前に実行されなければならないでしょう。メソッドで最初にすべての型定義を返し、その後すべてのモデル定義を返すことで実現できます。