Runtime компиляция в Haskell
yantayga — 22.01.2011
Слышал я, о многоуважаемый all, что в Лиспе можно произвольные
данные тут же по ходу выполнения программы
"сынтерпретировать" и выполнить, что потенциально дает
самомодифицирующиеся программы. А есть ли подобное в
Хаскеле? Или возможно ли хотя бы теоретически? Можно ли как то с
самой программой слинковать компилятор (учитывая что мы можем
использовать Хаскель как длл в связке с программами, написанными на
других языках)UPD.
Просто выполнить код a la ghci можно так (частично взято отсюда):
{-# LANGUAGE NoMonomorphismRestriction #-}
module Test
where
import Language.Haskell.Interpreter
import Control.Monad
run = runInterpreter . test
test :: String -> Interpreter String
test s =
do
setImports ["Prelude"]
res <- eval s
return res
А вот так можно выполнить некую заранее неизвестную (кроме типа) операцию:
{-# LANGUAGE NoMonomorphismRestriction #-}
module Test
where
import Language.Haskell.Interpreter
import Control.Monad
import System.IO
run = runInterpreter . test
getOperation s = interpret s (as::(Double -> Double))
test :: String -> Interpreter Double
test s =
do
setImports ["Prelude"]
op <- getOperation s
let res = op 1.0
return res
main :: IO ()
main =
do
s <- getLine
res <- run s
print res
return ()
Для примера:
*Test> main
sin
Right 0.8414709848078965
*Test> main
cos
Right 0.5403023058681398
Замечания, критика, поправки и вежливые ругательства приветствуются...
Кстати, как можно сделать в жж syntax colorizing?
|
|
</> |
Первый ремонт без стресса: как разобраться в натяжных потолках
Осенью должны падать листья, а не настроение. 29.11.2025
СМИ раскрывают новые подробности мирной инициативы Трампа по Украине
Пантюркизм 2.0: старая прошивка, но баги новые
Очаково. 9 мая 1975 года, сквер на улице Марии Поливановой
Вулкан, зерно и чума: как климатический кризис мог изменить траекторию Чёрной
Пафиопедилум. Мир орхидей
Питер Гэбриел как мистический плакальщик. Концепция имени
А вы помните этого Кузнечика?

