--- /dev/null
+<?xml version='1.0' encoding='utf-8' ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>Lists</title><link type="text/css" rel="stylesheet" href="wikistyle.css"/></head><body>\r
+\r
+<h2 id="Comparison_of_Java_and_SCL">Comparison of Java and SCL</h2>\r
+\r
+<h3>Language constructions and patterns</h3>\r
+\r
+<table border="1">\r
+<tr>\r
+<td><pre>0.5 + x * (2e-3 + x * 2)</pre></td>\r
+<td><pre>0.5 + x * (2e-3 + x * 2)</pre></td>\r
+</tr>\r
+\r
+<tr>\r
+<td><pre>x >= 0 && x <= 1</pre></td>\r
+<td><pre>x >= 0 && x <= 1</pre></td>\r
+</tr>\r
+\r
+<tr>\r
+<td><pre>Math.sin(a1) - Math.cos(a2)</pre></td>\r
+<td><pre>sin a1 - cos a2</pre></td></tr>\r
+\r
+<tr>\r
+<td><pre>cond ? value : alternative</pre></td>\r
+<td><pre><b>if</b> cond <b>then</b> value <b>else</b> alternative</pre></td>\r
+</tr>\r
+\r
+<tr>\r
+<td><pre>"I am " + age + " years old."</pre></td>\r
+<td>\r
+<pre>"I am " + show age + " years old."</pre>\r
+\r
+In future:\r
+\r
+<pre>"I am ${age} years old."</pre>\r
+</td>\r
+</tr>\r
+\r
+<tr><td><pre>\r
+<b>final</b> int sum = a + b;</pre>\r
+</td><td><pre>\r
+sum = a + b</pre>\r
+</td></tr>\r
+\r
+<tr><td><pre>\r
+public static String decorate(String x) {\r
+ return "(" + x + ")"; \r
+}</pre>\r
+</td><td><pre>\r
+decorate :: String -> String\r
+decorate x = "(" + x + ")"</pre>\r
+(the first line is optional)\r
+</td></tr>\r
+\r
+<tr><td><pre>\r
+{\r
+ statement1;\r
+ statement2;\r
+ statement3;\r
+}</pre>\r
+</td><td><pre>\r
+<b>do</b>\r
+ statement1\r
+ statement2\r
+ statement3\r
+</pre></td></tr>\r
+\r
+<tr><td><pre>\r
+<b>if</b>(cond1)\r
+ statement1;\r
+<b>else if</b>(cond2)\r
+ statement2;\r
+<b>else</b> \r
+ statement3;\r
+</pre></td><td><pre>\r
+<b>if</b> cond1\r
+<b>then</b> statement1\r
+<b>else if</b> cond2\r
+<b>then</b> statement2\r
+<b>else</b> statement3\r
+</pre></td></tr>\r
+\r
+<tr><td><pre>\r
+<b>for</b>(T x : l)\r
+ statement;\r
+</pre></td><td><pre>\r
+for l (\x -> \r
+ statement\r
+)\r
+</pre></td></tr>\r
+\r
+<tr><td><pre>\r
+<b>while</b>(cond) statement;\r
+</pre></td><td><pre>\r
+while (\() -> cond) (\() -> statement)\r
+</pre>\r
+In future with improvements to macros:\r
+<pre>\r
+while cond statement\r
+</pre>\r
+</td></tr>\r
+\r
+<tr><td><pre>\r
+int var;\r
+<b>switch</b>(value) {\r
+<b>case</b> Label1: \r
+ var = case1; \r
+ break;\r
+<b>case</b> Label2: \r
+ var = case2; \r
+ break;\r
+<b>default</b>:\r
+ var = case3; \r
+}</pre>\r
+</td><td><pre>\r
+var = <b>match</b> value <b>with</b>\r
+ Label1 -> case1\r
+ Label2 -> case2\r
+ _ -> case3\r
+</pre>\r
+</td></tr>\r
+\r
+<tr><td><pre>\r
+<b>break</b>;\r
+<b>continue</b>;\r
+<b>return</b> x; // In the middle of the code\r
+</pre></td><td>No exact correspondence. However, every control sequence can be written in the following form:\r
+<pre>label1 initialState\r
+ where\r
+ label1 state = \r
+ ...\r
+ then label2 modifiedState1\r
+ else label3 modifiedState2\r
+ label2 state = \r
+ ...\r
+ label3 state = \r
+ ...\r
+ label1 modifiedState</pre>\r
+</td></tr>\r
+\r
+<tr><td><pre>\r
+int a, b;\r
+<b>if</b>(cond) {\r
+ a = aExp1;\r
+ b = bExp1;\r
+}\r
+<b>else</b> {\r
+ a = aExp2;\r
+ b = bExp2;\r
+}\r
+</pre>\r
+</td><td><pre>\r
+(a, b) = <b>if</b> cond\r
+ <b>then</b> (aExp1, bExp1)\r
+ <b>else</b> (aExp2, bExp2) \r
+</pre>\r
+</td></tr>\r
+\r
+<tr><td><pre>\r
+int a = 1;\r
+a = 2;\r
+a = 3;\r
+return a;\r
+</pre>\r
+</td><td><pre>\r
+a = ref 1\r
+a := 2\r
+a := 3\r
+getRef a\r
+</pre>\r
+\r
+The name of the function <code>getRef</code> will change in the future and is\r
+probably replaced by some special syntax. For example in ML <code>getRef a</code>\r
+would be written as <code>!a</code>.\r
+\r
+</td></tr>\r
+\r
+<tr><td><pre>\r
+public static String f(int x) {\r
+ if(x >= 0)\r
+ return Integer.toString(x);\r
+ else\r
+ return null;\r
+}</pre>\r
+</td><td><pre>\r
+f :: Integer -> Maybe String\r
+f x | x >= 0 = Just (show x)\r
+ | otherwise = Nothing\r
+</pre>\r
+</td></tr>\r
+\r
+<tr><td><pre>\r
+public static int invF(String s) {\r
+ if(s == null)\r
+ return -1;\r
+ else\r
+ return Integer.parseInt(s);\r
+}</pre>\r
+</td><td><pre>\r
+invF :: Maybe String -> Integer\r
+invF Nothing = -1\r
+invF (Just s) = read s\r
+</pre>\r
+</td></tr>\r
+\r
+<tr><td><pre>\r
+Arrays.asList(new String[] {"x", "y", "z"})\r
+</pre>\r
+</td><td><pre>\r
+["x", "y", "z"]\r
+</pre>\r
+</td></tr>\r
+\r
+<tr><td><pre>\r
+l.get(3)\r
+</pre>\r
+</td><td><pre>\r
+l!3\r
+</pre>\r
+</td></tr>\r
+\r
+<tr><td><pre>\r
+List<String> decorated = new ArrayList<String>();\r
+for(String s : undecorated)\r
+ decorated.add("(" + s + ")");\r
+</pre>\r
+</td><td><pre>\r
+decorated = ["(" + s + ")" | s <- undecorated]\r
+</pre>\r
+or\r
+<pre>\r
+decorated = map (\s -> "(" + s + ")") undecorated\r
+</pre>\r
+</td></tr>\r
+\r
+<tr><td><pre>\r
+List<String> nonempty = new ArrayList<String>();\r
+for(String s : l)\r
+ if(!s.isEmpty())\r
+ nonempty.add(l);\r
+</pre>\r
+</td><td><pre>\r
+decorated = [s | s <- l, s != ""]\r
+</pre>\r
+or\r
+<pre>\r
+decorated = filter (\s -> s != "") l\r
+</pre>\r
+</td></tr>\r
+\r
+<tr><td><pre>\r
+List<List<String>> listOfLists;\r
+List<String> flattened \r
+ = new ArrayList<String>();\r
+for(List<String> l : listOfLists)\r
+ for(String s : l)\r
+ flattened.add(s);\r
+</pre>\r
+</td><td><pre>\r
+flattened = [s | l <- listOfLists, s <- l]\r
+</pre>\r
+or\r
+<pre>\r
+flattened = sum listOfLists\r
+</pre>\r
+or\r
+<pre>\r
+flattened = join listOfLists\r
+</pre>\r
+</td></tr>\r
+\r
+<tr><td><pre>\r
+throw new RuntimeException("Unhandled case.");\r
+</pre>\r
+</td><td>\r
+<pre>fail "Unhandled case."</pre>\r
+</td></tr>\r
+\r
+\r
+<tr><td><pre>\r
+<b>try</b> {\r
+ ...\r
+ <b>throw</b> new ExceptionX(...);\r
+ ...\r
+} <b>catch</b>(ExceptionX e) {\r
+ ...\r
+} <b>finally</b> {\r
+ ...\r
+}\r
+</pre>\r
+</td><td>\r
+Currently no correspondence. Exceptions need to be thrown and catched in Java code.\r
+</td></tr>\r
+\r
+<tr><td><pre>\r
+<b>synchronized</b>(obj) {\r
+ ...\r
+}\r
+</pre>\r
+</td><td>\r
+Currently no correspondence. Synchronization must be done in Java code.\r
+</td></tr>\r
+\r
+<tr><td><pre>\r
+<b>final static class</b> Vec3 {\r
+ public final double x;\r
+ public final double y;\r
+ public final double z;\r
+ \r
+ public Vec3(double x, \r
+ double y, \r
+ double x) {\r
+ this.x = x;\r
+ this.y = y;\r
+ this.z = z;\r
+ }\r
+}\r
+</pre>\r
+</td><td><pre>\r
+<b>data</b> Vec3 = Vec3 Double Double Double\r
+</pre>\r
+\r
+In future also:\r
+\r
+<pre>\r
+<b>data</b> Vec3 = Vec3 {\r
+ x :: Double,\r
+ y :: Double,\r
+ z :: Double\r
+}\r
+</pre>\r
+</td></tr>\r
+\r
+<tr><td><pre>\r
+public static interface Num {}\r
+public static class Int implements Num {\r
+ public static final int value;\r
+ public Int(int value) {\r
+ this.value = value;\r
+ } \r
+}\r
+public static class Real implements Num {\r
+ public static final double value;\r
+ public Real(double value) {\r
+ this.value = value;\r
+ } \r
+}\r
+</pre>\r
+</td><td><pre>\r
+data Num = Int Integer\r
+ | Real Double\r
+</pre></td></tr>\r
+\r
+<tr><td><pre>\r
+public static Num add(Num a_, Num b_) {\r
+ if(a_ instanceof Int) {\r
+ Int a = (Int)a_;\r
+ if(b_ instanceof Int) {\r
+ Int b = (Int)b_;\r
+ return new Int(a.value + b.value);\r
+ }\r
+ else if(b_ instanceof Real) {\r
+ Real b = (Real)b_;\r
+ return new Real(a.value + b.value);\r
+ }\r
+ }\r
+ else if(a_ instanceof Real) {\r
+ Real a = (Real)a_;\r
+ if(b_ instanceof Int) {\r
+ Int b = (Int)b_;\r
+ return new Real(a.value + b.value);\r
+ }\r
+ else if(b_ instanceof Real) {\r
+ Real b = (Real)b_;\r
+ return new Real(a.value + b.value);\r
+ }\r
+ }\r
+ throw new IllegalArgumentException();\r
+}\r
+</pre>\r
+</td><td><pre>\r
+add :: Num -> Num -> Num\r
+add (Int a) (Int b) = Int (a + b)\r
+add (Int a) (Real b) = Real (fromInteger a + b)\r
+add (Real a) (Int b) = Real (a + fromInteger b)\r
+add (Real a) (Real b) = Real (a + b)\r
+</pre></td></tr>\r
+\r
+<tr><td><pre>\r
+public static interface Bijection<A,B> {\r
+ B forward(A v);\r
+ A backward(B v);\r
+}\r
+\r
+Bijection<Integer,Integer> inc = \r
+new Bijection<Integer,Integer> {\r
+ public Integer forward(Integer v) {\r
+ return v + 1;\r
+ }\r
+ public Integer backward(Integer v) {\r
+ return v - 1;\r
+ }\r
+}\r
+</pre>\r
+</td><td><pre>\r
+data Bijection a b = \r
+ Bijection (a -> b) (b -> a)\r
+ \r
+forward (Bijection f _) v = f v \r
+backward (Bijection _ f) v = f v\r
+\r
+inc = Bijection (\v -> v + 1) (\v -> v - 1)\r
+</pre>\r
+\r
+In future:\r
+\r
+<pre>\r
+data Bijection a b = Bijection {\r
+ forward :: a -> b,\r
+ backward :: b -> a\r
+}\r
+\r
+inc = Bijection {\r
+ forward v = v + 1,\r
+ backward v = v - 1\r
+}\r
+</pre>\r
+</td></tr>\r
+</table>\r
+\r
+<h3>Longer examples</h3>\r
+\r
+<table border="1">\r
+<tr><td><pre>\r
+publid static int findIndex(List<String> strings, String target) {\r
+ int low=0, high=xs.size();\r
+ while(high-low > 1) {\r
+ int middle = (low + high)/2;\r
+ int cmp = xs.get(middle).compareTo(target);\r
+ if(cmp < 0)\r
+ low = middle;\r
+ else if(cmp > 0)\r
+ high = middle;\r
+ else\r
+ return middle;\r
+ }\r
+}\r
+</pre>\r
+</td><td><pre>\r
+findIndex :: [String] -> String -> Integer\r
+findIndex strings target = loop 0 (length strings) \r
+ where\r
+ loop low high \r
+ | high - low > 1 = do\r
+ middle = (low + high) `div` 2\r
+ cmp = compare (xs!middle) target\r
+ if cmp < 0\r
+ then loop middle high\r
+ else if cmp > 0\r
+ then loop low middle\r
+ else middle\r
+ | otherwise = low \r
+</pre>\r
+</td></tr>\r
+</table>\r
+\r
+</body></html>
\ No newline at end of file