## 式の計算 今回は式をSimpleに計算させてみましょう。 Simpleは逆ポーランド記法なので、演算子を数値の後に記述します。 式の数値や演算子の間はスペースを挟みます。 ``` プログラム> 5 4 + 3 - +-- 式を計算します | Stack〔 〕← 5 | Stack〔5 〕← 4 | Stack〔5, 4 〕← + | Stack〔9 〕← 3 | Stack〔9, 3 〕← - 結果 = 6 ``` よく見てみると、式の計算にはスタックを使っています。 逆ポーランド記法にはスタックを使うと便利です。 最初のプログラムでは`print`文で「Hello, world!」を出力しましたが、実はあれも式です。値にはデータ型があります。データ型とは値の種類の事で、Simpleには今使っている数値型および文字列・論理型・リスト型があります。 次は文字列の演算をやってみましょう。 ``` プログラム> hello world + +-- 式を計算します | Stack〔 〕← hello | Stack〔'hello' 〕← world | Stack〔'hello', 'world' 〕← + 結果 = 'helloworld' ``` 文字列を連結できました。`+`は文字列型においては連結する処理になります。 あれ?式では文字列にクオーテーションがありませんね。実はSimpleでは値が文字列型だと分かり切っている場合にはクオーテーションが省略できるのです。 文字列の中から好きな文字を取り出す事も出来ます。 ``` プログラム> hello [1] +-- 式を計算します | Stack〔 〕← hello | Stack〔'hello' 〕← [1] +-- 式を計算します | Stack〔 〕← 1 結果 = 1 'hello'のインデックス1の文字を求めます 結果 = 'e' ``` この様にインデックス指定で値を取り出せるのをシーケンス型といいます。 同じシーケンス型には何でも入るリスト型があります。 ``` プログラム> list(5,"a") +-- 式を計算します | Stack〔 〕← list(5,"a") 標準ライブラリのlist関数を呼び出します +-- 式を計算します | Stack〔 〕← 5 結果 = 5 +-- 式を計算します | Stack〔 〕← "a" 結果 = 'a' 結果 = [5, 'a'] ``` リスト型の値は異なるデータ型と共存できるのです。 文字列と同じようにインデックス指定して値を取り出せます。 以下のプログラムは異なる型同士での演算が出来ない為、エラーが出てしまってます。 ``` プログラム> 56 abc + +-- 式を計算します | Stack〔 〕← 56 | Stack〔56 〕← abc | Stack〔56, 'abc' 〕← + エラー!型が一致しません 結果 = 0 ``` こういう時は以下の表にある標準ライブラリのデータ型変換関数を使います。 |データ型|説明|データ型変換関数|例| |-|-|-|-| |数値型|算術演算が出来る単一のデータ型|number()|3.14| |文字列型|UTF-8文字を格納するシーケンス型|string()|"abc"| |リスト型|全てのデータを格納できるシーケンス型|list()|list(57, true)| |論理型|条件分岐で使う単一のデータ型|bool()|false| ``` プログラム> string(56) abc + +-- 式を計算します | Stack〔 〕← string(56) 標準ライブラリのstring関数を呼び出します 文字列型に変換します +-- 式を計算します | Stack〔 〕← 56 結果 = 56 | Stack〔'56' 〕← abc | Stack〔'56', 'abc' 〕← + 結果 = '56abc' ``` これでうまく変換できました。 論理型はその名の通り論理演算が出来るデータ型で、`true`と`false`の2種類の値があります。 主に`if`文や`while`文などの条件式に使用します。 AND演算 ``` プログラム> true false & +-- 式を計算します | Stack〔 〕← true | Stack〔true 〕← false | Stack〔true, false 〕← & 結果 = false ``` OR演算 ``` プログラム> true false | +-- 式を計算します | Stack〔 〕← true | Stack〔true 〕← false | Stack〔true, false 〕← | 結果 = true ``` NOT演算 ``` プログラム> true ! +-- 式を計算します | Stack〔 〕← true | Stack〔true 〕← ! 結果 = false ``` 論理演算よりも複数の条件式を纏めるのに利用する事が多いです。 Simpleで使える演算子は以下の通りです。 | 演算子 | 種類 | 意味 | 数値 | 文字列 | 論理型 |リスト| | :----:| :---: | :---- | :--:|:--:|:-:|:-:| | + |算術| 足し算|◎|◎|×|×| | - |算術|引き算|◎|×|×|×| | * |算術|掛け算|◎|×|×|×| | / |算術|割り算|◎|×|×|×| | % |算術|割り算の余り|◎|×|×|×| | ^ |算術|べき乗|◎|×|×|×| | = |比較|等しい|◎|◎|◎|×| | > |比較|大きい|◎|◎|×|×| | < |比較|小さい|◎|◎|×|×| | & |論理|AND|×|×|◎|×| | \| |論理|OR|×|×|◎|×| | ! |論理|否定|×|×|◎|×| | ~ |参照|デリファレンス|◎|×|×|×| データ型を確認するには標準ライブラリの`type`関数を使います。 ``` プログラム> type(5) +-- 式を計算します | Stack〔 〕← type(5) 標準ライブラリのtype関数を呼び出します データ型を判定します +-- 式を計算します | Stack〔 〕← 5 結果 = 5 結果 = 'number' ``` この式では関数の引数にも式が使われています。 結果は`number`つまり`5`は数値型だと確認しました。 ## 変数 データを保存して利用したいなら「変数」を利用します。 変数とはメモリ空間に名前を付けてデータを保管する仕組みの事です。 変数を定義するには`var`文を使います。ここでは変数名に`num`を付けています。 ``` プログラム> var text = "Hello, world" 変数textを定義します 値を求めます +-- 式を計算します | Stack〔 〕← "Hello, world" 結果 = 'Hello, world' メモリに変数を確保しました ``` データが保存できました。メモリ空間を見れる`mem`文で確認します。 ``` プログラム> mem +-- メモリ内の変数 | [ 0] text :'Hello, world' 関数がありません ``` 確かにちゃんと保存されていますね。 次に変数を式で利用してみましょう。 変数を利用するには式に変数名を記述するだけです。 ``` プログラム> text ' !!!' + +-- 式を計算します | Stack〔 〕← text 変数textを読み込みます | Stack〔'Hello, world' 〕← " !!!" | Stack〔'Hello, world', ' !!!' 〕← + 結果 = 'Hello, world !!!' ``` 変数の値を利用する事ができました。 なお、要らなくなった変数は`del`で削除できます。 ``` プログラム> del text 変数 textを削除しました ``` シーケンス型ではインデックス指定して特定の値だけを削除する事も出来ます。 ``` プログラム> del text [1] 変数textを読み込みます +-- 式を計算します | Stack〔 〕← 1 結果 = 1 インデックス1の値を削除します プログラム> mem +-- メモリ内の変数 | [ 0] text :'Hllo, world' 関数がありません ``` この変数という概念はプログラミングの色々な場面でを使うのでしっかり押さえてください。 ## もっとプログラミング 以下のコードをREPLに貼り付けて実行してみよう ``` var nums = list(57, 89) nums [0] nums[1] + ``` ``` var name = "world" print "Hello ," name + ```