X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=bundles%2Forg.simantics.scl.runtime%2Fsrc-isv%2FJavaVsSCL.mediawiki;h=344d6f42dba41cf8a324c1bb297176a83cc59ab4;hb=refs%2Fchanges%2F75%2F3375%2F1;hp=029333907d73eb91f13e24053ee415b400a3c1a8;hpb=969bd23cab98a79ca9101af33334000879fb60c5;p=simantics%2Fplatform.git
diff --git a/bundles/org.simantics.scl.runtime/src-isv/JavaVsSCL.mediawiki b/bundles/org.simantics.scl.runtime/src-isv/JavaVsSCL.mediawiki
index 029333907..344d6f42d 100644
--- a/bundles/org.simantics.scl.runtime/src-isv/JavaVsSCL.mediawiki
+++ b/bundles/org.simantics.scl.runtime/src-isv/JavaVsSCL.mediawiki
@@ -1,462 +1,462 @@
-== Comparison of Java and SCL ==
-
-=== Language constructions and patterns ===
-
-
-
-0.5 + x * (2e-3 + x * 2) |
-0.5 + x * (2e-3 + x * 2) |
-
-
-
-x >= 0 && x <= 1 |
-x >= 0 && x <= 1 |
-
-
-
-Math.sin(a1) - Math.cos(a2) |
-sin a1 - cos a2 |
-
-
-cond ? value : alternative |
-if cond then value else alternative |
-
-
-
-"I am " + age + " years old." |
-
-"I am " + show age + " years old."
-
-In future:
-
-"I am ${age} years old."
- |
-
-
-
-final int sum = a + b;
- |
-sum = a + b
- |
-
-
-public static String decorate(String x) {
- return "(" + x + ")";
-}
- |
-decorate :: String -> String
-decorate x = "(" + x + ")"
-(the first line is optional)
- |
-
-
-{
- statement1;
- statement2;
- statement3;
-}
- |
-do
- statement1
- statement2
- statement3
- |
-
-
-if(cond1)
- statement1;
-else if(cond2)
- statement2;
-else
- statement3;
- |
-if cond1
-then statement1
-else if cond2
-then statement2
-else statement3
- |
-
-
-for(T x : l)
- statement;
- |
-for l (\x ->
- statement
-)
- |
-
-
-while(cond) statement;
- |
-while (\() -> cond) (\() -> statement)
-
-In future with improvements to macros:
-
-while cond statement
-
- |
-
-
-int var;
-switch(value) {
-case Label1:
- var = case1;
- break;
-case Label2:
- var = case2;
- break;
-default:
- var = case3;
-}
- |
-var = match value with
- Label1 -> case1
- Label2 -> case2
- _ -> case3
-
- |
-
-
-break;
-continue;
-return x; // In the middle of the code
- | No exact correspondence. However, every control sequence can be written in the following form:
-label1 initialState
- where
- label1 state =
- ...
- then label2 modifiedState1
- else label3 modifiedState2
- label2 state =
- ...
- label3 state =
- ...
- label1 modifiedState
- |
-
-
-int a, b;
-if(cond) {
- a = aExp1;
- b = bExp1;
-}
-else {
- a = aExp2;
- b = bExp2;
-}
-
- |
-(a, b) = if cond
- then (aExp1, bExp1)
- else (aExp2, bExp2)
-
- |
-
-
-int a = 1;
-a = 2;
-a = 3;
-return a;
-
- |
-a = ref 1
-a := 2
-a := 3
-getRef a
-
-
-The name of the function getRef will change in the future and is
-probably replaced by some special syntax. For example in ML getRef a
-would be written as !a .
-
- |
-
-
-public static String f(int x) {
- if(x >= 0)
- return Integer.toString(x);
- else
- return null;
-}
- |
-f :: Integer -> Maybe String
-f x | x >= 0 = Just (show x)
- | otherwise = Nothing
-
- |
-
-
-public static int invF(String s) {
- if(s == null)
- return -1;
- else
- return Integer.parseInt(s);
-}
- |
-invF :: Maybe String -> Integer
-invF Nothing = -1
-invF (Just s) = read s
-
- |
-
-
-Arrays.asList(new String[] {"x", "y", "z"})
-
- |
-[ "x", "y", "z" ]
-
- |
-
-
-l.get(3)
-
- |
-l!3
-
- |
-
-
-List decorated = new ArrayList();
-for(String s : undecorated)
- decorated.add("(" + s + ")");
-
- |
-decorated = [ "(" + s + ")" | s <- undecorated ]
-
-or
-
-decorated = map (\s -> "(" + s + ")") undecorated
-
- |
-
-
-List nonempty = new ArrayList();
-for(String s : l)
- if(!s.isEmpty())
- nonempty.add(l);
-
- |
-decorated = [ s | s <- l, s != "" ]
-
-or
-
-decorated = filter (\s -> s != "") l
-
- |
-
-
-List> listOfLists;
-List flattened
- = new ArrayList();
-for(List l : listOfLists)
- for(String s : l)
- flattened.add(s);
-
- |
-flattened = [ s | l <- listOfLists, s <- l ]
-
-or
-
-flattened = sum listOfLists
-
-or
-
-flattened = join listOfLists
-
- |
-
-
-throw new RuntimeException("Unhandled case.");
-
- |
-fail "Unhandled case."
- |
-
-
-
-try {
- ...
- throw new ExceptionX(...);
- ...
-} catch(ExceptionX e) {
- ...
-} finally {
- ...
-}
-
- |
-Currently no correspondence. Exceptions need to be thrown and catched in Java code.
- |
-
-
-synchronized(obj) {
- ...
-}
-
- |
-Currently no correspondence. Synchronization must be done in Java code.
- |
-
-
-final static class Vec3 {
- public final double x;
- public final double y;
- public final double z;
-
- public Vec3(double x,
- double y,
- double x) {
- this.x = x;
- this.y = y;
- this.z = z;
- }
-}
-
- |
-data Vec3 = Vec3 Double Double Double
-
-
-In future also:
-
-
-data Vec3 = Vec3 {
- x :: Double,
- y :: Double,
- z :: Double
-}
-
- |
-
-
-public static interface Num {}
-public static class Int implements Num {
- public static final int value;
- public Int(int value) {
- this.value = value;
- }
-}
-public static class Real implements Num {
- public static final double value;
- public Real(double value) {
- this.value = value;
- }
-}
-
- |
-data Num = Int Integer
- | Real Double
- |
-
-
-public static Num add(Num a_, Num b_) {
- if(a_ instanceof Int) {
- Int a = (Int)a_;
- if(b_ instanceof Int) {
- Int b = (Int)b_;
- return new Int(a.value + b.value);
- }
- else if(b_ instanceof Real) {
- Real b = (Real)b_;
- return new Real(a.value + b.value);
- }
- }
- else if(a_ instanceof Real) {
- Real a = (Real)a_;
- if(b_ instanceof Int) {
- Int b = (Int)b_;
- return new Real(a.value + b.value);
- }
- else if(b_ instanceof Real) {
- Real b = (Real)b_;
- return new Real(a.value + b.value);
- }
- }
- throw new IllegalArgumentException();
-}
-
- |
-add :: Num -> Num -> Num
-add (Int a) (Int b) = Int (a + b)
-add (Int a) (Real b) = Real (fromInteger a + b)
-add (Real a) (Int b) = Real (a + fromInteger b)
-add (Real a) (Real b) = Real (a + b)
- |
-
-
-public static interface Bijection {
- B forward(A v);
- A backward(B v);
-}
-
-Bijection inc =
-new Bijection {
- public Integer forward(Integer v) {
- return v + 1;
- }
- public Integer backward(Integer v) {
- return v - 1;
- }
-}
-
- |
-data Bijection a b =
- Bijection (a -> b) (b -> a)
-
-forward (Bijection f _) v = f v
-backward (Bijection _ f) v = f v
-
-inc = Bijection (\v -> v + 1) (\v -> v - 1)
-
-
-In future:
-
-
-data Bijection a b = Bijection {
- forward :: a -> b,
- backward :: b -> a
-}
-
-inc = Bijection {
- forward v = v + 1,
- backward v = v - 1
-}
-
- |
-
-
-=== Longer examples ===
-
-