Python Support

awk4j (AWK for Java Platform)

Python サポートとは

Python は Guido van Rossum により作成された、簡単に学べる強力なプログラミング言語で、 インストーラや環境設定ツールとして大抵の Linux に標準インストールされている。 ホスト言語として Python をサポートした awk4j により、マルチリンガル環境での新しいスクリプティングの世界を体験ください。

さあ始めよう

Jython の導入

JYTHON_HOME = /etc/jython2.5rc2

サンプルの実行

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

$ cd sample
$ make -f makepy sample

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

サンプル 2 (マンデルブロ集合)

Python Support
Python サポート

複数言語連携 (AWK, Java, Python) でマンデルブロ集合を表示。
Python のインスタンス生成時の初期設定機能と、 JavaBeans (get?, set?) 機能を利用、 コマンドラインでも Applet でも動作する (動作仕様は、 サンプル Java (SimpleMandel1.awk), JavaFX (SimpleMandel2.awk) と同じ)

« サンプル: SimpleMandel4.awk »
BEGIN {
#% from javax.swing import JFrame
#% frame = JFrame(
#%   defaultCloseOperation = JFrame.EXIT_ON_CLOSE,
#%   title = "awk4j - Mandelbrot (Python)", resizable = False,
#%   contentPane = getContent()
#% )
#% frame.pack(); frame.visible = True

}
function palette() {
   #% engine.setPalette(HUE, SAT, GRA, ITE)
}
function calculate() {
   #% engine.calculate(X, Y, W, ITE)
   #% container.repaint()

}
function zoom(x, y, isShiftDown, button) {
   if (isShiftDown) {                            # シフト+クリック:中心座標移動
     X = (X + (x - CIMG_WIDTH / 2) * W / CIMG_WIDTH)
     Y = (Y - (y - CIMG_HEIGHT / 2) * W / CIMG_WIDTH)
   } else {
     if (0 != button) mouseButton = button
     W = (1 == mouseButton) ? W / 1.5 : W * 1.5  # ドラッグ:拡大, 右ボタンドラッグ:縮小
   }
   calculate()
}
function getContent() {
   CONVFMT = "%.18g"; CIMG_WIDTH = 320; CIMG_HEIGHT = CIMG_WIDTH / 4 * 3
   X = -1.94155844996; Y = 0.00011276997004344; W = 0.0000001
   HUE = 0; SAT = .4; GRA = .01; ITE = "1024"
#% import java.awt.event.MouseAdapter
#% class MyMouseAdapter(java.awt.event.MouseAdapter):
#%   def mouseDragged(self, e): zoom(e.x, e.y, e.shiftDown, e.button)
#%   def mousePressed(self, e): self.mouseDragged(e)
#% adapter = MyMouseAdapter()
#% import mandel.MandelEngine
#% global engine; engine = mandel.MandelEngine(CIMG_WIDTH, CIMG_HEIGHT)
#% from javax.swing import ImageIcon, JLabel, JPanel
#% imagex = JLabel(icon = ImageIcon(engine),
#%   mouseListener = adapter,
#%   mouseMotionListener = adapter
#% )
#% global container; container = JPanel()
#% container.add(imagex)

   palette(); calculate()
   return container
}
#% import javax.swing.JApplet
#% class SimpleMandel4(javax.swing.JApplet):
#%   def __init__(self): self.add(getContent());

Note: AWK と Pythonで変数を共有す るため、 Python のグローバル宣言 (global) を使用してしている。

Note: このスクリプトは JApplet を継承しており、 Applet として動作可能 (詳細は、 sample/applet.html, sample/makepy221 を参照)。

その他

ソースコード・エンコーディング
日本語を使用する場合は、AWKスクリプトの 1行目または 2行目 (1行目を #! ... とするとき) を 特殊コメントとする。
# -*- coding: エンコーディング名 -*-
(Jython 2.5rc2で有効、 2.2.1は不可、 sample/PrimeNumber.awk 参照)

  • Jython 2.5b3: トランスレータにオプション -strpfx u を指定し、 ユーザ定義文字を u'...' とする
  • sample/src/Encode8.java を使用してコード変換をおこなう (sample/makepy トランスレータの設定参照)

$ cd sample
$ make -f makepy prime
ホストスクリプトの埋め込み指定
Pythonは文のグルーピング(ブロック)にインデントを使用するため、 ホストスクリプトの埋め込み指定のインデントには注意が必要。
#% Pythonスクリプト
  • 識別文字を正規表現 /^[ \t]*#%[ \t]?/ で削除する (%の後の空白を 1個削除)
  • トランスレータは、埋め込み指定のコード内容について理解しない

#INPUT         #OUTPUT
#%_inport os    import os
#%inport sys    import sys
while (1) {     while 1:
#%_stm          ..stm
#%___stm        ..__stm  
# AWK文の { } はインデントされるため 2重インデントエラー
}               pass
#%_while (1) {  while 1:
#%___stm        __stm    
# トランスレータはグループ認識しないためインデントが必要
#%_pass         pass

AWK言語仕様
ループ文 while()、 for(in)、 for(;;;)、 do while()、式の中での代入 'while(0<= c=get())...' を含め、AWK言語仕様の全てをサポートしている。

Python(Jython) 関連リンク


Python Support
  1. Python サポートとは
  2. さあ始めよう
    1. Jython の導入
    2. サンプルの実行
    3. サンプル 2 (マンデルブロ集合)
  3. その他
  4. Python(Jython) 関連リンク