fork(2) download
  1. import Data.Char
  2. import Control.Applicative
  3. import Control.Arrow
  4.  
  5. muntil p _ x | p x = return x
  6. muntil p f x = f x >>= muntil p f
  7.  
  8. back = first . (++)
  9.  
  10. split (p:ps) = back [p] $ case p of
  11. ']' -> ([], ps)
  12. '[' -> uncurry back $ second split $ split ps
  13. _ -> split ps
  14.  
  15. eval' [] st = return ([], st)
  16. eval' (p:ps) st = back [p] <$> case (p, st) of
  17. ('>', (xs, y:ys)) -> eval' ps (y:xs, ys)
  18. ('<', (x:xs, ys)) -> eval' ps (xs, x:ys)
  19. ('+', (xs, y:ys)) -> eval' ps (xs, (y + 1):ys)
  20. ('-', (xs, y:ys)) -> eval' ps (xs, (y - 1):ys)
  21. ('.', (xs, y:ys)) -> putChar (chr y) >> eval' ps (xs, y:ys)
  22. (',', (xs, _:ys)) -> getChar >>= \y -> eval' ps (xs, ord y:ys)
  23. (']', st) -> return (ps, st)
  24. ('[', st) -> do
  25. (ps', st') <- muntil (\(_, (_, y:_)) -> y == 0) (uncurry eval') (ps, st)
  26. let (pxs, pys) = split ps'
  27. back pxs <$> eval' pys st'
  28.  
  29. eval ps = eval' ps ([], repeat 0)
  30.  
  31. main = eval ">>+++++++[>++++++[>+<-]<-]+++++[>++[>>+<<-]<-]<<+++++[[>+>[-]>[-]<<[->+>+<<]>>[-<<+>>]<<>[>>.<<-]>>>.<<<<<-]]"
Success #stdin #stdout 0s 6212KB
stdin
Standard input is empty
stdout
*
**
***
****
*****