Created
May 2, 2012 21:44
-
-
Save JakubOboza/2580752 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
data Op = Integer Int | Function String deriving (Show) | |
newtype Program = List Op | |
data Ast = Const Int | Binary Ast String Ast | |
--i robisz funkcje | |
--Ast -> Program | |
--koniec | |
value (Integer val) = val | |
sample_input = [Integer 1, Integer 5, Function "+", Integer 6, Function "*", Integer 67, Integer 13, Integer 49, Function "+", Function "-", Function "+" ] | |
-- just put shit on stacks | |
eval0 [] num_stack foo_stack = (num_stack, foo_stack) | |
eval0 (i:is) num_stack foo_stack = | |
case i of | |
Integer num -> eval0 is (num : num_stack) foo_stack | |
Function foo -> eval0 is num_stack (foo : foo_stack) | |
-- perform some calculations | |
eval1 [] num_stack = num_stack | |
eval1 (i:is) num_stack = | |
case i of | |
Integer num -> eval1 is (num : num_stack) | |
Function foo -> eval1 is (eval_foo foo num_stack) | |
eval_foo foo num_stack = | |
case foo of | |
"+" -> eval_op (+) num_stack --eval_plus num_stack | |
"-" -> eval_op (-) num_stack --eval_minus num_stack | |
"*" -> eval_op (*) num_stack --eval_mul num_stack | |
-- switch to doubles "/" -> eval_div num_stack | |
eval_op foo num_stack = | |
let right = head num_stack in | |
let left = head $ tail num_stack in | |
(foo left right) : (tail $ tail num_stack) | |
--eval_plus num_stack = | |
-- let left = head num_stack in | |
-- let right = head $ tail num_stack in | |
-- (left + right) : (tail $ tail num_stack) | |
--eval_minus num_stack = | |
-- let left = head num_stack in | |
-- let right = head $ tail num_stack in | |
-- (left - right) : (tail $ tail num_stack) | |
--eval_mul num_stack = | |
-- let left = head num_stack in | |
-- let right = head $ tail num_stack in | |
-- (left * right) : (tail $ tail num_stack) | |
-- type system super fucker | |
--eval_div num_stack = | |
-- let left = head num_stack in | |
-- let right = head $ tail num_stack in | |
-- (left / right) : (tail $ tail num_stack) | |
-- transform to normal 2 + 4 | |
eval2 [] num_stack normal_stack = reverse $ concat normal_stack | |
eval2 (i:is) num_stack normal_stack = | |
case i of | |
Integer num -> eval2 is (num : num_stack) normal_stack | |
Function foo -> eval2 is num_stack ((eval2_foo foo num_stack) : normal_stack) | |
eval2_foo foo num_stack = | |
let right = head num_stack in | |
let left = head $ tail num_stack in | |
[Integer left, Function foo, Integer right] | |
result0 = eval0 sample_input [] [] | |
result1 = eval1 sample_input [] | |
result2 = eval2 sample_input [] [] | |
main = do | |
putStr "Initial input : " | |
putStrLn $ show sample_input | |
putStr "Result of eval0: " | |
putStrLn $ show result0 | |
putStr "Result of eval1: " | |
putStrLn $ show result1 | |
putStr "Result of eval2: " | |
putStrLn $ show result2 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment