]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.runtime/src-isv/JavaVsSCL.mediawiki
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.runtime / src-isv / JavaVsSCL.mediawiki
diff --git a/bundles/org.simantics.scl.runtime/src-isv/JavaVsSCL.mediawiki b/bundles/org.simantics.scl.runtime/src-isv/JavaVsSCL.mediawiki
new file mode 100644 (file)
index 0000000..0293339
--- /dev/null
@@ -0,0 +1,462 @@
+== Comparison of Java and SCL ==\r
+\r
+=== Language constructions and patterns ===\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
+=== Longer examples ===\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>
\ No newline at end of file