デーモン君のソース探検 その2

ソースコード中に、


int
tcsetattr(fd, opt, t)
int fd, opt;
const struct termios *t;
{

}

のような書き方が頻繁に出てきて、関数名のあとの変数宣言は一体なんなのかと思って調べてみると、このページに書いてあった。

古いC言語では関数の仮引数の型をこうやって指定してたのね。

勉強になった。

デーモン君のソース探検 その1

買ってみた。

VMWare上のUbuntuで進めていきます。

まずはNetBSDのソースコードを取得します。がしかし、cvs loginができずに書いてあるとおりには進めないので、普通にFTPでNetBSDのソースコードを取得してきた。

取ってきたバージョンは5.1で、本は1.6を使っているけど基本的なコマンドのソースは同じだろうという判断で進めていきます。

ちなみにlocateコマンドのデータベース作成ですが、


# sh /etc/weekly

はUbuntuでは無いようなので、


# sudo updatedb

でデータベースをアップデートできます。

ロベールの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~