dlang
D言語
弱小PHPerのD言語挑戦記
More than 3 years have passed since last update.


弱小PHPerのD言語挑戦記

前回からいろいろ調べてやった結果、素直にgccをリインストールしたらコンパイルが通りました

何が原因だったのかは不明ですが、ともかく良かった...

($dmd -vでgccに渡してるオプションがわかるらしいので、余裕のあるときにでも色々やってみます)

で、hello,worldが通ったら、次はFizzBuzz


fizzbuzz.d

mport std.stdio;

void main(){
string fizz = "Fizz";
string buzz = "Buzz";
string fizzbuzz = "FizzBuzz!";
int n = 1000000;
for (int i = 1;i <= n ; i++) {
if(i % 3 == 0 && i % 5 == 0){
writeln(fizzbuzz);
}else if(i % 3 == 0){
writeln(fizz);
}else if(i % 5 == 0){
writeln(buzz);
}else{
writeln(i);
}
}

}


こんな感じで、うまく行きました

しかし、さすがネイティブで実行されるだけあって、PHPとは比べ物にならないほど早いですね

さて、Dの文法になれるためいろいろやってみましょう

次はエラトステネスのふるいです


Eratosthenes(?).d

import std.stdio;

import std.math;

void main(){

int n = 100000;
byte[] array = new byte[n];
array[0..2] = false;
for (int i = 2; i < trunc(sqrt(cast(float)n)); i++) {
if (array[i] != -1) {
array[i] = 1;
for (int j = i+1; j <= array.length; j++) {
if (j % i == 0) {
array[j] = -1;
}
}
}
}
for(int k = cast(int)trunc(sqrt(cast(float)n)); k <= array.length; k++){
if(array[k] == 0){
array[k] = 1;
}
}

for (int l = 0; l <= array.length; l++) {
if(array[l] == 1){
writeln(l);
}
}

}


最初、sqrt()の引数にintの値をそのまま突っ込んでいて、エラーが帰ってきました(sqrt()の引数はfloat型)

なるほど、引数の型までチェックされるのか...

cast(Type)var

で、変数varをType型の値に変換できるらしいので、早速使用

dmdでコンパイルして./Eratosthenesで実行

すると、

「RangeViolation」なるエラーが配列にアクセスする行で発生していました(調べると、例外なので捕捉可能...?)

よくわからず困っていたところ、またもやTwitter!

array.lengthは配列の要素数を示すものであって、forで使うには-1しないといけないみたいです

for文の第二引数(for文の場合も引数と言っていいのかな?)のarray.lengthを-1して再度挑戦すると成功!

(foreachを使えばもっとスマートに書けるみたいです)

やっぱりPHPとは違って細かい「低級な」ところもきちんとしないといけないのが新鮮です


さて、今回学んだのは


  • array.lengthの扱い

  • castを使っての型変換

の2つ

どれもPHPならバックでやってくれるので、こういうのを意識するのは新鮮です

次はどんなものを書こうかな...

ちょっとの間はyukicoderでいろいろやってみよう