Upgrade to Pro — share decks privately, control downloads, hide ads and more …

D言語に入門した話 / Introduction to D language

chapati
April 19, 2022

D言語に入門した話 / Introduction to D language

D言語に入門した話です

Twitterでご指摘いただいたのですが
- スライド15ページに記載のCTFEの実行について,バイトコードへの変換は特に行っていないようです

chapati

April 19, 2022
Tweet

More Decks by chapati

Other Decks in Technology

Transcript

  1. プログラム例: 基本的な制御構造 import std.stdio; int main() { for (int i

    = 1; i <= 100; i++) { if (i % 15 == 0) { writeln("FizzBuzz"); } else if (i % 3 == 0) { writeln("Fizz"); } else if (i % 5 == 0) { writeln("Buzz"); } else { writeln(i); } } }
  2. メタプログラミング にっょぃ struct Vector(size_t D, T = double) if (__traits(isFloating,

    T)) { T[D] num; alias num this; T dot(const Vector rhs) { T res = 0; static foreach (i; iota(D)) res += num[i] * rhs.num[i]; return res; } static if (D == 3) { Vector cross(const Vector rhs) { return Vector([ num[0] * rhs.num[1] - num[1] * rhs.num[0], num[1] * rhs.num[2] - num[2] * rhs.num[1], num[2] * rhs.num[0] - num[0] * rhs.num[2] ]); } } } void main() { auto v0 = Vector!3([ 1, 2, 3 ]); auto v1 = Vector!3([ 4, 5, 6 ]); writeln(v0.cross(v1)); writeln(v0.dot(v1)); } メタプログラミング にっょぃ ↓こんな感じで呼べる
  3. UFCS最強 struct Vector(size_t D, T = double) if (__traits(isFloating, T))

    { T[D] num; alias num this; } T dot(size_t D, T = double) (const Vector!(D, T) lhs, const Vector!(D, T) rhs) { T res = 0; static foreach (i; iota(D)) res += lhs.num[i] * rhs.num[i]; return res; } Vector!(D, T) cross(size_t D, T = double) (const Vector!(D, T) lhs, const Vector!(D, T) rhs) if (D == 3) { return Vector!(D, T)([ lhs.num[0] * rhs.num[1] - lhs.num[1] * rhs.num[0], lhs.num[1] * rhs.num[2] - lhs.num[2] * rhs.num[1], lhs.num[2] * rhs.num[0] - lhs.num[0] * rhs.num[2] ]); } Uniform Function Call Syntax void main() { auto v0 = Vector!3([ 1, 2, 3 ]); auto v1 = Vector!3([ 4, 5, 6 ]); writeln(v0.cross(v1)); writeln(v0.dot(v1)); } ↓同じくこんな感じで呼べる
  4. UFCS最強 import std.stdio; string repeat(string s, size_t times) { char[]

    res; for (size_t i = 0; i < times; i++) res ~= s; return cast(string) res; } void main() { "Hello world\n".repeat(3).write(); } 要はこんなことができる
  5. それ言語レベルで実現しちゃったのか - unittest - version - debug - foreach_reverse int

    multiply(int a, int b) { return a * b; } unittest { assert(multiply(2, 3) == 6); assert(multiply(7, 9) == 63); } Cでライブラリ毎にテスト方法がバラバラだった のをどうにかしたかったらしい
  6. それ言語レベルで実現しちゃったのか - unittest - version - debug - foreach_reverse version

    (Windows) { // Windows用のコード } else { // それ以外 } Cのマクロをどうにかしたかったらしい
  7. それ言語レベルで実現しちゃったのか - unittest - version - debug - foreach_reverse debug

    { // デバッグ用コード } これもCのマクロをどうにかしたかったらしい
  8. それ言語レベルで実現しちゃったのか - unittest - version - debug - foreach_reverse int[]

    arr = [ 1, 2, 3, 4, 5 ]; foreach_reverse (i, e; arr) { // 逆向きに反復 } 「順方向」と「逆方向」を相補的なモノとして捉えたようだ