エクセル指向プログラミング(Excel Oriented Programming、EOP)は、ノンプログラマにとって最も直感的で習得が容易なプログラミングスタイルです。
ブログラマは難解な言語機能を覚えることなく、拡張が容易なソフトウェアを、簡単に開発することができます。
プログラムのすべてのデータは長さ可変の二次元配列の上で管理されます。この二次元配列を「シート」といい、配列の各要素を「セル」と言います。
シートはシングルトンオブジェクトです。すなわち、EOPでは単一のグローバル変数を上書きすることでプログラムの状態を更新します。
構造化データはすべて配列で表します。データ型などのスキーマはありません。どの行・どの列がなんのデータを表すのかは、その場その場で変更することができます。
行方向または列方向に連続するセルが一つのデータ構造を表します。したがって、構造化データの読み取りは
while(cell) {
// do something
cell = sheet[r][c++];
}
のように書けます。使い終わった領域は0またはnullで初期化しておきます。
ネストされた構造化データは、セルへの参照をセルに書き込みます。たとえば、多重配列を表現する場合は、ネストされた配列の先頭要素の座標をセルに書き込みます。
EOPでは、プログラマは好きなときに好きなデータ構造を使用することができます。既存のプログラミングスタイルのように、データ型やメソッドのシグネチャに、データ構造が制限されることがありません。
探検
エクセル指向プログラミング
2024/03/26(火) 17:12:59.08ID:e/0sucGI
2024/03/26(火) 17:38:31.01ID:e/0sucGI
例として、nameとage属性をもったデータ構造を読み取るプログラムを書いてみましょう。
r = 0;
name = 0;
age = 1;
while(cell) {
print("name: " + sheet[r][name] + ", age: " + sheet[r][age]);
cell = sheet[r++][name];
}
このように、EOPでは構造体やクラスのような難解な機能を使わずとも、配列とループだけでデータ構造を操作することができます。
特筆すべきことは、EOPではデータ構造は使用時に自由に変更できます。もし、上のデータ構造に新たな属性sexが必要であれば、単に追加すればよいのです。
MALE = 1;
FEMALE = 2;
sex = 2;
sheet[0][sex] = MALE;
sheet[1][sex] = FEMALE;
r = 0;
name = 0;
age = 1;
while(cell) {
print("name: " + sheet[r][name] + ", age: " + sheet[r][age]);
cell = sheet[r++][name];
}
このように、EOPでは構造体やクラスのような難解な機能を使わずとも、配列とループだけでデータ構造を操作することができます。
特筆すべきことは、EOPではデータ構造は使用時に自由に変更できます。もし、上のデータ構造に新たな属性sexが必要であれば、単に追加すればよいのです。
MALE = 1;
FEMALE = 2;
sex = 2;
sheet[0][sex] = MALE;
sheet[1][sex] = FEMALE;
2024/03/26(火) 19:22:17.08ID:e/0sucGI
EOPでは関数は使いません。別の処理に移動したい場合は、単にジャンプ先のセルの座標を指定すればよいのです。
以下は、すごろくを1マスずつ巡回し、BONUSマスならば2つ進め、PENALTYマスならば2つ戻り、巡回したマスをカウントするプログラムです。一度発動したボーナス/ペナルティは二回目からは無効になります。
r = 0;
c = 0;
cnt = 0
while(cell) {
cnt++;
if(cell == "BONUS") {
cell = "VISITED";
c += 2;
} else if(cell == "PENALTY") {
cell = "VISITED";
c -= 2;
} else {
c += 1;
}
cell = sheet[r][c];
}
以下は、すごろくを1マスずつ巡回し、BONUSマスならば2つ進め、PENALTYマスならば2つ戻り、巡回したマスをカウントするプログラムです。一度発動したボーナス/ペナルティは二回目からは無効になります。
r = 0;
c = 0;
cnt = 0
while(cell) {
cnt++;
if(cell == "BONUS") {
cell = "VISITED";
c += 2;
} else if(cell == "PENALTY") {
cell = "VISITED";
c -= 2;
} else {
c += 1;
}
cell = sheet[r][c];
}
2024/03/26(火) 19:23:43.98ID:e/0sucGI
べつの処理をした後、元の場所に戻ってきたい場合はどうすればいいでしょうか?スタックを使えば簡単にできます。
以下は、データの合計値を求めるプログラムです。ただし、現在のセルが配列の場合は、その配列の合計値を求めます。データは0列目が数値または配列宣言、配列宣言がされた時は1列目がジャンプ先の行番号、2列目が列番号です。
r = 0; data = 0; data_r = 1; data_c = 2;
stack = 0; stack_r = 3; stack_c = 4;
sum = 0;
while(cell) {
if (cell == "ARRAY") {
stack++;
sheet[stack][stack_r] = r;
sheet[stack][stack_c] = data;
tmp_r = r;
r = sheet[tmp_r][data_r];
data = sheet[tmp_r][data_c];
data_r = data + 1;
data_c = data + 2;
cell = sheet[r][data];
} else {
sum += cell;
cell = sheet[r++][data];
}
if (!cell) {
if (stack) {
r = sheet[stack][stack_r];
data = sheet[stack][stack_c];
data_r = data + 1;
data_c = data + 2;
stack--;
}
}
}
以下は、データの合計値を求めるプログラムです。ただし、現在のセルが配列の場合は、その配列の合計値を求めます。データは0列目が数値または配列宣言、配列宣言がされた時は1列目がジャンプ先の行番号、2列目が列番号です。
r = 0; data = 0; data_r = 1; data_c = 2;
stack = 0; stack_r = 3; stack_c = 4;
sum = 0;
while(cell) {
if (cell == "ARRAY") {
stack++;
sheet[stack][stack_r] = r;
sheet[stack][stack_c] = data;
tmp_r = r;
r = sheet[tmp_r][data_r];
data = sheet[tmp_r][data_c];
data_r = data + 1;
data_c = data + 2;
cell = sheet[r][data];
} else {
sum += cell;
cell = sheet[r++][data];
}
if (!cell) {
if (stack) {
r = sheet[stack][stack_r];
data = sheet[stack][stack_c];
data_r = data + 1;
data_c = data + 2;
stack--;
}
}
}
2024/03/26(火) 19:26:58.02ID:e/0sucGI
訂正:
r++やc++と書いてあるところ
すべて++r, ++cです
r++やc++と書いてあるところ
すべて++r, ++cです
2024/03/26(火) 19:59:23.04ID:e/0sucGI
EOPでは、シートを用いてデータ構造をシンプルかつ柔軟に扱えるだけではなく、シートは手続きを表現することもできます
以下のプログラムは、4つのコマンド
ADD
PRINT
を持ちます
ADDを呼ぶと、引数の数が合計値に加算されます
PRINTを呼ぶと、現在の合計値が表示されます
r = 0;
sum = 0;
while(cell) {
if (cell == "ADD") {
sum += sheet[r][cmd + 1];
}
if (cell =="PRINT") {
print(sheet[r][cmd + 1]);
}
cell = sheet[++r][cmd];
}
以下のプログラムは、4つのコマンド
ADD
を持ちます
ADDを呼ぶと、引数の数が合計値に加算されます
PRINTを呼ぶと、現在の合計値が表示されます
r = 0;
sum = 0;
while(cell) {
if (cell == "ADD") {
sum += sheet[r][cmd + 1];
}
if (cell =="PRINT") {
print(sheet[r][cmd + 1]);
}
cell = sheet[++r][cmd];
}
2024/03/27(水) 05:40:00.84ID:Ln/fAIz6
言語何使ってんのコレ
2024/03/27(水) 14:53:16.09ID:8k2YrkW2
なんかオライリーみたいな導入
2024/03/29(金) 14:55:32.56ID:hQjfrr6D
ID:e/0sucGI
こいつろくにプログラミングしたことないんだろうなぁ
こいつろくにプログラミングしたことないんだろうなぁ
10デフォルトの名無しさん
2024/03/29(金) 16:33:00.75ID:4yVHOK9w ネタスレにマジレス
2024/03/30(土) 19:46:50.28ID:lpdJhGw+
あれだけ連投してるのにネタスレでごまかすのは無理でしょ
まぁ足りない頭を絞って書いたものを正論で潰されるのは可哀相っちゃ可哀相だけど…
まぁ足りない頭を絞って書いたものを正論で潰されるのは可哀相っちゃ可哀相だけど…
12デフォルトの名無しさん
2024/03/30(土) 22:25:41.35ID:2vvOizF3 うわぁ……
2024/03/31(日) 05:30:13.50ID:mCr6Yy4A
>>1があれ以降書き込んでないのがお察し
どんな反応求めてたんだろう
どんな反応求めてたんだろう
14デフォルトの名無しさん
2024/03/31(日) 10:58:19.19ID:bHunl/8Xレスを投稿する
ニュース
- れいわ議員「母親はね、子どもを戦争に行かせるために産んだんじゃないんだよ」 高市総理に“10秒回答”迫り、残り5分は“独壇場”★3 [♪♪♪★]
- 中国国防省が再反論 SNSで公開した音声とは“別の通報”で日本に訓練の時間や海域を通報したと主張★3 [夜のけいちゃん★]
- BreakingDown選手がくも膜下出血、瓜田純士、平手打ちを行った江口響は「もう格闘技も辞めます。責任取りたいです』とまで言ってきてる」 [muffin★]
- 資さんうどんが「PayPay」の取り扱いを停止 他のキャッシュレス決済は引き続き利用可能 [少考さん★]
- こども家庭庁、2026年から“独身税”を開始、年収200万なら年4200円、年収400万なら年7800円 ★7 [お断り★]
- フィンランド、ミスや国会議員つり目投稿 くり返されるアジア人差別 ★4 [蚤の市★]
- 30年前くらいの日本の街歩きの動画見てるけど子供多すぎてビビるわ
- 天パってキモいよね
- 俺ちいかわのキャラだとちいちゃんっぽいんだが
- 【速報】高市早苗、文春砲wwwwwwwwwwwwwwwwwwwwwwwwwwwww [339035499]
- 一兆℃の火の玉が現れたら太陽系消滅するらしい🙂
- 起きてるやついる?
