ロベールのC++入門講座 その2

5章4節

Struct1.cppを今までの理解の確認をかねて、ポインタ渡しのコードにしてみる。


#include <iostream>
using namespace std;

const int MAX_NAME = 16;

struct Student {
char name[MAX_NAME + 1];
int scoreJapanese;
int scoreMath;
int scoreEnglish;
};

void Show(const Student* student) {
cout << "名前 : " << (*student).name << endl << "国語 : "
<< (*student).scoreJapanese << endl << "数学 :"
<< (*student).scoreMath << endl << "英語 ;"
<< (*student).scoreEnglish << endl;

}

int main() {
Student student[] = { { "赤井孝", 73, 98, 86 }, { "笠井大介", 64, 45, 40 }, {
"吉田叶", 76, 78, 69 }, };

int size = sizeof student / sizeof *student;

for (int i = 0; i < size; ++i) {
Show(&student[i]);
}
}

foldでハマった

多分初歩的な事ですが、foldでハマった。

Schemeのfoldで


(fold (lambda (f v) (f)) #f '((lambda () (* 1 2))))

のような事をやろうとしたら


*** ERROR: invalid application: ((lambda () (* 1 2)))

と出てハマった。いやいやinvalidじゃないでしょー、と思って試行錯誤を続けたら


(fold (lambda (f v) (f)) #f `(,(lambda () (* 1 2))))

とする事で、望み通りの動きが実現出来た。

rubyでS式っぽいの出力出来るのか

タイトルそのまんまですが、rubyでS式的な構造を出力出来るライブラリを見つけた。

こんな感じに使うみたいです。


require 'ripper'
require 'pp'

src="1+1"
pp Ripper::SexpBuilder.new(src).parse

出力結果


[:program,
[:stmts_add,
[:stmts_new],
[:binary, [:@int, "1", [1, 0]], :+, [:@int, "1", [1, 2]]]]]

Whitespace基礎文法最速マスター

乗るしかない、このビッグウェーブに!

という訳でWhitespaceの基礎文法最速マスターです。

Brainf*ck基礎文法最速マスター – 医者を志す妻を応援する夫の日記」を読んで、Brainf*ckがあるなら変態言語の双頭をなすWhitespaceもあるべきと思い、書きました。

ちなみに僕は一度もWhitespaceでプログラムを書いた事がないので、間違っているところがあるかもしれませんが、Whitespaceハッカーの方は是非指摘してください!

基礎

ご存知の通りスペースとタブと改行記号のみの言語です。

IMP(Instruction Modification Parameter)、コマンド、パラメータの3つ組で命令を表現する。

IMPとして次のものがある。(以下では各要素、最後の改行は見やすさのために書いただけなので一つ取り除いて考えてください)


スタック操作:
算術:
ヒープアクセス:
フロー制御:

I/O:

数値は2進数で表されており、スペースが0、タブが1を表し、改行記号で数値の終わりを表す。注意すべきは、最初の文字がスペースなら正の数で、タブなら負の数であり2の補数ではないという事です。

スタック操作は次のような種類がある。


数値をスタックに積む: [数値]
スタックの一番上を複製:

スタックのn番目をコピーして一番上に積む: [数値]
スタックの一番目と二番目を交換する:

スタックの一番上のものを捨てる:


算術は次の通り


足し算:
引き算:
かけ算:

割り算:
剰余:

ヒープアクセスはスタックを見て、保存、検索するアイテムのアドレスを見つけます。要素を保存するにはアドレスをプッシュし、値をプッシュしてstoreコマンドを行います。要素を検索するには、アドレスをプッシュした後、retrieveコマンドを行います。


store:
retrieve:

フロー制御にはラベルを用いる操作がいくつかあります。ラベルとは改行記号で終わるスペースとタブの連続です。名前空間は一つしかないので、全てのラベルはユニークである必要があります。


プログラムの位置をマークする: [Label]
サブルーチンを呼ぶ: [Label]
ラベルへ飛ぶ:
[Label]
スタックのトップが0ならラベルへ飛ぶ: [Label]
スタックのトップが負ならラベルへ飛ぶ: [Label]
サブルーチンを終え、呼び出し元へ戻る:

プログラムを終了:


I/Oは次の通り


スタックのトップの文字を出力:
スタックのトップの数字を出力:
文字を読み取り、スタックのトップにより与えられた場所に置く:
数字を読み取り、スタックのトップにより与えられた場所に置く:

サンプルコード

Hello, World!


































処理系

ググるか、自分で実装してください。

参考資料

他の基礎文法最速マスターへのリンク

Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~

Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~