Scala Support
awk4j
(AWK for Java Platform)
Scala
Language
はオブジェクト指向と関数型のプログラミングを兼ね備えており
静的型付けをおこなうプログラミング言語環境です。
awk4j Scala サポートは、 AWK の動的型付けと、 C言語由来のレガシー構文 (for(;;;), switch, break,
continue, ++ -- increment/decrement, a=b=n 連続代入など) に対応し、
オブジェクト指向,
関数型プログラミング, 静的,動的型付
環境のダイナミックな言語連携を実現しました。
- Scala
(ver2.7.6 final, 2.7.7 RC1 または nightly builds ver2.8.0.r18912) をダウンロードして適当なディレクトリ (SCALA_HOME) に解凍する。
- 環境変数 (SCALA_HOME)
を設定するか、 awk4j sample/makescala
の SCALA_HOME を修正する。
サンプル
(素数計算、 RSS閲覧、 月齢計算、 簡易ブラウザ、 マンデルブロ集合) を実行する。
$ cd sample
$ make -f makescala
sample
Note: 詳細は、makeファイルおよびサンプルソースを参照。
“世界最短 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
アプリケーケーションを作成するための条件は以下のとおり。
-
scala.swing.MainFrame
を使用して GUI
を記述する。
(MainFrame: javax.swing.JFrame に
JFrame.EXIT_ON_CLOSE を実装したトップレベルのフレーム)
-
run__ をオーバライドするか、
トランスレータ起動オプションに -swing1
を指定して
AWT イベントディスパッチスレッドで非同期に実行するよう指定する。
(onEDT__:
javax.swing.SwingUtilities.invokeLater を使用た
scala.swing.GUIApplication
と同等な環境を構築する)
一定時間毎にローカルフォルダの画像を表示するイメージビューア
- ドラッグ: 画面の透明度を変更
- 右ボタン: 画面最前列への表示切り替え
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 はよくチューニングされているようである。