Minggu, 28 Maret 2010

Pemindahan blog

Hari ini, tulisan-tulisan saya tentang Scala akan saya jadikan satu di blog saya yang khusus membahas tentang Functional Programming serta berbagai development tools lainnya (Erlang, Haskell, dll). Silahkan mengunjungi alamatnya di Blog untuk Paradigma dan Teknologi Pemrograman Fungsional

Sampai ketemu :)

Sabtu, 27 Februari 2010

Masalah di scala-android 2.7.0final di Scala 2.7.7final

Saya meng-install scala-android dengan menggunakan repository "scala-dev"  berikut (default saat install scala/sbaz):

[bpdp@bpdp-arch scala-2.7.7.final]$ sbaz showuniverse
SimpleUniverse "scala-dev" (http://scala-webapps.epfl.ch/sbaz/scala-dev)
[bpdp@bpdp-arch scala-2.7.7.final]$ 

Paket yang terdapat di universe tersebut adalah sebagai berikut:

[bpdp@bpdp-arch scala-2.7.7.final]$ sbaz available | grep android
scala-android (2.7.0-final, 2.6.1-final)
[bpdp@bpdp-arch scala-2.7.7.final]$ 

Hasil install ini menyebabkan error sebagai berikut:

[bpdp@bpdp-arch ~]$ scala
Exception in thread "main" java.lang.VerifyError: (class: scala/tools/nsc/MainGenericRunner$, method: main signature: ([Ljava/lang/String;)V) Can only throw Throwable objects
at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala) 
[bpdp@bpdp-arch ~]$ scalac 
Exception in thread "main" java.lang.VerifyError: (class: scala/tools/nsc/Main$, method: main signature: ([Ljava/lang/String;)V) Can only throw Throwable objects
    at scala.tools.nsc.Main.main(Main.scala)

Berikut adalah paket-paket yang terinstall:

[bpdp@bpdp-arch ~]$ sbaz installed
base/1.9
sbaz/1.25tmp
sbaz-setup/1.0
scala/2.7.7.final
scala-android/2.7.0-final
scala-devel/2.7.7.final
scala-documentation/2.7.7.final
scala-library/2.7.7.final
scala-test/2.7.7.final
scala-tool-support/2.7.7.final
10 packages installed
[bpdp@bpdp-arch ~]$

Setelah saya remove scala-android, Scala bisa bekerja dengan baik:

[bpdp@bpdp-arch ~]$ sbaz remove scala-android
removing scala-android/2.7.0-final
[bpdp@bpdp-arch ~]$

[bpdp@bpdp-arch ~]$ scala
Welcome to Scala version 2.7.7.final (OpenJDK Client VM, Java 1.6.0_17).
Type in expressions to have them evaluated.
Type :help for more information.

scala> 

Bisa jadi ini disebabkan karena paket yang obsolete (2.7.0final untuk scala 2.7.7final). Untuk saat ini, saya menyarankan untuk mengambil pustaka di project scala-android di google code: http://code.google.com/p/scala-android/downloads/list (sayangnya, masih versi 2.7.5 - saya belum menguji untuk penggunaan Scala 2.7.7final).

Jumat, 26 Februari 2010

Variabel dan Type Inference di Scala

Scala mempunyai 2 tipe variable, yaitu vals dan vars. Tipe vals mirip dengan variable final di Java, yaitu tidak bisa diubah lagi jika telah ditetapkan. Tipe vars merupakan tipe variabel yang selalu bisa di-reassigned.

Tipe vals


Sesi script REPL (Read-Eval-Print-Loop) berikut ini menggambarkan sesi penggunaan vals.
scala> val name="Zaky Ahmad Aditya"
name: java.lang.String = Zaky Ahmad Aditya

scala> println(name)
Zaky Ahmad Aditya

scala> name = "Bambang Purnomosidi D. P."
<console>:5: error: reassignment to val
name = "Bambang Purnomosidi D. P."
^

scala>

Tipe vars


Sesi script REPL (Read-Eval-Print-Loop) berikut ini menggambarkan sesi penggunaan vars.
scala> var ipk = 3.86
ipk: Double = 3.86

scala> println(ipk)
3.86

scala> ipk = 3.90
ipk: Double = 3.9

scala> println(ipk)
3.9

scala>

Type Inference


Scala mempunyai kemampuan untuk type inference. artinya kemampuan untuk menentukan tipe data suatu variabel berdasarkan assignment awal. Lihat pada REPL di atas, potongan berikut ini adalah contoh dari kemampuan tersebut:

scala> var ipk = 3.86
ipk: Double = 3.86

Dengan kemampuan tersebut, scala langsung mengetahui bahwa tipe data yang di-assign ke ipk adalah tipe Double. Meskipun demikian, scala juga memungkinkan untuk menentukan tipe data pada saat assignment dengan menggunakan tanda colon (:) seperti berikut ini:

scala> var sks: Int = 21
sks: Int = 21

scala> sks = "STMIK AKAKOM"
<console>:5: error: type mismatch;
found : java.lang.String("STMIK AKAKOM")
required: Int
sks = "STMIK AKAKOM"
^

scala>

Mulai Menggunakan Scala

Scala merupakan software bebas dan bisa diperoleh dengan gratis (software bebas tidak sama dengan software gratis). Scala mempunyai lisensi BSD. Lisensi Scala bisa dibaca di http://www.scala-lang.org/node/146.

File Distribusi Scala


Pada URL http://www.scala-lang.org/downloads, terdapat beberapa distribusi. Penjelasan berikut ini menggunakan sistem operasi Linux. Distribusi yang diambil adalah versi 2.7.7.final yang merupakan versi terakhir / latest pada saat tulisan ini dibuat:
Unix, Mac OS X, Cygwin  scala-2.7.7.final.tgz (md5) 15.3 MB
Distribusi tersebut adalah distribusi inti. Komponen-komponen lainnya akan diinstal menggunakan sbaz (Scala Bazaar).

Instalasi


Asumsi:
  • /home/bpdp adalah direktori $HOME
  • Java telah terinstal (versi 5 ke atas) dan env variable JAVA_HOME telah diset
  • Scala akan diinstall di bawah direktori $HOME/software
  • Setting dan konfigurasi Scala diletakkan pada $HOME/environments/scala (buat direktori environments jika belum ada dengan:
    [bpdp@bpdp-arch ~]$ mkdir environments

Langkah-langkah instalasi adalah sebagai berikut:
[bpdp@bpdp-arch ~]$ cd software
[bpdp@bpdp-arch software]$ tar -xzvf scala-2.7.7.final.tgz
[bpdp@bpdp-arch software]$ cd scala-2.7.7.final/
[bpdp@bpdp-arch scala-2.7.7.final]$ ls -la
total 40
drwxr-xr-x 10 bpdp users 4096 Nov  1 17:07 .
drwxr-xr-x 17 bpdp users 4096 Feb 26 18:32 ..
drwxr-xr-x  2 bpdp users 4096 Oct 28 20:19 bin
drwxr-xr-x  5 bpdp users 4096 Nov  1 18:07 doc
drwxr-xr-x  2 bpdp users 4096 Oct 28 20:19 lib
drwxr-xr-x  3 bpdp users 4096 Oct 28 20:19 man
drwxr-xr-x  3 bpdp users 4096 Feb 26 08:30 meta
drwxr-xr-x  5 bpdp users 4096 Oct 28 20:19 misc
drwxr-xr-x  5 bpdp users 4096 Nov  1 17:06 scala-2.7.7.final-devel-docs
drwxr-xr-x  2 bpdp users 4096 Oct 28 20:19 src
[bpdp@bpdp-arch scala-2.7.7.final]$ 
Sebaiknya buat symbolic link ke direktori tersebut:
[bpdp@bpdp-arch software]$ ln -s scala-2.7.7.final scala
Buat file $HOME/environments/scala yang berisi setting dan konfigurasi shell berikut:

SCALA_HOME=/home/bpdp/software/scala
export CLASSPATH=$CLASSPATH:$SCALA_HOME/lib

PATH=$PATH:$SCALA_HOME/bin
export PATH

MANPATH=$SCALA_HOME/man:$MANPATH
export MANPATH
Instalasi selesai.

Menggunakan Scala


Untuk menggunakan Scala, kita hanya perlu melakukan langkah berikut:

$ source ~/environments/scala

Setelah itu kita bisa menggunakan compiler (fsc, scala, dan scalac), package manager (sbaz), dan scaladoc. Kita juga bisa membaca manual dari perintah-perintah tersebut dengan man (man fsc, man scala, man scalac, man sbaz, dan man scaladoc).

Menggunakan Scala Secara Interaktif (scala)


Contoh sesi berikut ini adalah contoh sesi interaktif menggunakan scala:

[bpdp@bpdp-arch ~]$ scala 
Welcome to Scala version 2.7.7.final (OpenJDK Client VM, Java 1.6.0_17).
Type in expressions to have them evaluated.
Type :help for more information.

scala> object HelloScala {
|   def main(args: Array[String]) {
|     println("Selamat datang di Scala")
|   }
| }
defined module HelloScala

scala> HelloScala.main(null)
Selamat datang di Scala

scala> :q
[bpdp@bpdp-arch ~]$ 


Mengkompilasi Menjadi .class dan Mengeksekusi Hasil Kompilasi


Buat file HelloScala.scala berikut ini menggunakan editor teks yang anda sukai:

object HelloScala {
  def main(args: Array[String]) {
    println("Selamat datang di Scala")
  }
}


Kompilasi source code tersebut:

$ scalac HelloScala.scala
$

Hasilnya adalah sebagai berikut:

[bpdp@bpdp-arch hello-script]$ ls -la
total 20
drwxr-xr-x 2 bpdp users 4096 2009-09-18 07:16 .
drwxr-xr-x 5 bpdp users 4096 2009-09-18 07:11 ..
-rw-r--r-- 1 bpdp users  789 2009-09-18 07:16 HelloScala$.class
-rw-r--r-- 1 bpdp users  607 2009-09-18 07:16 HelloScala.class
-rw-r--r-- 1 bpdp users   99 2009-09-18 07:16 HelloScala.scala
[bpdp@bpdp-arch hello-script]$ 

Untuk menjalankan hasil kompilasi tersebut, gunakan perintah berikut:

$ scala -classpath . HelloScala
Selamat datang di Scala
$ 

Plugin Scala untuk Netbeans (6.8)

Plugin untuk Netbeans dikembangkan oleh proyek ErlyBird dan bisa diperoleh di http://sourceforge.net/projects/erlybird/. Berbeda dengan plugin untuk Nb 6.7.1 yang masih menggunakan Scala versi lama, plugin untuk Nb 6.8 ini menggunakan versi bleeding edge (2.8.0 - nightly builds). Untuk menggunakan IDE dan plugin ini, ada beberapa file yang harus disiapkan (selain jdk):
  1. Scala (nightly builds 2.8.0): http://www.scala-lang.org/archives/downloads/distrib/files/nightly/distributions/scala-2.8.0.latest.zip
  2. Netbeans 6.8: http://netbeans.org/downloads/index.html
  3. Plugin ErlyBird: http://sourceforge.net/projects/erlybird/
Instalasi cukup dilakukan dengan mengekstrak file .zip hasil download dari project ErlyBird kemudian memilih "Tools" - "Plugins", klik pada "Downloaded" - "Add Plugins..." kemudian pilih semua file .nbm yang telah diekstrak tersebut. Setelah itu Netbeans 6.8 sudah siap digunakan untuk proyek Scala.

Syntax Highlighting, Deteksi Tipe File, dan Indentasi untuk Scala di Vim

Default vim di Arch Linux tidak menyertakan file-file scala.vim untuk syntax, ftdetect, dan indent. Berikut ini adalah langkah-langkah yang saya lakukan untuk meng-enable penggunaan Scala di Vim.

Buat Directory
[bpdp@bpdp-arch ~]$ mkdir .vim
[bpdp@bpdp-arch ~]$ cd .vim
[bpdp@bpdp-arch .vim]$ mkdir ftdetect
[bpdp@bpdp-arch .vim]$ mkdir indent
[bpdp@bpdp-arch .vim]$ mkdir syntax
[bpdp@bpdp-arch .vim]$ ls -la
total 20
drwxr-xr-x  5 bpdp users 4096 2009-09-17 06:27 .
drwx------ 95 bpdp users 4096 2009-09-17 06:26 ..
drwxr-xr-x  2 bpdp users 4096 2009-09-17 06:23 ftdetect
drwxr-xr-x  2 bpdp users 4096 2009-09-17 06:27 indent
drwxr-xr-x  2 bpdp users 4096 2009-09-17 06:26 syntax
[bpdp@bpdp-arch .vim]$ 
Mengambil file-file yang diperlukan

File-file tersebut berada di trunk svn berikut: https://lampsvn.epfl.ch/trac/scala/browser/scala-tool-support/trunk/src/vim dan bisa diambil via web melalui trac. Disini saya menggunakan wget untuk langsung mengambil file-file tersebut:

syntax
[bpdp@bpdp-arch syntax]$ wget https://lampsvn.epfl.ch/trac/scala/export/18712/scala-tool-support/trunk/src/vim/syntax/scala.vim
--2010-02-26 08:42:47--  https://lampsvn.epfl.ch/trac/scala/export/18712/scala-tool-support/trunk/src/vim/syntax/scala.vim
Resolving lampsvn.epfl.ch... 128.178.154.32
Connecting to lampsvn.epfl.ch|128.178.154.32|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 6043 (5.9K) [text/plain]
Saving to: “scala.vim”

100%[=====================================================================>] 6,043       13.2K/s   in 0.4s    

2010-02-26 08:42:50 (13.2 KB/s) - “scala.vim” saved [6043/6043]

[bpdp@bpdp-arch syntax]$ 
ftdetect 
[bpdp@bpdp-arch syntax]$ cd ../ftdetect/[bpdp@bpdp-arch ftdetect]$ wget https://lampsvn.epfl.ch/trac/scala/export/18712/scala-tool-support/trunk/src/vim/ftdetect/scala.vim
--2010-02-26 08:44:45--  https://lampsvn.epfl.ch/trac/scala/export/18712/scala-tool-support/trunk/src/vim/ftdetect/scala.vim
Resolving lampsvn.epfl.ch... 128.178.154.32
Connecting to lampsvn.epfl.ch|128.178.154.32|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 65 [text/plain]
Saving to: “scala.vim”

100%[=====================================================================>] 65          --.-K/s   in 0s      

2010-02-26 08:44:48 (2.86 MB/s) - “scala.vim” saved [65/65]

[bpdp@bpdp-arch ftdetect]$ 
indent
[bpdp@bpdp-arch ftdetect]$ cd ../indent/
[bpdp@bpdp-arch indent]$ wget https://lampsvn.epfl.ch/trac/scala/export/18712/scala-tool-support/trunk/src/vim/indent/scala.vim
--2010-02-26 08:46:51--  https://lampsvn.epfl.ch/trac/scala/export/18712/scala-tool-support/trunk/src/vim/indent/scala.vim
Resolving lampsvn.epfl.ch... 128.178.154.32
Connecting to lampsvn.epfl.ch|128.178.154.32|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2187 (2.1K) [text/plain]
Saving to: “scala.vim”

100%[=====================================================================>] 2,187       --.-K/s   in 0.01s  

2010-02-26 08:46:53 (193 KB/s) - “scala.vim” saved [2187/2187]

[bpdp@bpdp-arch indent]$
Proses di atas akan menghasilkan file-file berikut ini:
[bpdp@bpdp-arch .vim]$ ls -laR
.:
total 20
drwxr-xr-x   5 bpdp users 4096 Sep 17 06:27 .
drwx------ 113 bpdp users 4096 Feb 26 08:17 ..
drwxr-xr-x   2 bpdp users 4096 Feb 26 08:44 ftdetect
drwxr-xr-x   2 bpdp users 4096 Feb 26 08:47 indent
drwxr-xr-x   2 bpdp users 4096 Feb 26 08:42 syntax

./ftdetect:
total 12
drwxr-xr-x 2 bpdp users 4096 Feb 26 08:44 .
drwxr-xr-x 5 bpdp users 4096 Sep 17 06:27 ..
-rw-r--r-- 1 bpdp users   65 May 30  2008 scala.vim

./indent:
total 12
drwxr-xr-x 2 bpdp users 4096 Feb 26 08:47 .
drwxr-xr-x 5 bpdp users 4096 Sep 17 06:27 ..
-rw-r--r-- 1 bpdp users 2187 May 30  2008 scala.vim

./syntax:
total 16
drwxr-xr-x 2 bpdp users 4096 Feb 26 08:42 .
drwxr-xr-x 5 bpdp users 4096 Sep 17 06:27 ..
-rw-r--r-- 1 bpdp users 6043 Aug 16  2009 scala.vim
[bpdp@bpdp-arch .vim]$ 
Setelah itu vim/gvim bisa digunakan untuk mengedit file source code Scala. Berikut ini adalah contoh screenshot:


Pada vim, tampilannya adalah sebagai berikut: