Mention cabal-install
[darcs-mirror-sem_syn.git] / README
1  `b18n-combined`: Combining Syntactic and Semantic Bidirectionalization
2 ======================================================================
3
4 What's This?
5 ------------
6
7 This program, `b18n-combined`, is a prototype implementation of
8 the paper "Combining Syntactic and Semantic Bidirectionalization" 
9 written by Janis Voigtländer, Zhenjiang Hu, Kazutaka Matsuda,
10 and Meng Wang, which is accepted at ICFP'10.
11
12 The program takes input program describing a view function that constructs a view from a source, 
13 and generates a put-back function that reflects updates on the view to the source. 
14 Thanks to combination of syntactic and semantic bidirectionalization, 
15 the program can generates effective put-back functions in the sense that
16 the generated put-back functions can put back more updates than 
17 those obtained by either of syntactic/semantic bidirectionalization.
18
19 Online version
20 --------------
21
22 A [CGI version] of the program is provided for your convenience.
23
24 [CGI version]: http://www.kb.ecei.tohoku.ac.jp/~kztk/b18n-combined/
25
26
27 Example
28 -------
29  
30 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.shell}
31 $ cat example/init.txt 
32 init []          = []
33 init [a]         = []
34 init (a:b:x)     = a:initWork b x
35 initWork a []    = []
36 initWork a (b:x) = a:initWork b x
37 $ ./dist/build/b18n-combined/b18n-combined example/sieve.txt -syn -hs
38 import Control.Monad
39 import BUtil
40 data Cmpl t0 t1
41     = Csieve_Cmpl_1
42     | Csieve_Cmpl_2 t0
43     | Csieve_Cmpl_3 t1 (Cmpl t0 t1)
44 sieve ([]) = []
45 sieve (a : []) = []
46 sieve (a : (b : x)) = b : sieve (x)
47 sieve_B s v = head (sieve_T_I v (sieve_Cmpl s))
48 sieve_Cmpl ([]) = Csieve_Cmpl_1
49 sieve_Cmpl (a : []) = Csieve_Cmpl_2 a
50 sieve_Cmpl (a : (b : x)) = Csieve_Cmpl_3 a (sieve_Cmpl (x))
51 sieve_T_I x1 x2 = mplus (sieve_T_I_1 x1 x2) (mplus (sieve_T_I_2 x1 x2) (mplus (sieve_T_I_3 x1 x2) mzero))
52 sieve_T_I_1 [] (Csieve_Cmpl_1) = do return ([])
53 sieve_T_I_1 _ _ = mzero
54 sieve_T_I_2 [] (Csieve_Cmpl_2 a) = do return (a : [])
55 sieve_T_I_2 _ _ = mzero
56 sieve_T_I_3 (b : tv1) (Csieve_Cmpl_3 a
57                                      tc1) = do (x) <- sieve_T_I tv1 tc1
58                                                return (a : (b : x))
59 sieve_T_I_3 _ _ = mzero
60 $ ./b18n-combined example/sieve.txt -sem
61 import Data.Bff
62 import BUtil
63 sieve_B s v
64     = bff Main.sieve s v
65 sieve ([]) = []
66 sieve (a : []) = []
67 sieve (a : (b : x)) = b : sieve (x)
68 $ ./b18n-combined example/sieve.txt -comb 
69 import Control.Monad
70 import BUtil
71 sieve_Bb bias s v
72     = gen_put_bias bias Main.sieve(\x y -> castError $ (sieve_22_B $! x) $! y) s v
73 sieve_Bbd = withDefaultBias sieve_Bb
74 sieve_Bd = withDefault sieve_B
75 sieve_B s v = sieve_Bb rear s v
76 data Cmpl
77     = Csieve_22_Cmpl_1
78     | Csieve_22_Cmpl_2
79 sieve ([]) = []
80 sieve (a : []) = []
81 sieve (a : (b : x)) = b : sieve (x)
82 sieve_22_B s v = head (sieve_22_T_I v (sieve_22_Cmpl s))
83 sieve_22_Cmpl (Z) = Csieve_22_Cmpl_1
84 sieve_22_Cmpl (S (Z)) = Csieve_22_Cmpl_2
85 sieve_22_Cmpl (S (S x)) = sieve_22_Cmpl (x)
86 sieve_22_T_I x1 x2 = mplus (sieve_22_T_I_1 x1 x2) (mplus (sieve_22_T_I_2 x1 x2) (mplus (sieve_22_T_I_3 x1 x2) mzero))
87 sieve_22_T_I_1 (Z) (Csieve_22_Cmpl_1) = do return (Z)
88 sieve_22_T_I_1 _ _ = mzero
89 sieve_22_T_I_2 (Z) (Csieve_22_Cmpl_2) = do return (S Z)
90 sieve_22_T_I_2 _ _ = mzero
91 sieve_22_T_I_3 (S tv1) tc1 = do (x) <- sieve_22_T_I tv1 tc1
92                                 return (S (S x))
93 sieve_22_T_I_3 _ _ = mzero
94 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
95
96 How to Build using cabal-install
97 --------------------------------
98
99 If you have [cabal-install] (part of the Haskell Platform) available on your system, you can install b18n-combined using the command
100         cabal install bidirectionalization-combined
101
102 [cabal-install]: http://haskell.org/cabal/download.html
103
104 How to Build manually
105 ---------------------
106
107
108   0. Install [GHC] and make sures that following Haskell packages 
109      are installed.
110      * mtl, template-haskell, containers, pretty, parsec (for web interface: directory, xhtml, cgi, utf8-string, bytestring, unix, hint >= 0.3.2)
111   1. Get the source tarball from 
112      [./bidirectionalization-combined-0.1.tar.gz](./bidirectionalization-combined-0.1.tar.gz) or from [hackage].
113   2. Unfold the source tarball
114      * `tar zxvf bidirectionalization-combined-0.1.tar.gz` 
115   3. Build the executables by 
116      1. `runhaskell Setup.hs configure`
117      2. `runhaskell Setup.hs build`
118     
119 Note that the source code is also available via darcs.
120
121      darcs get http://www.kb.ecei.tohoku.ac.jp/~kztk/darcs/sem_syn/
122
123 [GHC]: http://www.haskell.org/ghc/
124 [hackage]: http://hackage.haskell.org/package/bidirectionalization-combined
125
126
127 Limitation
128 ----------
129
130 Current implementation can handle lists only.
131
132 <div class="footer">
133
134 ----------------------------------------------------
135 <address>Kazutaka Matsuda: <kztk@kb.ecei.tohoku.ac.jp>.</address>
136
137 <p>The first version of this page was published in Jul. 29th, 2010.</p>
138
139 </div>
140