a[0,0]=1, a[0,1]=2, a[1,0]=3, a[1,1]=4
p(a)
b[0,0]=3, b[0,1]=0, b[1,0]=0, b[1,1]=6
p(b)
と書きましたけど、配列リテラルを使って、
a = { {1,2} , {3,4} }
p(a)
b = { {3,0} , {0,6} }
p(b)
と書くほうがスマートでした。
a[0,0]=1, a[0,1]=2, a[1,0]=3, a[1,1]=4
p(a)
b[0,0]=3, b[0,1]=0, b[1,0]=0, b[1,1]=6
p(b)
と書きましたけど、配列リテラルを使って、
a = { {1,2} , {3,4} }
p(a)
b = { {3,0} , {0,6} }
p(b)
と書くほうがスマートでした。
1.5 外部ライブラリ(NumPy)
ツインテールdeエンジェルモード!! では、インタプリタ本体である /usr/local/bin/tt のみで完結しますので、これ以外の外部ライブラリ等はありません。
よって、標準で装備されていない機能は、内容に応じて
かして対応します。
1、配列の生成
tt> x={ 1.0 , 2.0 , 3.0 }
x[0]=1.000000,x[1]=2.000000,x[2]=3.000000
tt> y={ 2.0 , 4.0 , 6.0 }
y[0]=2.000000,y[1]=4.000000,y[2]=6.000000
tt> k=keys(x)
k[0]=0,k[1]=1,k[2]=2
tt> v=vals(x)
v[0]=1.000000,v[1]=2.000000,v[2]=3.000000
配列 k は、配列 x の(値でなくて)添字をもつ配列です。
配列 v は、配列 x の値をもつ配列です。ただし、今回は使いません。
2、配列の算術計算(四則演算?)
tt> each(i=k){ z[i]=x[i]+y[i] }
z[0]=3.000000
z[1]=6.000000
z[2]=9.000000
tt> each(i=k){ z[i]=x[i]-y[i] }
z[0]=-1.000000
z[1]=-2.000000
z[2]=-3.000000
tt> each(i=k){ z[i]=x[i]*y[i] }
z[0]=2.000000
z[1]=8.000000
z[2]=18.000000
tt> each(i=k){ z[i]=x[i]/y[i] }
z[0]=0.500000
z[1]=0.500000
z[2]=0.500000
tt> each(i=k){ z[i]=x[i]/2.0 }
z[0]=0.500000
z[1]=1.000000
z[2]=1.500000
3、N次元配列
スクリプト
a[0,0]=1, a[0,1]=2, a[1,0]=3, a[1,1]=4
p(a)
b[0,0]=3, b[0,1]=0, b[1,0]=0, b[1,1]=6
p(b)
for( i=0 ; i<2 ; i++ ){
for( j=0 ; j<2 ; j++ ){
z[i,j] = a[i,j] + b[i,j]
}
}
p(z)
実行結果
a[1,1]=4,a[1,0]=3,a[0,1]=2,a[0,0]=1
b[1,1]=6,b[1,0]=0,b[0,1]=0,b[0,0]=3
z[1,1]=10,z[1,0]=3,z[0,1]=2,z[0,0]=4
スクリプト
a[0,0]=1, a[0,1]=2, a[1,0]=3, a[1,1]=4
p(a)
b[0,0]=3, b[0,1]=0, b[1,0]=0, b[1,1]=6
p(b)
for( i=0 ; i<2 ; i++ ){
for( j=0 ; j<2 ; j++ ){
z[i,j] = a[i,j] * b[i,j]
}
}
p(z)
実行結果
a[1,1]=4,a[1,0]=3,a[0,1]=2,a[0,0]=1
b[1,1]=6,b[1,0]=0,b[0,1]=0,b[0,0]=3
z[1,1]=24,z[1,0]=0,z[0,1]=0,z[0,0]=3
スクリプト
a[0,0]=1, a[0,1]=2, a[1,0]=3, a[1,1]=4
p(a)
for( i=0 ; i<2 ; i++ ){
for( j=0 ; j<2 ; j++ ){
z[i,j] = a[i,j] * 10
}
}
p(z)
実行結果
a[1,1]=4,a[1,0]=3,a[0,1]=2,a[0,0]=1
z[1,1]=40,z[1,0]=30,z[0,1]=20,z[0,0]=10
とりあえず、ここまで
次はグラフ
次は、リストとディクショナリの使い方です。
ツインテールdeエンジェルモード!! では、どちらも配列として分類されています。
まずは、Pythonで「リスト」と呼ばれるものです。
ツインテールdeエンジェルモード!! では、配列の即値は { と } で囲んでコンマ区切りで指定します。
tt> a = { 1, 2, 3, 4, 5 }
a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5
tt> p(a)
a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5
tt> p(size(a))
5
tt> a[0]
1
tt> a[4]
5
tt> a[4] = 99
a[4]=99
tt> p(a)
a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=99
次は、Pythonで「ディクショナリ」と呼ばれるものです。
一般的には、ハッシュと呼ばれているようです。
ツインテールdeエンジェルモード!! では、これも配列として指定します。
即値は { と } で囲んで、 キーワード => 値 の様に指定します。
tt> me = { "height" => 180 }
me["height"]=180
tt> me["weight"] = 70
me["weight"]=70
tt> me
me["weight"]=70,me["height"]=180
最後の例の様に、ツインテールdeエンジェルモード!! の対話モード内では、
変数名を打つとその値が表示されます。(関数 p() と同じ効果となります。)
ブーリアンですが、 TRUE/FALS の指定はあるのですが、実体は整数です。
なお、 FALS は FALSE に変更することも出来ます。
tt> hungry = TRUE
hungry=1
tt> sleepy = FALS
sleepy=0
tt> d(hungry)
[Id=L024] Name="hungry",(Ukey=(null)),Type='I',Attr=0x000000,Str=(null),Ival=1,Dval=0.000000,Ptr=(nil)/(nil)
IF文は、特に特徴はありません。
tt> hungry = TRUE
hungry=1
tt> if( hungry )
tt{ print("YES\n")
tt} ;
YES
最後の空文 ; は、対話モードで if() 文の終わりを明示するために打ちましたが、
普通は特には必要ありません。
( elif() 文や else() 文が続かないと判断された瞬間に if() 文が実行されます。)
Python と違って、インデントでブロックの区切りを判別しませんので、
複文を else で実行するには、それらを { と } で囲む必要があります。
tt> hungry = FALS
hungry=0
tt> if( hungry )
tt{ print("YES\n")
tt} else{
tt{ print("NO\n")
tt{ print("I'm sleepy\n")
tt{ }
NO
I'm sleepy
FOR文も普通です。
tt> for( i=1 ; i<=3 ; i++ )
tt{ p(i)
i=1
1
i=2
2
i=3
3
i=4
関数の指定も普通です。まずは、引数のない関数です。
tt> def hello()
tt+ print("Hello, World!!\n")
tt> hello()
Hello, World!!
次に、引数のある関数です。
tt> def hello(arg)
tt+ print("Hello, %s!!\n",arg)
tt> hello("cat")
Hello, cat!!
tt>
1.4 ツインテールdeエンジェルモード!! スクリプトファイル
これも、普通のスクリプト言語と同じ感覚で使えます。
まずは、ファイルの中身を確認してから、インタプリタ tt で実行してみます。
% cat hungry.tt
print("I'm hungry!!\n")
% tt hungry.tt
I'm hungry!!
言うまでもないことですが、シェバング行を先頭に追加して、
スクリプトファイルに実行属性を付与すると、
そのファイル名を指定するだけで、スクリプトファイルが実行できます。
% cat hungry.tt
#!/usr/local/bin/tt
print("I'm hungry!!\n")
% chmod 0755 hungry.tt
% hungry.tt
I'm hungry!!
とりあえず、ここまで。
O'Reilly の ゼロから作る Deep Learning 本は Python で書いてあるので、
これを ツインテールdeエンジェルモード!! でトライしてみます。
書籍は既に自分でもっていることを想定しています。
なので、説明は ツインテールdeエンジェルモード!! に関することがメインとなります。
第1章
1.2 ツインテールdeエンジェルモード!! のインストール
まずは、ここから(↓)ソース一式をダウンロードします。
https://osdn.net/projects/angelmode/releases/
次に、ダウンロードした tar ファイルを展開して、コンパイル&インストールします。
% tar zxvf twintail_de_angelmode.costume147.tgz
% cd twintail_de_angelmode.costume
% make
% cp tt /usr/local/bin
念の為、サンプルプログラムを実行して動作することを確認します。
% tt DOCUS/HelloMaster
こんにちは、ご主人様!!
こんにちは、ご主人様!!
こんにちは、ご主人様!!
こんにちは、ご主人様!!
こんにちは、ご主人様!!
こんにちは、ご主人様!!
こんにちは、ご主人様!!
こんにちは、ご主人様!!
1.3 ツインテールdeエンジェルモード!! インタプリタ
インストールしたインタプリタのバージョンを確認してみます。
%tt -v
Twintail_de_Angelmode!! Ver.147 ( 64[BIT] )
Copyright (C) 2011,2012,2013,2014,2015,2016,2017 "NekoMimi"<TwinTail@AngelMode.Net>
インタプリターの立ち上げ。終了時は^C又は^D。
%tt
tt>
算術計算をしてみます。整数同士の演算は整数となるので注意が必要です。
コマンド p() は、とりあえず値を表示してくれる関数です。
どの様な型のデータであっても、とりあえず値を表示してくれるので便のです。
%tt
tt> p(1+2)
3
tt> p(1-2)
-1
tt> p(4*5)
20
tt> p(7/5)
1
tt> p(7./5)
1.400000
tt> p(3**2)
9
データ型を確認してみます。
いろいろなやり方がありますが、データ値の詳細表示の関数 d() で
簡単にType(型)がわかります。Type以外の項目は、今は無視します。
tt> d(10)
[Id=L018] Name="",(Ukey=(null)),Type='I',Attr=0x000000,Str=(null),Ival=10,Dval=0.000000,Ptr=(nil)/(nil)
tt> d(2.718)
[Id=L019] Name="",(Ukey=(null)),Type='D',Attr=0x000000,Str=(null),Ival=0,Dval=2.718000,Ptr=(nil)/(nil)
tt> d("hello")
[Id=L020] Name="",(Ukey=(null)),Type='S',Attr=0x000000,Str="hello",Ival=0,Dval=0.000000,Ptr=(nil)/(nil)
変数の使い方です。特に変わったことはありません。
tt> x=10
x=10
tt> p(x)
10
tt> x=100
x=100
tt> p(x)
100
tt> y=3.14
y=3.140000
tt> p(x*y)
314.000000
tt> d(x*y)
[Id=----] Name="",(Ukey=(null)),Type='D',Attr=0x000000,Str=(null),Ival=0,Dval=314.000000,Ptr=(nil)/(nil)
とりあえず、まずはここまで。