]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.tutorial/scl/Tutorial/4.01 Other language features.md
Import org.simantics.scl.tutorial from incubator SVN repo
[simantics/platform.git] / bundles / org.simantics.scl.tutorial / scl / Tutorial / 4.01 Other language features.md
1 ## Importing functionality from Java\r
2 \r
3 Java interfaces and classes can be imported from Java by declaring them inside `importJava` block:\r
4 \r
5 ~~~\r
6 importJava "java.util.regex.Pattern" where\r
7     data Pattern\r
8 \r
9 importJava "java.util.List" where\r
10     data List a\r
11 ~~~\r
12 \r
13 Java methods, constructors and fields can be similarly imported by giving\r
14 their type annotations in `importJava` block:\r
15 \r
16 ~~~\r
17 importJava "java.util.regex.Pattern.compile" where\r
18     @JavaName compile\r
19     compilePattern :: String -> Pattern\r
20 \r
21     @JavaName matcher\r
22     createMatcher :: Pattern -> String -> <Proc> Matcher\r
23 \r
24 importJava "java.util.regex.Matcher" where\r
25     data Matcher\r
26 \r
27     @JavaName matches\r
28     matcherMatches :: Matcher -> <Proc> Boolean\r
29 \r
30 matches : Pattern -> String -> <Proc> Boolean\r
31 matches pattern text = do\r
32     matcherMatches (createMatcher pattern text)\r
33 ~~~\r
34 \r
35 Another example:\r
36 \r
37 ~~~\r
38 importJava "java.util.ArrayList" where\r
39     @JavaName "<init>"\r
40     createArrayList :: () -> <Proc> List a\r
41 \r
42     @JavaName "<init>"\r
43     createArrayListWithCapacity :: Integer -> <Proc> List a\r
44 \r
45     @JavaName size\r
46     sizeList :: List a -> <Proc> Integer\r
47 \r
48     @JavaName get\r
49     getList :: List a -> Integer -> <Proc> a\r
50 \r
51     @JavaName set\r
52     setList :: List a -> Integer -> a -> <Proc> ()\r
53 \r
54     @JavaName add\r
55     addList :: List a -> a -> <Proc> Boolean\r
56 ~~~\r
57 \r
58 Java constructor is referred with `"<init>"`. If Java method name and SCL name matches the annotation `@JavaName`\r
59 can be left out. Java import mechanism tries to be quite flexible. It provides some arguments based on the effects\r
60 the function has. It also ignores the return value of the Java method if the return type is `()` in SCL. \r
61 \r
62 A major functionality currently still missing is the ability to create new implementations of existing Java interfaces\r
63 in SCL code or extend an existing class. This can be worked around currently by writing new implementations in Java.\r
64 \r
65 ## Relational sublanguage \r
66 \r
67 * Select, when, enforce\r
68 * Transformations\r
69 \r
70 ## Other language features\r
71 \r
72 * Defining data types\r
73 * Defining type classes\r
74 * Defining effects \r
75 * Restricted imports\r
76 * Documentation strings\r
77 * Private definitions\r
78 * Binary operator precedence\r
79 \r