summaryrefslogtreecommitdiff
path: root/src/Unlambda/Builtins.hs
blob: bb054a1061c65f81416bb7f60e8cecf5cd1e0817 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
module Unlambda.Builtins (
	k,
	s,
	i,
	dot,
	r,
	d,
	c,
	e
	) where


import Control.Exception( Exception(..), throw )



data MyException = MyException { func :: a -> b }
    deriving (Show, Eq)

instance Exception MyException



k :: a -> b -> a
k x y = x



s :: (a -> b -> c) -> (a -> b) -> a -> c
s x y z = (x z) (y z)



i :: a -> a
i = id



class Void a where
	v :: a -> r

instance Void v => Void (a -> r) where
	v x = v



dot :: Char -> a -> IO a
dot ch f = putChar ch >> return f



r :: a -> IO a
r f = putChar '\n' >> return f



-- may not work as per unlambda lazy semantics
d :: (a -> b) -> (a -> b)
d x = (\y -> x y)



c :: (a -> b) -> (a -> b)
c x = (`runCont` id) (callCC $ \cont -> x cont)



e :: a -> b
e x = throw (MyException x)