AIR-Lang@Wiki
http://w.atwiki.jp/air-lang/
AIR-Lang@Wiki
ja
2010-03-08T21:24:57+09:00
1268051097
-
スクリプト言語AIRマニュアル ( Script Language AIR Manual )
https://w.atwiki.jp/air-lang/pages/13.html
+ [[プロジェクトの紹介 ( Project HomePage )>http://www.air-lang.org/]]
+ サンプルプログラム ( Sample Programs )
++ [[最初のプログラム - Hello World!]]
++ [[変数値の簡易表示]]
++ [[基本データと配列&変数]]
++ [[コマンドライン引数]]
++ [[条件分岐と繰り返し]]
++ [[ファイル入出力 - テキスト]]
++ [[ファイル入出力 - バイナリ]]
++ [[ユーザー関数の定義]]
++ [[日付と時刻]]
++ [[シグナル(割り込み)]]
+ [[言語ハッキング方法 ( Hack AIR-Engine! )]]
+ [[ソースコード一式ダウンロード ( Download from SourceFourge.Jp )>http://sourceforge.jp/projects/air-lang/]]
&br()
** インストール方法 ( How to Install )
# tar zxvf air-1.8x.tgz ; cd air-1.8
# make
# cp air /usr/local/bin
** アンインストール方法 ( How to UnInstall )
# rm -r air-1.8
# rm /usr/local/bin/air
&br()
** プログラムの実行方法 ( How to Execute )
AIRプログラムの実行に必要なものは、AIRインタプリタ本体 /usr/local/bin/air のみです。コマンド PATH が通っていることを確認してから、以下のいずれかの方法でAIRプログラムを実行して下さい。
** (1)通常モードで実行する方法:
> 通常は、(先頭のシェバング行でAIRインタプリタを指定して、実行可能属性を持った)テキストファイルにAIRプログラム本文を保存し、そのファイル名を直接指定して実行します。(次のサンプルは、この方法で実行しています。)
% cat vvv # ファイルの内容を確認します。
#!/usr/local/bin/air
print("Hello World!\n")
% chmod 0755 vvv # 実行可能属性を持たせます。
% vvv # ファイル名を直接指定して実行します。
Hello World!
%
** (2)対話モードで実行する方法:
> オプション -i を付けてAIRインタプリタを起動すると対話モードとなります。キーボードより入力されたAIRプログラムは、1文づつ逐次実行されます。又、このモードでは GNU Read Line 行編集機能が有効となります。( "AIR>" は対話モード時のプロンプトです。)
% air -i
AIR> print("Hello World!\n")
Hello World!
AIR> ^D
%
** (3)ワンライナーモードで実行する方法:
> オプション -e を付けてAIRインタプリタを起動すると、次の引数をAIRプログラム本文と見なして実行します。プログラム本文に含まれる各種記号をシェルに解釈されないために、プログラム全体を ' ' (一重引用符)で囲むことをお薦めします。
% air -e 'print("Hello World!\n")'
Hello World!
%
&br()
&br()
&br()
2010-03-08T21:24:57+09:00
1268051097
-
条件分岐と繰り返し
https://w.atwiki.jp/air-lang/pages/56.html
** 条件分岐
- if文の例です。この例では、中括弧 { } は省略可能です。また、elif は else if としても同じです。
# 電源ラインの周波数を調べます。
if( addr=="東京" )
freq="50[Hz]"
elif( addr=="大阪" )
freq="60[Hz]"
else
freq="??[Hz]"
- switch文の例です。swch と deft は省略形のキーワードです。(switchとdefault)
条件は複数指定できます。また、アスタリスク * は全てにマッチします。
# 上場企業を分類します。
swch( market,grade ){
case "東証","1部": print("東証一部上場企業です。"); break;
case "東証","2部": print("東証二部上場企業です。"); break;
case "東証", * :
case "大証", * :
case "名証", * :
case "福証", * :
case "札証", * : print(" 上場企業です。"); break;
deft: print("非上場企業です。"); break;
}
- 3項演算子の例です。
# 改行コード又は区切り記号を出力します。
puts( last?"\n":"," )
** 繰り返し
- loop文の例です。最初に数(整数)を評価して、その数(整数)だけループ本体を実行します。
無指定時には、無限ループとなります。
# アスタリスクを80個出力します。
loop(80)
putc('*')
- while文の例です。ループ毎に条件式を前評価して、TRUE等である限り繰り返しループを実行します。
# 標準入力を行毎に行末まで読み込みます。
while( line=gets() ){
;
}
- while文のバリエーションとして、ループ毎に条件式を後評価するdo_while文、及び、
これらとは真偽が逆のuntil文とdo_until文があります。(サンプル省略)
- for文の例です。(0〜9までの整数を加算します。)
sum=0
for( i=0 ; i<10 ; i++ )
sum+=i
- each文の例です。配列要素(と配列添字)を順次設定してループを実行します。
# コマンドライン引数を全て表示します。
each( val=ARGV )
print("%s\n",val)
# 環境変数を全て表示します。(表示イメージ → "PATH=/bin:/usr/bin")
each( val,key=ENV )
print("%s=%s\n",key,val)
&br()
&br()
&br()
2010-02-26T01:20:47+09:00
1267114847
-
ファイル入出力 - バイナリ
https://w.atwiki.jp/air-lang/pages/35.html
** バイナリファイル入出力 ( Binary File Input&Output )
+ バイナリデータのファイル入出力は、関数 read()/write() を使用すると便利です。
+ 関数 buf,cnt=read(fname,byte) は、指定されたファイル fname より byte バイト分だけデータを読み込み、左辺の第1変数 buf に設定します。また、左辺の第2変数 cnt には、読み込んだバイト数がセットされます。
+ 変数 buf の内容へのアクセスは、(バイナリデータである可能性があるため)関数 peek()/poke() を使用します。(通常の文字列関数は、'\0'文字を文字列末と認識します。)
** 簡易 dump プログラ ( Simple dump program )
> コマンドライン引数で指定されたファイル名(省略時は標準入力)の内容を、標準出力へダンプ表示します。
fname=shift(stdin) # 引数をセットします。(デフォルトは stdin )
do_while(cnt!=0){ # {} 内を実行して、cntが 0 でない限りループを繰り返します。
buf,cnt=read(fname,16) # ファイル fname から16バイト読み込み、データとバイト数をセットします。
for(i=0;i<cnt;i++) # 1バイトづつ16進数表示を行います。
printf("%02X ",peek(buf,i)) # 関数 peek() は、バイナリデータ buf 内の i 番目のデータを取り出します。
print("\n")
}
2010-02-25T00:58:25+09:00
1267027105
-
ファイル入出力 - テキスト
https://w.atwiki.jp/air-lang/pages/34.html
** 簡易 cat プログラム ( Simple cat program )
> 指定されたファイルの内容を標準出力に1行ずつ表示します。
fname=shift(STDIN) # コマンドライン引数よりファイル名、又は、STDIN をセットします。
while( str=gets(fname) ){ # ファイルから1行ずつデータを読み込み、変数 str にセットします。
puts(str) # 変数 str の内容を標準出力へ出力します。
}
** 簡易 cp プログラム ( Simple cp program )
> 指定されたファイルの内容を別のファイルに1行ずつコピーします。
if( ARGS!=2 ) exit(1) # コマンドライン引数でファイル名が2個指定されていることを確認します。
fi=shift() # 送り元ファイル名をセットします。
fo=shift() # 送り先ファイル名をセットします。
while( str=gets(fi) ){ # ファイル fi から1行ずつデータを読み込み、変数 str にセットします。
fputs(fo,str) # 変数 str の内容をファイル fo へ出力します。
}
** 簡易2分岐プログラム ( Simple 2 way branch program )
> 標準入力から読み込んだ内容を、標準出力と標準エラー出力に出力します。
while( str=gets() ){ # 標準入力から1行ずつデータを読み込み、変数 str にセットします。
fputs(STDOUT,str) # 変数 str の内容を標準出力へ出力します。
fputs(STDERR,str) # 変数 str の内容を標準エラー出力へ出力します。
}
** 簡易 ls プログラム ( Simple ls program )
> カレントディレクトリのファイル一覧を取得出力します。
each( f=glob("*") ){ # ワイルドカード文字 * を展開後配列化し、1要素ずつ変数 f へ代入します。
print("%s\n",f) # 各個別要素(ファイル名)を表示します。
}
&br()
&br()
&br()
2010-02-25T00:58:04+09:00
1267027084
-
日付と時刻
https://w.atwiki.jp/air-lang/pages/37.html
** 現在時刻(UNIX時刻)を取得し、UTCとローカルタイムで表示します。
> 世界時とローカル時の時差は、実行環境 OS より正しく取得します。
t=time() # 現在のUNIX時刻を取得します。
utc=abs2utc(t) # UNIX時刻→UTC配列化
jst=abs2ltz(t) # UNIX時刻→LTZ配列化 ( Local Time Zone )
print("UTC = %02d:%02d:%02d\n",utc["hour"],utc["min"],utc["sec"])
print("JST = %02d:%02d:%02d\n",jst["hour"],jst["min"],jst["sec"])
&br()
** 2038年問題の発生日時を表示します。
> 2038年問題とは、UNIX時刻を32ビット整数値で表現した場合に、2038年中にオーバーフローしてしまう問題をいいます。(日付や時刻の処理が誤動作する。)
t=INT_MAX # UNIX時刻として整数の最大値をセットします。
utc=abs2utc(t) # UNIX時刻→UTC配列化
print("%s %s [UTC]\n",sdate(utc),stime(utc))
2010-02-25T00:57:08+09:00
1267027028
-
シグナル(割り込み)
https://w.atwiki.jp/air-lang/pages/31.html
** シグナル処理プログラムの記述方法(全体の流れ)
+ 処理対象とするシグナル番号を選びます。
+ シグナル受信時の処理内容を、ユーザ定義関数として記述します。
-- ユーザ定義関数内では、第1引数がシグナル番号となります。
-- ユーザ定義関数内での、使用できる関数に制約はありません。
+ 定義したユーザ関数をシグナルハンドラとして設定します。
&br()
** シグナルモニタの例
> 受信したシグナル番号を表示する例です。このため、処理対象とするシグナル番号は、ユーザー側にてキャッチ可能な全てシグナル番号とします。なお、このプログラムは CTRL+C でも終了しなくなるため、CTRL+C 受信時には KILL -9 による終了方法を表示することとしました。
> なお、ここではシグナル待ち受け時間中は pause() 関数で待つこととしましたが、他の処理を実行させていても問題はありません。
# シグナルハンドラとなるユーザ定義関数を2つ定義します。
# その1:CTRL+C 受信時のシグナルハンドラです。
def disp_signumber2(ival){
print("Signal Received!! [%d]\n",ival)
print("終了の仕方:当プロセス(%d)に、シグナル9番を送信して下さい。\n",PID);
print("( kill -9 %d )\n",PID);
}
# その2:他のシグナル受信時のシグナルハンドラです。
def disp_signumber (ival){
print("Signal Received!! [%d]\n",ival)
}
# シグナルハンドラを設定します。
for(i=1;i<NSIG;i++){ # i = シグナル番号です。(全てのシグナル番号を処理対象とします。)
if(i==2) # CTRL+C 受信時のシグナルハンドラを設定します。
rx_signal(i,&disp_signumber2())
else # 他のシグナル受信時のシグナルハンドラを設定します。
rx_signal(i,&disp_signumber ())
}
# シグナル待ち受けループに入ります。
while(TRUE){ # 繰り返しモニタ出来るように、無限ループとします。
pause() # シグナル待ち受け時はポーズで待ちます。
}
&br()
&br()
&br()
2010-02-25T00:56:52+09:00
1267027012
-
コマンドライン引数
https://w.atwiki.jp/air-lang/pages/29.html
** 整数 ARGC と 整数 ARGS
> ''ARGC'' には、コマンド名自身を含むコマンドライン引数の数(整数値)がセットされます。''ARGS'' には、[[shift()]]可能なコマンドライン引数の数(整数値)がセットされます。(初期値は ''ARGC-1'' ですが、 [[shift()]]ファミリ関数実行時に値が調整されます。)
- ARGC と ARGS を表示します。
print("ARGC=%d,ARGS=%d\n",ARGC,ARGS)
str=shift() # コマンドライン引数を取得します。
print("ARGC=%d,ARGS=%d\n",ARGC,ARGS)
** 配列 ARGV[]
> ''ARGV[]'' には、コマンド名自身を含むコマンドライン引数(文字列)がセットされます。
- ARGV[] の全要素を表示します。
for(i=0;i<ARGC;i++){ # 0 から ARGC-1 までループします。
print("値=%s\n",ARGV[i]) # ARGV[i] は文字列です。
}
** 関数 shift()
> 関数 ''shift()'' は、呼び出される度に次のコマンドライン引数(文字列)を順番に戻します。戻すべきコマンドライン引数が無い場合は、引数で指定されたデフォルト値、又は、''NULL'' が戻されます。
- コマンドライン引数より2つのパラメータを取得します。
if( ARGC!=3 ){ # 引数の数を確認します。
eprint("Usage: ${CMD} p1 p2\n") # 使用方法を表示します。${CMD}はコマンド名に置換されます。
exit(0)
}
p1=shift() # 第1コマンドライン引数を変数 p1 へセットします。(文字列)
p2=shift() # 第2コマンドライン引数を変数 p2 へセットします。(文字列)
- コマンドライン引数より1つのパラメータ(ファイル名)を取得します。ただし、何も指定されなかった場合は、標準入力 STDIN をセットするものとします。
if( ARGC!=1 && ARGC!=2 ){ # 引数の数を確認します。
eprint("Usage: ${CMD} [file]\n") # 使用方法を表示します。${CMD}はコマンド名に置換されます。
exit(0)
}
file=shift(STDIN) # コマンドライン引数(又は、STDIN)を変数 file へセットします。
&br()
&br()
&br()
2010-02-25T00:56:18+09:00
1267026978
-
基本データと配列&変数
https://w.atwiki.jp/air-lang/pages/38.html
&br()
* 基本データの種類
- 論理値・文字列・整数値・実数値・ポインタの5種類があります。
- 全ての基本データは、''値''情報と''型''情報を同時に保有しています。
&br()
** 論理値 ( Logical )
> ''TRUE'' と ''FALSE'' があります。
log1 = TRUE # 真です。
log2 = FALSE # 偽です。
log3 = (3<M_PI && M_PI<4) # 円周率 M_PI=3.14... ですので、log3 の値は TRUE となります。
** 文字列 ( String )
> 文字列は本体部分を2重引用符 又は 2重大括弧で囲んで指定します。後者の場合は、複数行に渡る文字列を(各行行末をエスケープすることなく)そのまま記述できます。どちらの場合も、エスケープ文字はC言語のものと互換性があります。
str1 = "AIR-Lang\n"
str2 = [[
AIR-Lang
]]
re = "/[ABC]+/" # 正規表現は、"/POSIX規格/" で指定します。
** 整数値と実数値 ( Integer and Double )
> 整数値の内部表現はC言語の int を利用しています。実数値の内部表現はC言語の double を利用しています。(必要な場合は、自動型変換が行われます。)
a = +100 , b = -333 , c = INT_MAX # 整数の指定例です。
i = 0b11 , j = 0o77 , k = 0xFF # 2進数、8進数、16進数の指定例です。
c = '\n' # C言語と同じエスケープ文字が使えます。
x = -1.0E+99 , y = +1E-7 , z = 0.0 # 実数の指定例です。
ans = int("3") + int(2) + int(NULL) # 関数 int() で値の整数化ができます。( ans=5 )
ans = dbl("3") + dbl(2) + dbl(NULL) # 関数 dbl() で値の実数化ができます。( ans=5.0 )
** ポインタ ( Pointer )
> 関数のエラー戻り値や、[[ファイルポインタ]]などで使われます。
x = NULL # ''NULL'' ポインタです。
p1 = STDIN # 標準入力です。( stdin は別名です。)
p2 = STDOUT # 標準出力です。( stdout は別名です。)
p3 = STDERR # 標準エラー出力です。( stderr は別名です。)
&br()
* 配列について
- 1つ以上の基本データ又は配列を、添字を用いてまとめて保持したものです。
- 配列と連想配列(ハッシュ)は、統一的に扱えます。互いに混在が可能です。異次元であっても同様です。
&br()
Example: 配列 a と配列 b は、同じ値の要素を持ちます。
a[0]=00, a[1]=11, a[2]=22, a[5]=55 # 配列は添字と値を指定して初期化します。
b={00,11,22,,,55} # 初期値を一括指定することも可能です。
p(a,b) # 2つの配列の内容を出力します。
Example: 配列 c と配列 d は、同じ値の要素を持ちます。
c["US"]=0, c["EU"]=1, c["JP"]=2 # 配列と連想配列は統一的に扱えます。
d={"US"->0,"EU"->1,"JP"->2} # (連想配列的な)初期値を一括指定することも可能です。
p(c,d) # 2つの配列の内容を出力します。
Example: 配列 e は異次元要素が混在しています。
e[0]=00,e[1]=11,e["TEST"]="???" # 配列と連想配列は互いに混在が可能です。
e[1,2,3,"TEST"]="OK" # 次元数が異なっていても混在が可能です。
p(e) # 配列全体の内容を出力します。
&br()
* 変数について
- 変数は、1つの基本データの''型''と''値''を同時に保持します。又は、1つの配列データを保持します。
- 変数の定義は、単に変数を初期化することで行います。(デフォルトはLocal変数となります。)
&br()
Example: 1〜100までの数の和を計算します。
sum=0 # 変数 sum を初期値 0 で初期化(=定義)します。(Local変数)
for(i=1;i<=100;i++) # 変数 i もLocal変数です。
sum+=i
print("Answer=%d\n",sum)
&br()
Example: 明示的な変数定義の例です。スコープを指定します。(Static変数はユーザー定義関数内のみ有効です。)
global gx=0,gy,gz # Global変数 gx,gy,gz を定義します。
static sx=1,sy,sz # Static変数 sx,sy,sz を定義します。
local lx=2,ly,lz # Local 変数 lx,ly,lz を(明示的に)定義します。
&br()
&br()
&br()
2010-02-25T00:55:23+09:00
1267026923
-
最初のプログラム - Hello World!
https://w.atwiki.jp/air-lang/pages/30.html
** その1
print("Hello World!\n") # '#'文字〜行末まではコメントとなります。
** その2
str="Hello "+"World!"+"\n" # 文字列を連結して、変数 str に代入します。
puts(str) # その内容を標準出力へ出力します。
** その3
str=sprint("%s\n","Hello World!") # 文字列を書式指定で生成して、変数 str に代入します。
puts(str) # その内容を標準出力へ出力します。
** 追加
while( str=gets(DATA) ){ # __DATA__ 以降を1行ずつ読み込み、変数 str に代入します。
puts(str) # その内容を標準出力へ出力します。
}
__DATA__
Hello World!
&br()
----
&br()
** ★print() ファミリー関数について
> 関数 print(),eprint(),sprint(),fprint() は、C言語 printf() 書式と互換性のある出力関数です。
|COLOR(white):BGCOLOR(blue): 関数 |COLOR(white):BGCOLOR(green): (別名) |COLOR(white):BGCOLOR(red): 機能説明 |h
| print(format, ... ) | printf(format, ... ) | 与えられた引数を書式変換して、標準出力(stdout)に出力します。 |
| eprint(format, ... ) | eprintf(format, ... ) | 与えられた引数を書式変換して、標準エラー出力(stderr)に出力します。 |
| sprint(format, ... ) | sprintf(format, ... ) | 与えられた引数を書式変換して、文字列(関数の戻り値)として出力します。 |
| fprint(file,format, ... ) | fprintf(file,format, ... ) | 与えられた引数を書式変換して、指定ファイル([[ファイルポインタ]]でも可)に出力します。 |
&br()
** ★puts() ファミリー関数について
> 関数 putc(),puts(),putn() は、文字と文字列の出力関数です。
|COLOR(white):BGCOLOR(blue): 関数 |COLOR(white):BGCOLOR(green): (別名) |COLOR(white):BGCOLOR(red): 機能説明 |h
| putc(char ) |-| 標準出力(stdout)に1文字を出力します。 |
| puts(str ) |-| 標準出力(stdout)に文字列を出力します。 |
| putn(str,n) |-| 標準出力(stdout)に文字列(ただし、最大 n 文字まで)を出力します。 |
| fputc(file,char ) |-| 指定ファイル([[ファイルポインタ]]でも可)に1文字を出力します。 |
| fputs(file,str ) |-| 指定ファイル([[ファイルポインタ]]でも可)に文字列を出力します。 |
| fputn(file,str,n) |-| 指定ファイル([[ファイルポインタ]]でも可)に文字列(ただし、最大 n 文字まで)を出力します。 |
&br()
** ★gets() ファミリー関数について
> 関数 getc(),gets(),getn() は、文字と文字列の入力関数です。
|COLOR(white):BGCOLOR(blue): 関数 |COLOR(white):BGCOLOR(green): (別名) |COLOR(white):BGCOLOR(red): 機能説明 |h
| getc( ) |-| 標準入力(stdin)より1文字を読み込み、それを戻り値とします。 |
| gets( ) |-| 標準入力(stdin)より文字列を読み込み、それを戻り値とします。 |
| getn(n) |-| 標準入力(stdin)より文字列(ただし、最大 n 文字まで)を読み込み、それを戻り値とします。 |
| fgetc(file ) |-| 指定ファイル([[ファイルポインタ]]でも可)より1文字を読み込み、それを戻り値とします。 |
| fgets(file ) |-| 指定ファイル([[ファイルポインタ]]でも可)より文字列を読み込み、それを戻り値とします。 |
| fgetn(file,n) |-| 指定ファイル([[ファイルポインタ]]でも可)より文字列(ただし、最大 n 文字まで)を読み込み、それを戻り値とします。 |
&br()
&br()
&br()
2010-02-25T00:54:34+09:00
1267026874
-
変数値の簡易表示
https://w.atwiki.jp/air-lang/pages/54.html
変数値の簡易表示には、関数 p() が便利です。関数 p() は、引数の種別・個数などに制約はありません。
p(x) # 変数 x の値を表示します。
p(a,b,c) # 3つの変数 a b c の値を一括表示します。
p(ARGV) # 配列 ARGV[] の全要素の値を一括表示します。
p(2.0*M_PI*r) # 式 2πr の値を計算して表示します。
変数名をそのまま直接入力すると、関数 p() が自動実行されます。
これは、対話モード時に便利ですが、実行モードに制約はありません。
% air -i # AIR を対話モードで立ち上げます。
AIR> x # p(x) と同じです。
AIR> a,b,c # p(a,b,c) と同じです。
AIR> ARGV # p(ARGV) と同じです。
&br()
&br()
&br()
2009-12-24T14:21:13+09:00
1261632073