top page > computer > haskell > web_lecture > for_programmer > nsc_if.html
更新日:
文責: 重城良国

Nano Scheme: 構文if

(工事中 30%)

はじめに

条件分岐が必要だ。構文ifを定義する。

真偽値

値構築子を追加

Environment.hs

真偽値を追加する。

data Value
= Symbol Symbol
| Bool Bool
.
.
.

表示する。

...
showValue (Bool False) = "#f"
showValue (Bool True) = "#t"
...

トークン

Parse.hs

data Token
= TkSym Symbol
| TkBool Bool
.
.
.

字句解析

tokens (')' : s) = ...
tokens ('#' : 'f' : s) = (TkBool False :) `mapply` tokens s
tokens ('#' : 't' : s) = (TkBool True :) `mapply` tokens s
tokens (c : s)
...

構文解析

...
parse1 (TkBool b : ts) = Just (Bool b, ts)
...

試してみる

% echo 'nsc #f' | runghc -Wall nsc.hs
#f

構文if

Primitive.hs

Bool値に変換する関数を作る。

bool :: (Value, Env) -> (Bool, Env)
bool (Bool False, e) = (False, e)
bool (_, e) = (True, e)

関数ifsを定義する。

ifs :: [Value] -> Env -> Maybe (Value, Env)
ifs [p, th, el] e = (\(b, e') -> eval (if b then th else el) e')
`mbind` (bool `mapply` eval p e)
ifs _ _ = Nothing

変数ifを定義する。

env0 = fromList [
.
.
.
("if", Sntx ifs),
.
.
.

試してみる

% echo 'nsc (if #t 5 8)' | runghc -Wall nsc.hs
5
% echo 'nsc (if #f 5 8)' | runghc -Wall nsc.hs
8

まとめ

構文ifを定義した。

「Nano Scheme: 関数定義と呼び出し」へもどる 「Nano Scheme: 演算子<の定義」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics