Changes for page WebObjects with Scala

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

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

Summary

Details

Page properties
Content
... ... @@ -1,19 +1,15 @@
1 1  === What is Scala? ===
2 2  
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.
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.
5 5  
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.
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:
8 8  
9 -Here's a quick summary:
10 -
11 11  |= |= Objective-C |= Java |= Scala
12 -|= Separation of Mutable & Immuable Datatypes | Collections //e.g: NSArray/NSMutableArray// | No | Yes
13 -|= Closures | Blocks (//Extension//) | No | Anonymous Functions
8 +|= Immutability | Partial - via collections //e.g: NSArray/NSMutableArray// | No | Yes
9 +|= Closures | Yes - via Blocks (//Extension//) | No | Yes - via Anonymous Functions
14 14  |= Static variables | Yes | Yes | No
15 15  |= Static methods or functions | Yes | Yes | No
16 -|= Concurrency | [[Grand Central Dispatch>>http://en.wikipedia.org/wiki/Grand_Central_Dispatch]] (//Extension//) | //Threads// | [[Actors>>http://en.wikipedia.org/wiki/Actor_model]]
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]]
17 17  |= |= Weakly Typed |= --Strongly Typed-- |= Strongly Typed
18 18  
19 19  Other notable features include:
... ... @@ -20,20 +20,23 @@
20 20  
21 21  |= |= Objective-C |= Java |= Scala
22 22  |= Parametered methods | Yes //e.g: addObject: to~:// | No | Yes //e.g: add(object= ,to=)//
23 -|= Class composition | Categories | Interfaces | Traits
19 +|= Class composition | Yes - via Categories | Yes - via Interfaces | Yes - via [[Traits>>http://en.wikipedia.org/wiki/Trait_(computer_science)]]
24 24  
25 25  === Why Use Scala? ===
26 26  
27 -Scala is inherently thread-safe.
28 -It has concurrency that is effectively built-in to the language.
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).
29 29  
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 -
32 32  === Can WebObjects be Programmed In Scala? ===
33 33  
34 34  Yes. It is very simple.
35 -Scala compiles to java bytecode. Hence using it with WebObjects is fairly straightforward.
28 +By virtue of being a JVM-language, Scala compiles to java bytecode.
36 36  
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 +
37 37  = WebObjects In Scala =
38 38  
39 39  The following highlights some of the differences between Java and Scala in WebObjects:
... ... @@ -44,7 +44,8 @@
44 44  
45 45  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.
46 46  
47 -So you don't have to worry about synchronizing access to shared mutable fields in a concurrent application.
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).
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 extends EOGenericRecord {
64 +object Talent {
65 65   val ENTITY_NAME = "Talent"
66 66  
67 67  {{/code}}
... ... @@ -76,8 +76,6 @@
76 76  
77 77  ==== Compacted imports ====
78 78  
79 -Two lines in Java are compacted into one in Scala.
80 -
81 81  In Java:
82 82  
83 83  {{code value="java"}}
... ... @@ -188,42 +188,25 @@
188 188  
189 189  == How to Use Scala Collections with EOF ==
190 190  
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.
189 +To use the Scala Collections API with an NSArray or NSDictionary you simply need to add an import:
193 193  
194 -But one may modify the EO templates to produce API such as:
191 +{{code value="java"}}
195 195  
196 -{{code}}
197 -
198 198  import scala.collection.JavaConversions._
199 199  
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 -
208 208  {{/code}}
209 209  
210 -This employs a feature of Scala known as **implicit conversions** to automagically convert a NSArray (a Java Iterable) into a Scala Iterable.
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.
211 211  
212 -== How to Add Scala to a WO Project ==
199 +== How to Add Scala to a WO Project (in Eclipse) ==
213 213  
214 214  {{include value="WOL:Adding Scala Support to a WOLips Project"}}{{/include}}
215 215  
216 -{{note}}
217 -
218 -This is for Eclipse/WOLips IDE
219 -
220 -{{/note}}
221 -
222 222  == WO Scala Example ==
223 223  
224 224  The following example is an almost 100% Scala WO app. In reality it is a mixed Java/Scala app:
225 225  All the EO logic and WO components are in Scala.
226 -Only the Application class is Java.
207 +Only the Application class remains Java.
227 227  
228 228  It is based on the D2W Movies example.
229 229  
... ... @@ -234,6 +234,12 @@
234 234  1. [[Install the Scala eclipse IDE>>http://www.scala-ide.org/]]
235 235  1. Right-click on Application.java and run as a WOApplication (as usual).
236 236  
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 +
237 237  == EO Templates ==
238 238  
239 239  When you create your ##.eogen## file, be sure to make the following changes in the EOGenerator Editor: