zot-0.0.1: src/LambdaToSki.hs
module LambdaToSki ( main ) where
import SKI ( mkski, Rec( .. ), fromInt, out, readChurch )
import ReadLambda ( readLambda, showSKI )
main :: IO ()
main = interact lambdaToSKI
fromLambda :: String -> Rec a
fromLambda = mkski . showSKI . readLambda
lambdaToSKI :: String -> String
lambdaToSKI = showSKI . readLambda
mulString = "\\x y -> x ( y ( \\g f xx -> f ( g f xx ) ) ) ( \\f x -> x )"
mul :: Rec a -> Rec a -> Rec a
mul x y = out ( out ( fromLambda mulString ) x ) y
zero :: Rec a
zero = fromLambda "\\f x -> x"
suc :: Rec a -> Rec a
suc = out ( fromLambda "\\g f x -> f ( g f x )" )
two = suc ( suc zero )
three = suc two
mul', zero', suc', two' :: String
mul' = lambdaToSKI mulString
zero' = lambdaToSKI "\\f x -> x"
suc' = lambdaToSKI "\\g f x -> f ( g f x)"
two' = apply suc' $ apply suc' zero'
three' = apply suc' two'
apply :: String -> String -> String
apply f a = '`' : f ++ a
cons, car, cdr :: String
cons = "\\s b f -> f s b"
car = "\\p -> p ( \\x y -> x )"
cdr = "\\p -> p ( \\x y -> y )"
true, false :: String
true = "\\x y -> x"
false = "\\x y -> y"
getBool :: Rec a -> Bool
getBool x = let Bool b = out ( out x ( Bool True ) ) ( Bool False ) in b
getIntList :: Rec a -> [ Int ]
getIntList lst
-- | out ( out lst ( Bool True ) ) ( Bool False ) == Bool False = [ ]
| isFalse lst = [ ]
| otherwise =
fromInt ( readChurch ( out lst ( fromLambda true ) ) ) :
getIntList ( out lst ( fromLambda false ) )
isFalse :: Rec a -> Bool
isFalse ( In x ) = case x ( Bool True ) of
In y -> y ( Bool False ) == Bool False
_ -> False
isFalse _ = False
someList :: Rec a
someList = mkski $ apply ( apply ( lambdaToSKI cons ) two' ) ( lambdaToSKI false )
makeIntList :: [ Int ] -> String
makeIntList [ ] = lambdaToSKI false
makeIntList ( i : is ) =
apply ( apply ( lambdaToSKI cons ) $ makeChurch i ) $ makeIntList is
makeChurch :: Int -> String
makeChurch 0 = "`ki"
makeChurch i = apply succ' $ makeChurch ( i - 1 )
succ' = "`s``s`ks``s`kki"