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)

 

とりあえず、まずはここまで。