### 2.4.2 pattern matching examples -- own types in line before function body ``` // left = function type, right = arguments type bool = string str has_begin_test "test" ++ _ = true has_begin_test _ = false -> bool has_begin_test(string str){ if(str.length >= 4 && str[0..4] == "test"){ return true; } return false; } ``` ``` // left = function type, right = arguments type bool = string str, out string rest has_begin_test "test" ++ rest = true has_begin_test _ = false -> // import std.stdio; bool has_begin_test(string str, out string rest){ if(str.length >= 4 && str[0..4] == "test"){ rest = str[4..$]; return true; } rest = str; return false; } /* void main(){ string rest; writeln( has_begin_test("test123", rest) ); // true, rest = "123" writeln(rest); // "123" writeln( has_begin_test("test", rest) ); // true, rest = "" writeln(rest); // "" writeln( has_begin_test("example", rest) ); // false, rest = "example" writeln(rest); // "example" } */ ``` ``` // left = function type, right = arguments type bool = string str has_end_test _ ++ "test" = true has_end_test _ = false -> // match from string ending bool has_end_test(string str){ if(str.length >= 4){ if(str[$-4 .. $] == "test"){ return true; } } return false; } ``` ``` // left = function type, right = arguments type bool = string str, out string rest has_end_test rest ++ "test" = true has_end_test _ = false -> // import std.stdio; bool has_end_test(string str, out string rest){ if(str.length >= 4 && str[$-4 .. $] == "test"){ rest = str[0 .. $-4]; return true; } rest = str; return false; } /* void main(){ string rest; writeln( has_end_test("hellotest", rest) ); // true, rest = "hello" writeln(rest); // "hello" writeln( has_end_test("example", rest) ); // false, rest = "example" writeln(rest); // "example" writeln( has_end_test("test", rest) ); // true, rest = "" writeln(rest); // "" } */ ``` ``` // left = function type, right = arguments type int = int x my_func 1 = 1 my_func 5 = 5 * 2 my_func 9 = 9 * 3 my_func X = X * 4 -> int my_func(int x){ if(x == 1){ return 1; }else if(x == 5){ return 5 * 2; // return x * 2; }else if(x == 9){ return 9 * 3; // return x * 3; }else{ // other cases return x * 4; } } ``` ``` // left = function type, right = arguments type // "_sw" in function name' end for use switch (no "_sw" in dlang function name) int = int x my_func_sw 1 = 1 my_func_sw 5 = 5 * 2 my_func_sw 9 = 9 * 3 my_func_sw X = X * 4 -> int my_func(int x){ switch(x){ case 1: return 1; // if x == 1 case 5: return 5 * 2; // return x * 2; // if x == 5 case 9: return 9 * 3; // return x * 3; // if x == 9 default: return x * 4; // other cases } } ``` ``` // ptn = pattern = for pattern matching like `case X of` in erlang y = ptn x 1 = 1 5 = 5 * 2 9 = 9 * 3 _ = x * 4 -> if (x == 1){ y = 1; }else if(x == 5){ y = 5 * 2; // return x * 2; }else if(x == 9){ y = 9 * 3; // return x * 3; }else{ // other cases y = x * 4; } ``` ``` // ptns = use switch in dlang for this pattern matching y = ptns x 1 = 1 5 = 5 * 2 9 = 9 * 3 _ = x * 4 -> switch(x){ case 1: y = 1; // if x == 1 case 5: y = 5 * 2; // y = x * 2; // if x == 5 case 9: y = 9 * 3; // y = x * 3; // if x == 9 default: y = x * 4; // other cases } ``` todo more examples -- with switch case dlang ## 2.5 aliases for imports, externs etc ``` use core.stdc.stdio [ printf scanf ] std.conv [ to ] -> import core.stdc.stdio : printf, scanf; import std.conv : to; ``` ``` // definition at the beginning of the file use as use1 core.stdc.stdio [ printf scanf ] std.conv [ to ] std.stdio std.array std.string std.algorithm use1 // use elsewhere in the file -> import core.stdc.stdio : printf, scanf; import std.conv : to; import std.stdio; import std.array; import std.string; import std.algorithm; ``` todo add more examples ## 2.6 main, wasm import from js (wasm export to js = as usual function + return) ``` main -> void main() { ... ``` ``` smain -> extern(C) void main() { ... ``` ``` // for wasm wmain -> void _start(){ } ``` ``` // wasm import from js void = int a print -> void print(int a); ``` ## 2.10 reserved words (keywords) list including https://dlang.org/spec/lex.html#keywords ``` abstract alias align asm assert auto bool break byte case cast catch char class const continue dchar debug default delegate deprecated do double else enum export extern false final finally float for foreach foreach_reverse function goto if immutable import in inout int interface invariant is lazy long macro mixin module new nothrow null out override package pragma private protected public pure real ref return scope shared static struct super switch synchronized template this throw true try typeid typeof ubyte uint ulong union unittest ushort version void wchar while with __FILE__ __FILE_FULL_PATH__ __FUNCTION__ __LINE__ __MODULE__ __PRETTY_FUNCTION__ __gshared __parameters __rvalue __traits __vector __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__ [deprecated keywords] body cdouble cent cfloat creal delete idouble ifloat ireal ucent use as ptn ptns _ ++ *_sw (function name end) main smain wmain dlang (dlang code without changes) ``` todo