似非プログラマのうんちく

「似非プログラマの覚え書き」出張版

よくわかるかどうかわからない現代魔法(その 2)

前回の続き。

自分で「呪文」を作る

古代魔法でもいくつかの呪文を組み合わせて新しい呪文を作り出すことはあったであろうが、現代魔法でももちろん可能である。

今回は「税抜き価格を書き添えたら、税込み価格を教えてくれる『呪文』」を作ってみよう。

#include <stdio.h>

int tax_inc(int);

int main() {
    printf("%d", tax_inc(2800));
    return 0;
}

int tax_inc(int price) {
    float rate = 0.05;
    return price * (1 + rate);
}

今回、tax_inc という新しい「呪文」を自分で作った。最初の方にある

int tax_inc(int);

は新しい「呪文」の「索引」のようなものである。「索引は後ろに付けるものじゃないの ?」という突っ込みはごもっともだが、そこは現代魔法*1の悲しい性である。「索引」を付けずに

#include <stdio.h>

int tax_inc(int price) {
    float rate = 0.05;
    return price * (1 + rate);
}

int main() {
    printf("%d", tax_inc(2800));
    return 0;
}

のように書くこともできるのだが、「魔法」の本体である main が先に書いてあった方がスマート*2だろ ?

さて、自分で作った新しい「呪文」の中身を見てみよう。

int tax_inc(int price) {
    ...
}

「呪文」を唱えた結果起こる現象(= 出力)には必ず何かしらの「特性*3があるはずだ。この tax_incint という「特性」を持つ現象を結果として起こす。そして、この「呪文」は price を書き添えて使うべし、ということが定められている。

float rate = 0.05;

はこの「呪文」の中でだけ使える「ルーン文字」である。この「呪文」の中でだけ rate が使えて、それは 0.05 に置き換わる。= は数学*4では「等しい」だが、現代魔法(= プログラム)では「代入」である。つまり

float rate;

と書いただけでは、まだ「この『ルーン文字』を使って良い」だけであって、この「ルーン文字」がいかなる効果を持つのかは何も分からない。

float rate;
rate = 0.05;

と書いて初めてこの「ルーン文字」は効力を発揮する。ちなみに現代魔法ではこんなまどろっこしい書き方はせずに*5省略して

float rate = 0.05;

と書く。

return price * (1 + rate);

return を使って、「呪文」を唱えた結果を放つ。

ところで諸君、よくよく考えてみると

price * (1 + rate)

という式は、各々の型で書いてみると int * (int + float) である。*6*7

C 魔法のしきたりにより int + floatfloat になり、int * floatfloat になる。おっと、そうするとこのままでは int 型の現象を起こさねばならないのに float 型の現象を起こそうとしていることになるぞ。「大丈夫か ?」とお思いにはならないだろうか。

しかしそこは現代魔法、ちゃんと起こしたい現象の型に結果を変換してくれるのである。*8

後は例によって「魔法」を完成させ、しかる後に「発動」するだけである。ちゃんと

2939

と表示されたかな ?

*1:というか C 魔法

*2:であると多くの C 魔法使いは思っているはずだ。

*3:技術的なお話。つまり関数には必ず返り値があり、返り値は何かしらの型を持っているということ。何も返さないことも void という立派な型である。

*4:こいつは現代魔法が産声を上げるよりはるか昔から存在する古代魔法にして、今なお新しい魔法体系を次々と生み出している恐ろしいやつだ。実は現代魔法も少なからずこいつのお世話になっている。

*5:誤りではないが、現代魔法の使い手は往々にして怠惰であるので、サボれるところはとことんサボるのである。

*6:1 は C 魔法のしきたりにより int 型と解釈される。

*7:もちろんだが、現代魔法でこんな書き方は許されない。あくまで頭の中だけでのお話。

*8:ただし、これはいつでも上手く行くとは限らないし、違う「魔法」体系では許してもらえないこともある。この辺の事情については、あなたが習得したい「魔法」体系に合わせる必要がある。