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

Nano Scheme: 変数定義

(工事中 30%)

はじめに

変数を定義する。

(define x 8)

変数xを「評価」してはならないので普通の手続きではなく「構文」または「特殊形式」となる。

構文という値

Environment.hs

Sntxという値をValue型に追加する。「手続き」に似ているが「引数」が評価されることなくわたされる。

data Value
.
.
.
| Sntx ([Value] -> Env -> Maybe (Value, Env))
.
.
.

表示する。

...
showValue (Sntx _) = "#<syntax>"
...

環境に変数を追加

環境に変数を追加する関数setを定義する。関数Data.Map.insertをそのまま使う。

set :: Symbol -> Value -> Env -> Env
set = M.insert

公開リストに追加する。

module Environment(
Env, M.fromList, refer, set, Value(..), showValue, SymbolA

) where

変数defineを初期環境に追加

Primitive.hs

defineは第2引数を評価して第1引数の変数の値として環境に追加する。

モジュールPrimitiveにEval, Maybeを導入する。

import Eval
import Environment
import Maybe

関数defineを定義する。

define :: [Value] -> Env -> Maybe (Value, Env)
define [sm@(Sym s), v] e = (\(v', e') -> (sm, set s v' e')) `mapply` eval v e
define _ _ = Nothing

変数defineを定義する。

env0 = fromList [
("define", Sntx define),
...

構文を引数に適用

Eval.hs

...
apply (Sntx _ s) vs e = s vs e
apply (Subr _ s) vs e = ...
...

試してみる

コマンドラインから

% echo 'nsc (define x 15) x' | runghc -Wall nsc.hs
x
15
% echo 'nsc (define x 15) (+ x (* x x))' | runghc -Wall nsc.hs
x
240

Hubotで

Hubotを再起動する。

nsc (define x 15) x

とすると

x
15

nsc (define x 15) (+ x (* x x))

とすると

x
240

まとめ

変数の定義を実装した。

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

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