Scala Support

awk4j (AWK for Java Platform)

Scala サポートとは

Scala Language はオブジェクト指向と関数型のプログラミングを兼ね備えており 静的型付けをおこなうプログラミング言語環境です。
awk4j Scala サポートは、 AWK の動的型付けと、 C言語由来のレガシー構文 (for(;;;), switch, break, continue, ++ -- increment/decrement, a=b=n 連続代入など) に対応し、 オブジェクト指向, 関数型プログラミング, 静的,動的型付 環境のダイナミックな言語連携を実現しました。

さあ始めよう

Scala の導入

サンプル

サンプル (素数計算、 RSS閲覧、 月齢計算、 簡易ブラウザ、 マンデルブロ集合) を実行する。

$ cd sample
$ make -f makescala sample

Note: 詳細は、makeファイルおよびサンプルソースを参照。

サンプル 1 (簡易ブラウザ)

“世界最短 1文字スクリプト '1' でホームページにアクセス” で紹介したスクリプトの GUI 版。
Label コンポーネントは、 HTMLタグを受け付けるため、 swing.Label で未サポートのタグを削除して表示する。

${SCALA} Browser5 "http://awk4j.sourceforge.net/home_en.html"
#% import scala.swing.{MainFrame, ScrollPane, Label}
  { basename = FILENAME; result = result $0
}
END { IGNORECASE = 1
    gsub(/<(!|meta)[^>]+>/, "", result); sub(/^.*<html[^>]+>/, "<html>", result)
    sub(/<head>/, "<head><base href='" basename "' />", result)
 #%  val top = new MainFrame {
 #%    preferredSize = new java.awt.Dimension(880, 480); title = "awk4j - Browser (Scala)"
 #%    contents = new ScrollPane {
 #%      contents = new Label(""+ result)
 #%    }
 #%  }
 #%  top.pack()
 #%  top.visible = true
}
# Schedule the given code to be executed on the Swing event dispatching thread (EDT).
#% override def run__ = onEDT__

Note: Scala Swing アプリケーケーションを作成するための条件は以下のとおり。

  1. scala.swing.MainFrame を使用して GUI を記述する。
    (MainFrame: javax.swing.JFrame に JFrame.EXIT_ON_CLOSE を実装したトップレベルのフレーム)
  2. run__ をオーバライドするか、 トランスレータ起動オプションに -swing1 を指定して AWT イベントディスパッチスレッドで非同期に実行するよう指定する。
    (onEDT__: javax.swing.SwingUtilities.invokeLater を使用た scala.swing.GUIApplication と同等な環境を構築する)

サンプル 2 (イメージビユーア)

一定時間毎にローカルフォルダの画像を表示するイメージビューア

Note: 巷で評判になっている “美○時計” の Gadgetイメージ名称とサイズを想定している。 このサイトは正規のアプリ以外からのアクセスをブロックするため ツールなどには頼らず素直にローカルデータ使用する。 (データ形式は ie. が単純 (^^)..

« サンプル: ImageViewer5.awk »
#% import scala.swing.{MainFrame, BorderPanel, Label}
#% import scala.swing.event.{MouseClicked, MouseDragged}

BEGIN {
    baseurl = (0 < ARGC) ? ARGV[1] : "/var/img/"  # Image directory.
 #% val FRAME_WIDTH = 240; val FRAME_HEIGHT = 320; var DELAY_SECONDS = 60
 #% val top = new MainFrame {
 #%   val pe = peer; val w = pe.getToolkit.getScreenSize()
 #%   location = new java.awt.Point(w.width-7 -FRAME_WIDTH, w.height-55 -FRAME_HEIGHT) // 右下に表示
 #%   val imageLabel = new Label
 #%   contents = new BorderPanel { _contents += imageLabel
 #%     listenTo(mouse.clicks, mouse.moves)
 #%     reactions += {
 #%       case MouseClicked(_, _, 256, _, _) =>   // 256:right button
 #%         pe.setAlwaysOnTop(!pe.isAlwaysOnTop)  // Window 前面表示の切り替え
 #%       case MouseDragged(_, p, _) =>
 #%         val opacity = (100 - Math.abs(p.y) % 100) / 100.f
 #%         com.sun.awt.AWTUtilities.setWindowOpacity(pe, opacity); // Window の半透明化
 #%     }
 #%   }
 #%   def imageUpdate() = { nextImage()
 #%     imageLabel.icon = (new javax.swing.ImageIcon(""+ imageFile)).asInstanceOf[javax.swing.Icon]
 #%     title = ""+ imageTitle
 #%   }
 #% }
 #% top.imageUpdate()
 #% top.pack()
 #% top.visible = true

 #% new javax.swing.Timer(DELAY_SECONDS * 1000, new java.awt.event.ActionListener {
 #%   def actionPerformed(evt: java.awt.event.ActionEvent): Unit = top.imageUpdate()
 #% }).start
}
function nextImage( hhmm) {
    hhmm = strftime("HH:mm"); imageTitle = hhmm " awk4j - ImageViewer (Scala)"
    sub(/:/, "", hhmm); imageFile = baseurl hhmm ".jpg"
}
# Schedule the given code to be executed on the Swing event dispatching thread (EDT).
#% override def run__ = onEDT__

Note: Scala ではイベント処理 (reactions 部分) にパターンマッチングを使用することにより記述を簡素化できる。

その他

ディレクトリ構成

# awk4j を展開(インストール)したディレクトリ
  +-- lib    # 実行時ライブラリ
    +-- include
      +-- scala (runtime source library)
    awk4j.jar

Scala の実行性能

awk4j 環境での HOST 言語の実行性能ランキングは以下のとおり。

  Java < Rhino < JavaScript < Scala < Groovy < BeanShell ..

Note: Java HOST 環境は別格として、 従来からのスクリプト言語と比較しても Scala はよくチューニングされているようである。

Scala 関連リンク


Scala Support
  1. Scala サポートとは
  2. さあ始めよう
    1. Scala の導入
    2. サンプルの実行
    3. サンプル 1 (簡易ブラウザ)
    4. サンプル 2 (イメージビユーア)
  3. その他
  4. Scala 関連リンク