|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://angg.twu.net/HASKELL/LuaTree1.hs.html
-- http://angg.twu.net/HASKELL/LuaTree1.hs
-- (find-angg "HASKELL/LuaTree1.hs")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun e () (interactive) (find-angg "HASKELL/LuaTree1.hs"))
-- «.pipeThrough» (to "pipeThrough")
-- «.callLuaTree» (to "callLuaTree")
-- «.callLuaTree-tests» (to "callLuaTree-tests")
-- «.luatree1» (to "luatree1")
-- «.luatree1-tests» (to "luatree1-tests")
import System.IO
import System.Process
-- «pipeThrough» (to ".pipeThrough")
-- See: (find-es "haskell" "pipeThrough")
pipeThrough p str_in = do
(Just hin, Just hout, _, _) <-
createProcess p { std_in = CreatePipe, std_out = CreatePipe }
hPutStr hin str_in
hClose hin
hGetContents hout
-- «callLuaTree» (to ".callLuaTree")
-- See: http://angg.twu.net/eev-maxima.html#luatree
-- and: (find-angg "luatree/luatree.lua")
callLuaTree str = do
pipeThrough (proc "/home/edrx/luatree/luatree.lua" []) str
teststr1 :: String
teststr1 = "{[0]='[', {[0]='/', 'x', 'y'}, '33'}"
-- «callLuaTree-tests» (to ".callLuaTree-tests")
{-
* (eepitch-ghci)
* (eepitch-kill)
* (eepitch-ghci)
:load LuaTree1.hs
pipeThrough (proc "tac" []) "a\nbb\nccc\ndddd\n"
:t callLuaTree
callLuaTree teststr1
callLuaTree teststr1 >>= putStr
-}
-- «luatree1» (to ".luatree1")
data LT = LTS String
| LTN Int
| LTT String [LT]
deriving (Eq,Ord,Show)
testlt1 :: LT
testlt1 = LTT "[" [LTT "/" [LTS "x", LTS "y"], LTN 33]
luatree0 :: LT -> String
luatree0 (LTS s) = show s
luatree0 (LTN n) = show n
luatree0 (LTT s xs) =
let f x = ", " ++ luatree0 x
rest = concat (map f xs)
in "{[0]=" ++ (show s) ++ rest ++ "}"
luatree1 :: LT -> IO ()
luatree1 lt = callLuaTree (luatree0 lt) >>= putStr
-- «luatree1-tests» (to ".luatree1-tests")
{-
* (eepitch-ghci)
* (eepitch-kill)
* (eepitch-ghci)
:load LuaTree1.hs
testlt1
luatree0 testlt1
luatree1 testlt1
-}
-- (find-huttonbookpage 285 "17.3 Adding a stack")
-- (find-huttonbooktext 285 "17.3 Adding a stack")
type Stack = [LT]
data Code = Pushn Int | Pushs String | Bin String
exec1 :: Code -> Stack -> Stack
exec1 (Pushn n) st = (LTN n):st
exec1 (Pushs s) st = (LTS s):st
exec1 (Bin op) (b:a:st) = (LTT op [a,b]):st
execn :: [Code] -> Stack -> Stack
execn [] st = st
execn (c:cs) st = execn cs (exec1 c st)
exec :: [Code] -> LT
exec cs = head (execn cs [])
execl :: [Code] -> IO ()
execl cs = luatree1 (exec cs)
{-
* (eepitch-ghci)
* (eepitch-kill)
* (eepitch-ghci)
:load LuaTree1.hs
execn [Pushn 22, Pushn 33, Bin "+"] []
exec [Pushn 22, Pushn 33, Bin "+"]
execl [Pushn 22, Pushn 33, Bin "+"]
execl [Pushn 22, Pushn 33, Bin "+", Pushn 5, Bin "/"]
-}
-- (find-rwhaskellpage (+ 40 103) "As-patterns")
-- Local Variables:
-- coding: utf-8-unix
-- End: