関数型プログラミング言語Haskell Part12
■ このスレッドは過去ログ倉庫に格納されています
0343デフォルトの名無しさん
2010/06/03(木) 01:22:43{-# OPTIONS_GHC -XFlexibleInstances #-}
module Main where
import GHC
import GHC.Paths ( libdir )
import DynFlags ( defaultDynFlags )
import Data.Dynamic
import System.IO.Unsafe
main = getLine >>= \s -> print (map (eval s) [0..10])
eval :: String -> (Int -> Int)
eval s = flip fromDyn (error "Error") $ unsafePerformIO $
defaultErrorHandler defaultDynFlags $ do {
; runGhc (Just libdir) $ do {
; dflags <- getSessionDynFlags
; setSessionDynFlags dflags
; pm <- findModule (mkModuleName "Prelude") Nothing
; setContext [] [pm]
; dynCompileExpr ("(" ++ s ++ ") :: Int -> Int")
}
}
GHCなら、こういうこともできるよ。
ただ、多相型を扱えない/扱いにくい関係で、>>328みたいな方法で押し切った方が簡単だし、応用しやすいと思う。
Haskell的にはスマートじゃない感じだけど、そもそもLispのevalにしてもPythonやRubyの似たような関数にしてもインタプリタだからできることであって、インタプリタと連携させる前提で比較しないと不公平という気もする。
■ このスレッドは過去ログ倉庫に格納されています