技術

5.2. if/then/else

LLVMによるプログラミング言語の実装チュートリアル日本語訳
第5章 万華鏡: 言語の拡張: 制御フロー
第2節 if/then/else

if/then/elseのサポートによる万華鏡の拡張は、実に簡単である。
基本的には、字句解析器と構文解析器とASTとLLVMコード生成部分に対して、これらの新しいコンセプトに対するサポートを追加することが必要である。
この実例は素晴らしいものである。
なぜなら、新しいアイデアによって言語を少しずつ拡張し、時間を掛けて育てていくのがいかに簡単かを示すものだからである。

この拡張を追加する方法に進む前に、何が必要なのかについて考えてみよう。
以下のような感じで書けるようにしたいというのが基本的な考えである。

def fib(x)
  if x < 3 then
    1
  else
    fib(x-1)+fib(x-2);

万華鏡では、各構成物は式である。
文は存在しない。
なので、if/then/else式は何らかの戻り値を返す必要があある。
大部分は関数の形を使ってるので、その条件文を評価し、そして条件がどう解決されたかに基づき”then”か”else”の値を戻すようにする。
これは、Cの”?:”式にかなり似ている。
訳注: ?:はCの三項演算子の事。

if/then/else式の動作としては、条件式において、0.0と等しい値を真偽値におけるfalseとして評価し、それ以外をtrueとして評価する。
もし条件がtrueなら、最初の副次式(thenの式)が評価されその結果が返る。
もし条件がfalseなら、2番目の副次式(elseの式)が評価されその結果が返る。
万華鏡は副作用を許容するので、この振る舞いは明確に定義するために重要である。(Since Kaleidoscope allows side-effects, this behavior is important to nail down.)
訳注: 副作用を許容しないならば、thenとelseの両方の式を実行して必要なほうの値だけを返すようにすることも出来るが、副作用を許容するのでそうは出来ないという意味かと思う。

これで、我々が欲しい物ははっきりした。
これを個々の構成部品に分解してみよう。

コメントを残す

メールアドレスが公開されることはありません。



※画像をクリックして別の画像を表示