ATS に外部コードを含める

C言語コード中にアセンブラコードを埋め込むのと同様に、ATS コード中にC言語コードを埋め込むことも簡単です。 例えば、この章の最初で示した例は、次のような一つのファイルに書くことができます:

// extern fun fact (n: int): int extern fun fact2 (n: int, res: int): int = "ext#fact2_in_c" // implement fact (n) = fact2 (n, 1) // %{ int fact2_in_c (int n, int res) { while (n > 0) { res *= n ; n -= 1 ; } ; return res ; } %} //

ATS コード中にC言語コードを書くためには、%{%} のシンボルで囲まなければなりません。 本質的には、これら2つのシンボルの間にあるコードは、生成されるC言語コードの不定の位置に配置されます。 もし囲まれたコードを生成されるC言語コードの先頭に配置したいのであれば、 %{ シンボルの代わりに %{^ シンボルを使うべきです。 もし囲まれたコードを生成されるC言語コードの末尾に配置したいのであれば、 %{ シンボルの代わりに %{$ シンボルを使うべきです。

%{#%} シンボルの間にC言語コードを配置することもできます。 foo.sats という名前のファイルがこの方法でC言語コードを含んでいる場合を考えてみましょう。 もし foo.satsfoo.dats という名前の別のファイルに staload されると、 foo.sats%{#%} の間のコードは foo.dats をコンパイルして生成されたC言語コード中に配置されます。