Hatena::Grouphaskell

mokeheheの日記

2009-08-15

「Write Yourself a Scheme in 48 Hours」はSchemeの環境をどうやって扱っているか?

Haskell パーサ」とかでつらつら巡回してたら404 Not Foundが出てきた。自分の目的と同様に、HaskellSchemeのインタプリタを作るという内容なので、環境をどう扱うか書いてあるかと思ってオリジナルの方をちゃんと読んでみる。

Eitherはモナド
*Main> :i Either
data Either a b = Left a | Right b      -- Defined in Data.Either
instance (Eq a, Eq b) => Eq (Either a b) -- Defined in Data.Either
instance (Ord a, Ord b) => Ord (Either a b)
  -- Defined in Data.Either
instance (Read a, Read b) => Read (Either a b)
  -- Defined in GHC.Read
instance (Show a, Show b) => Show (Either a b)
  -- Defined in GHC.Show
8. Adding Variables and Assignment: Mutable State in Haskel

グローバル環境の追加

  • Stateモナドだとクロージャのように環境を保存するものがあって扱いきれない
  • state threadsと呼ぶ、状態を扱う方法を使う
    • 1.STモナドを使う
    • 2.IORefを使う
      • どうせ処理はIOによって細切れにされてるのでかまわん
  • IORefを使う
import Data.IORef

type Env = IORef [(String, IORef LispVal)]
9. Defining Scheme Functions: Closures and Environments
  • 関数にIORef環境を保存
10. Creating IO Primitives: File I/O
  • I/Oもしちゃう、すげぇ!
結論

IORef+モナド変換か…気が進まないけどやるっきゃない!

トラックバック - http://haskell.g.hatena.ne.jp/mokehehe/20090815