Changes for page WebObjects with Scala

Last modified by Ravi Mendis on 2011/05/10 02:10

From version 512.1
edited by Ravi Mendis
on 2010/12/24 01:36
Change comment: There is no comment for this version
To version 513.1
edited by Ravi Mendis
on 2010/08/12 03:17
Change comment: Bump section header

Summary

Details

Page properties
Content
... ... @@ -1,15 +1,19 @@
1 1  === What is Scala? ===
2 2  
3 -[[Scala>>http://www.scala-lang.org/]] is a modern, multi-paradigm JVM language that is most often compared to [[Groovy>>http://en.wikipedia.org/wiki/Groovy_(programming_language)]], [[Clojure>>http://en.wikipedia.org/wiki/Clojure]] or [[Erlang>>http://en.wikipedia.org/wiki/Erlang_(programming_language)]]. Its [[functional language>>http://en.wikipedia.org/wiki/Functional_programming]] foundations and built-in [[Actors>>http://en.wikipedia.org/wiki/Actor_model]] library make it especially attractive for concurrent computing. (Scala is an abbreviation for "scalable" hinting at its design goals). In this day and age of multi-core processors concurrent computing can not be ignored.
3 +[[Scala>>http://en.wikipedia.org/wiki/Scala_(programming_language)]] is a language for concurrent computing.
4 +In this day and age of multi-core processors, concurrent computing can't be ignored.
4 4  
5 -Many of the design features of Scala have been chosen with concurrency in mind, some of which may not be unfamiliar to Objective-C or WebObjects developers. Here's a summary:
6 +Many of Scala's features have been designed with concurrency in mind.
7 +Some of these may not be unfamiliar to Objective-C or WebObjects developers.
6 6  
9 +Here's a quick summary:
10 +
7 7  |= |= Objective-C |= Java |= Scala
8 -|= Immutability | Partial - via collections //e.g: NSArray/NSMutableArray// | No | Yes
9 -|= Closures | Yes - via Blocks (//Extension//) | No | Yes - via Anonymous Functions
12 +|= Separation of Mutable & Immuable Datatypes | Collections //e.g: NSArray/NSMutableArray// | No | Yes
13 +|= Closures | Blocks (//Extension//) | No | Anonymous Functions
10 10  |= Static variables | Yes | Yes | No
11 11  |= Static methods or functions | Yes | Yes | No
12 -|= Concurrency | Yes - via [[Grand Central Dispatch>>http://en.wikipedia.org/wiki/Grand_Central_Dispatch]] (//Extension//) | //Yes - via Threads// | Yes - via [[Actors>>http://en.wikipedia.org/wiki/Actor_model]]
16 +|= Concurrency | [[Grand Central Dispatch>>http://en.wikipedia.org/wiki/Grand_Central_Dispatch]] (//Extension//) | //Threads// | [[Actors>>http://en.wikipedia.org/wiki/Actor_model]]
13 13  |= |= Weakly Typed |= --Strongly Typed-- |= Strongly Typed
14 14  
15 15  Other notable features include:
... ... @@ -16,23 +16,20 @@
16 16  
17 17  |= |= Objective-C |= Java |= Scala
18 18  |= Parametered methods | Yes //e.g: addObject: to~:// | No | Yes //e.g: add(object= ,to=)//
19 -|= Class composition | Yes - via Categories | Yes - via Interfaces | Yes - via [[Traits>>http://en.wikipedia.org/wiki/Trait_(computer_science)]]
23 +|= Class composition | Categories | Interfaces | Traits
20 20  
21 21  === Why Use Scala? ===
22 22  
23 -For WebObjects developers, Scala offers itself as a powerful, safe and easy-to-use solution for [[concurrent computing>>Building Concurrent Applications with WebObjects and Scala]]. (In other words, Scala Actors can be used for problems that would have normally required threads).
27 +Scala is inherently thread-safe.
28 +It has concurrency that is effectively built-in to the language.
24 24  
30 +So for WebObjects developers, Scala offers itself as a powerful, safe and easy-to-use solution for [[concurrent applications>>Building Concurrent Applications with WebObjects and Scala]]. (In other words, Scala Actors can be used for problems that would have normally required threads).
31 +
25 25  === Can WebObjects be Programmed In Scala? ===
26 26  
27 27  Yes. It is very simple.
28 -By virtue of being a JVM-language, Scala compiles to java bytecode.
35 +Scala compiles to java bytecode. Hence using it with WebObjects is fairly straightforward.
29 29  
30 -Furthermore, being a multi-paradigm language grants Scala easy WebObjects-interoperability.
31 -
32 -===== Caveats =====
33 -
34 -Legacy tool support is often cited as a weak point. The [[Eclipse Scala plugin>>http://www.scala-ide.org]] has been found to be slow at times and sometimes buggy.
35 -
36 36  = WebObjects In Scala =
37 37  
38 38  The following highlights some of the differences between Java and Scala in WebObjects:
... ... @@ -43,8 +43,7 @@
43 43  
44 44  Scala doesn't have static variables or methods. Instead Scala employs the [[Singleton Pattern>>http://en.wikipedia.org/wiki/Singleton_pattern]] which is built into the language and is **thread-safe**: a class can have a //Companion Object// that will allow you to achieve something equivalent to static variables - but better.
45 45  
46 -You don't have to worry about synchronizing access to shared mutable fields in a concurrent application.
47 -(This is not however true when for example you have a ##val## declared as a ##NSMutableArray##. You will still have to synchronize when adding to or removing from this mutable field).
47 +So you don't have to worry about synchronizing access to shared mutable fields in a concurrent application.
48 48  
49 49  The following is an example of the use of a //Companion Object// for Talent in Scala instead of Talent static fields in Java.
50 50  
... ... @@ -61,7 +61,7 @@
61 61  
62 62  {{code}}
63 63  
64 -object Talent {
64 +object Talent extends EOGenericRecord {
65 65   val ENTITY_NAME = "Talent"
66 66  
67 67  {{/code}}
... ... @@ -76,6 +76,8 @@
76 76  
77 77  ==== Compacted imports ====
78 78  
79 +Two lines in Java are compacted into one in Scala.
80 +
79 79  In Java:
80 80  
81 81  {{code value="java"}}
... ... @@ -186,25 +186,42 @@
186 186  
187 187  == How to Use Scala Collections with EOF ==
188 188  
189 -To use the Scala Collections API with an NSArray or NSDictionary you simply need to add an import:
191 +One of the benefits of Scala is its very powerful, concurrency-ready collection classes - primarily ##List##, ##Map## and ##Set##.
192 +Employing these instead of ##NSArray## and ##NSDictionary## in WebObjects/EOF may be challenging.
190 190  
191 -{{code value="java"}}
194 +But one may modify the EO templates to produce API such as:
192 192  
196 +{{code}}
197 +
193 193  import scala.collection.JavaConversions._
194 194  
200 +def movies = {
201 + storedValueForKey(_Studio.Keys.MOVIES).asInstanceOf[NSArray[Movie]]
202 +}
203 +
204 +def moviesList = {
205 + movies.asInstanceOf[java.lang.Iterable[Movie]].toList
206 +}
207 +
195 195  {{/code}}
196 196  
197 -After that, you may access the typical Scala collection methods directly on NSArray.  This employs a feature of Scala known as implicit conversions to automagically cast a NSArray (a Java Iterable) into a Scala Iterable while leaving the actual object unchanged.
210 +This employs a feature of Scala known as **implicit conversions** to automagically convert a NSArray (a Java Iterable) into a Scala Iterable.
198 198  
199 -== How to Add Scala to a WO Project (in Eclipse) ==
212 +== How to Add Scala to a WO Project ==
200 200  
201 201  {{include value="WOL:Adding Scala Support to a WOLips Project"}}{{/include}}
202 202  
216 +{{note}}
217 +
218 +This is for Eclipse/WOLips IDE
219 +
220 +{{/note}}
221 +
203 203  == WO Scala Example ==
204 204  
205 205  The following example is an almost 100% Scala WO app. In reality it is a mixed Java/Scala app:
206 206  All the EO logic and WO components are in Scala.
207 -Only the Application class remains Java.
226 +Only the Application class is Java.
208 208  
209 209  It is based on the D2W Movies example.
210 210  
... ... @@ -215,12 +215,6 @@
215 215  1. [[Install the Scala eclipse IDE>>http://www.scala-ide.org/]]
216 216  1. Right-click on Application.java and run as a WOApplication (as usual).
217 217  
218 -{{note}}
219 -
220 -Application can be made into a Scala class as well, but then you will have to create a launcher in Eclipse manually.
221 -
222 -{{/note}}
223 -
224 224  == EO Templates ==
225 225  
226 226  When you create your ##.eogen## file, be sure to make the following changes in the EOGenerator Editor: