205 lines
21 KiB
HTML
205 lines
21 KiB
HTML
<!DOCTYPE html>
|
|
<html><head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
|
<title>test.zig</title>
|
|
<meta name="generator" content="KF5::SyntaxHighlighting - Definition (Zig) - Theme (Breeze Light)"/>
|
|
</head><body style="background-color:#ffffff;color:#1f1c1b"><pre>
|
|
<span style="color:#0057ae">const</span> std <span style="color:#ca60ca">=</span> <span style="color:#644a9b;font-weight:bold">@import</span>(<span style="color:#bf0303">"std"</span>);
|
|
|
|
<span style="color:#898887">/// This is a doc comment</span>
|
|
<span style="color:#898887">// This is a comment</span>
|
|
<span style="font-weight:bold">fn</span> getData() <span style="color:#ca60ca">!</span><span style="color:#0057ae">u32</span> {
|
|
<span style="font-weight:bold">return</span> <span style="color:#b08000">666</span>;
|
|
}
|
|
|
|
<span style="color:#898887">// multiline string</span>
|
|
<span style="color:#0057ae">const</span> hello_world_in_c <span style="color:#ca60ca">=</span>
|
|
<span style="color:#bf0303">\\#include <stdio.h></span>
|
|
<span style="color:#bf0303">\\</span>
|
|
<span style="color:#bf0303">\\int main(int argc, char **argv) {</span>
|
|
<span style="color:#bf0303">\\ printf("hello world\n");</span>
|
|
<span style="color:#bf0303">\\ return 0;</span>
|
|
<span style="color:#bf0303">\\}</span>
|
|
;
|
|
|
|
<span style="color:#898887">// Top-level declarations are order-independent:</span>
|
|
<span style="color:#0057ae">const</span> print <span style="color:#ca60ca">=</span> <span style="color:#644a9b;font-weight:bold">@import</span>(<span style="color:#bf0303">"std"</span>)<span style="color:#ca60ca">.</span>debug<span style="color:#ca60ca">.</span>print;
|
|
|
|
<span style="font-weight:bold">pub</span> <span style="font-weight:bold">fn</span> main() <span style="color:#ca60ca">!</span><span style="color:#0057ae">void</span> {
|
|
<span style="font-weight:bold">inline</span> <span style="font-weight:bold">for</span> (values) <span style="color:#ca60ca">|</span>v<span style="color:#ca60ca">,</span> i<span style="color:#ca60ca">|</span> {
|
|
<span style="font-weight:bold">if</span> (i <span style="color:#ca60ca">!=</span> <span style="color:#b08000">2</span>) <span style="font-weight:bold">continue</span>;
|
|
<span style="font-weight:bold">try</span> expect(v);
|
|
}
|
|
|
|
<span style="color:#898887">// error union</span>
|
|
<span style="color:#0057ae">var</span> number_or_error<span style="color:#ca60ca">:</span> <span style="color:#0057ae">anyerror</span><span style="color:#ca60ca">!</span><span style="color:#0057ae">i32</span> <span style="color:#ca60ca">=</span> <span style="font-weight:bold">error</span><span style="color:#ca60ca">.</span>ArgNotFound;
|
|
|
|
print(<span style="color:#bf0303">"</span><span style="color:#3daee9">\n</span><span style="color:#bf0303">error union 2</span><span style="color:#3daee9">\n</span><span style="color:#bf0303">type: {}</span><span style="color:#3daee9">\n</span><span style="color:#bf0303">value: {!}</span><span style="color:#3daee9">\n</span><span style="color:#bf0303">"</span><span style="color:#ca60ca">,</span> <span style="color:#ca60ca">.</span>{
|
|
<span style="color:#644a9b;font-weight:bold">@TypeOf</span>(number_or_error)<span style="color:#ca60ca">,</span> number_or_error<span style="color:#ca60ca">,</span>
|
|
});
|
|
|
|
<span style="color:#0057ae">const</span> stdout <span style="color:#ca60ca">=</span> std<span style="color:#ca60ca">.</span>io<span style="color:#ca60ca">.</span>getStdOut()<span style="color:#ca60ca">.</span>writer();
|
|
<span style="font-weight:bold">try</span> stdout<span style="color:#ca60ca">.</span>print(<span style="color:#bf0303">"Hello, {s}!</span><span style="color:#3daee9">\n</span><span style="color:#bf0303">"</span><span style="color:#ca60ca">,</span> <span style="color:#ca60ca">.</span>{<span style="color:#bf0303">"world"</span>});
|
|
<span style="color:#0057ae">const</span> bytes <span style="color:#ca60ca">=</span> <span style="color:#bf0303">"hello"</span>;
|
|
print(<span style="color:#bf0303">"{}</span><span style="color:#3daee9">\n</span><span style="color:#bf0303">"</span><span style="color:#ca60ca">,</span> <span style="color:#ca60ca">.</span>{<span style="color:#644a9b;font-weight:bold">@TypeOf</span>(bytes)}); <span style="color:#898887">// *const [5:0]u8</span>
|
|
print(<span style="color:#bf0303">"{d}</span><span style="color:#3daee9">\n</span><span style="color:#bf0303">"</span><span style="color:#ca60ca">,</span> <span style="color:#ca60ca">.</span>{bytes[<span style="color:#b08000">5</span>]}); <span style="color:#898887">// 0</span>
|
|
print(<span style="color:#bf0303">"{}</span><span style="color:#3daee9">\n</span><span style="color:#bf0303">"</span><span style="color:#ca60ca">,</span> <span style="color:#ca60ca">.</span>{<span style="color:#924c9d">'e'</span> <span style="color:#ca60ca">==</span> <span style="color:#924c9d">'</span><span style="color:#3daee9">\x65</span><span style="color:#924c9d">'</span>}); <span style="color:#898887">// true</span>
|
|
print(<span style="color:#bf0303">"{d}</span><span style="color:#3daee9">\n</span><span style="color:#bf0303">"</span><span style="color:#ca60ca">,</span> <span style="color:#ca60ca">.</span>{<span style="color:#924c9d">'</span><span style="color:#3daee9">\u{1f4a9}</span><span style="color:#924c9d">'</span>}); <span style="color:#898887">// 128169</span>
|
|
print(<span style="color:#bf0303">"{d}</span><span style="color:#3daee9">\n</span><span style="color:#bf0303">"</span><span style="color:#ca60ca">,</span> <span style="color:#ca60ca">.</span>{<span style="color:#924c9d">'💯'</span>}); <span style="color:#898887">// 128175</span>
|
|
print(<span style="color:#bf0303">"{}</span><span style="color:#3daee9">\n</span><span style="color:#bf0303">"</span><span style="color:#ca60ca">,</span> <span style="color:#ca60ca">.</span>{mem<span style="color:#ca60ca">.</span>eql(<span style="color:#0057ae">u8</span><span style="color:#ca60ca">,</span> <span style="color:#bf0303">"hello"</span><span style="color:#ca60ca">,</span> <span style="color:#bf0303">"h</span><span style="color:#3daee9">\x65</span><span style="color:#bf0303">llo"</span>)}); <span style="color:#898887">// true</span>
|
|
print(<span style="color:#bf0303">"0x{x}</span><span style="color:#3daee9">\n</span><span style="color:#bf0303">"</span><span style="color:#ca60ca">,</span> <span style="color:#ca60ca">.</span>{<span style="color:#bf0303">"</span><span style="color:#3daee9">\xff</span><span style="color:#bf0303">"</span>[<span style="color:#b08000">0</span>]}); <span style="color:#898887">// non-UTF-8 strings are possible with \xNN notation.</span>
|
|
print(<span style="color:#bf0303">"{u}</span><span style="color:#3daee9">\n</span><span style="color:#bf0303">"</span><span style="color:#ca60ca">,</span> <span style="color:#ca60ca">.</span>{<span style="color:#924c9d">'⚡'</span>});
|
|
|
|
_ <span style="color:#ca60ca">=</span> <span style="color:#644a9b;font-weight:bold">@import</span>(<span style="color:#bf0303">"introducing_zig_test.zig"</span>);
|
|
}
|
|
|
|
<span style="color:#898887">// Declare an enum.</span>
|
|
<span style="color:#0057ae">const</span> Type <span style="color:#ca60ca">=</span> <span style="font-weight:bold">enum</span> {
|
|
ok<span style="color:#ca60ca">,</span>
|
|
not_ok<span style="color:#ca60ca">,</span>
|
|
};
|
|
|
|
<span style="font-weight:bold">test</span> <span style="color:#bf0303">"async skip test"</span> {
|
|
<span style="color:#0057ae">var</span> frame <span style="color:#ca60ca">=</span> <span style="color:#0057ae">async</span> func();
|
|
<span style="color:#0057ae">const</span> result <span style="color:#ca60ca">=</span> <span style="color:#0057ae">await</span> frame;
|
|
<span style="font-weight:bold">try</span> std<span style="color:#ca60ca">.</span>testing<span style="color:#ca60ca">.</span>expect(result <span style="color:#ca60ca">==</span> <span style="color:#b08000">1</span>);
|
|
}
|
|
|
|
<span style="font-weight:bold">fn</span> func() <span style="color:#0057ae">i32</span> {
|
|
<span style="font-weight:bold">suspend</span> {
|
|
<span style="font-weight:bold">resume</span> @frame();
|
|
}
|
|
<span style="font-weight:bold">return</span> <span style="color:#b08000">1</span>;
|
|
}
|
|
|
|
<span style="font-weight:bold">pub</span> <span style="color:#0057ae">extern</span> <span style="color:#bf0303">"c"</span> <span style="font-weight:bold">fn</span> @<span style="color:#bf0303">"error"</span>() <span style="color:#0057ae">void</span>;
|
|
<span style="font-weight:bold">pub</span> <span style="color:#0057ae">extern</span> <span style="color:#bf0303">"c"</span> <span style="font-weight:bold">fn</span> @<span style="color:#bf0303">"fstat$INODE64"</span>(fd<span style="color:#ca60ca">:</span> c<span style="color:#ca60ca">.</span>fd_t<span style="color:#ca60ca">,</span> buf<span style="color:#ca60ca">:</span> <span style="color:#ca60ca">*</span>c<span style="color:#ca60ca">.</span>Stat) <span style="color:#0057ae">c_int</span>;
|
|
|
|
<span style="color:#0057ae">const</span> Color <span style="color:#ca60ca">=</span> <span style="font-weight:bold">enum</span> {
|
|
red<span style="color:#ca60ca">,</span>
|
|
@<span style="color:#bf0303">"really red"</span><span style="color:#ca60ca">,</span>
|
|
};
|
|
<span style="color:#0057ae">const</span> color<span style="color:#ca60ca">:</span> Color <span style="color:#ca60ca">=</span> <span style="color:#ca60ca">.</span>@<span style="color:#bf0303">"really red"</span>;
|
|
|
|
<span style="color:#0057ae">var</span> y<span style="color:#ca60ca">:</span> <span style="color:#0057ae">i32</span> <span style="color:#ca60ca">=</span> add(<span style="color:#b08000">10</span><span style="color:#ca60ca">,</span> x);
|
|
<span style="color:#0057ae">const</span> x<span style="color:#ca60ca">:</span> <span style="color:#0057ae">i32</span> <span style="color:#ca60ca">=</span> add(<span style="color:#b08000">12</span><span style="color:#ca60ca">,</span> <span style="color:#b08000">34</span>);
|
|
|
|
<span style="font-weight:bold">test</span> <span style="color:#bf0303">"comptime vars"</span> {
|
|
<span style="color:#0057ae">var</span> x<span style="color:#ca60ca">:</span> <span style="color:#0057ae">i32</span> <span style="color:#ca60ca">=</span> <span style="color:#b08000">1</span>;
|
|
<span style="color:#0057ae">comptime</span> <span style="color:#0057ae">var</span> y<span style="color:#ca60ca">:</span> <span style="color:#0057ae">i32</span> <span style="color:#ca60ca">=</span> <span style="color:#b08000">1</span>;
|
|
|
|
x <span style="color:#ca60ca">+=</span> <span style="color:#b08000">1</span>;
|
|
y <span style="color:#ca60ca">+=</span> <span style="color:#b08000">1</span>;
|
|
|
|
<span style="font-weight:bold">try</span> expect(x <span style="color:#ca60ca">==</span> <span style="color:#b08000">2</span>);
|
|
<span style="font-weight:bold">try</span> expect(y <span style="color:#ca60ca">==</span> <span style="color:#b08000">2</span>);
|
|
|
|
<span style="font-weight:bold">if</span> (y <span style="color:#ca60ca">!=</span> <span style="color:#b08000">2</span>) {
|
|
<span style="color:#898887">// This compile error never triggers because y is a comptime variable,</span>
|
|
<span style="color:#898887">// and so `y != 2` is a comptime value, and this if is statically evaluated.</span>
|
|
<span style="color:#644a9b;font-weight:bold">@compileError</span>(<span style="color:#bf0303">"wrong y value"</span>);
|
|
}
|
|
}
|
|
|
|
<span style="color:#0057ae">const</span> decimal_int <span style="color:#ca60ca">=</span> <span style="color:#b08000">98222</span>;
|
|
<span style="color:#0057ae">const</span> hex_int <span style="color:#ca60ca">=</span> <span style="color:#b08000">0xff</span>;
|
|
<span style="color:#0057ae">const</span> another_hex_int <span style="color:#ca60ca">=</span> <span style="color:#b08000">0xFF</span>;
|
|
<span style="color:#0057ae">const</span> octal_int <span style="color:#ca60ca">=</span> <span style="color:#b08000">0o755</span>;
|
|
<span style="color:#0057ae">const</span> binary_int <span style="color:#ca60ca">=</span> <span style="color:#b08000">0b11110000</span>;
|
|
|
|
<span style="color:#898887">// underscores may be placed between two digits as a visual separator</span>
|
|
<span style="color:#0057ae">const</span> one_billion <span style="color:#ca60ca">=</span> <span style="color:#b08000">1_000_000_000</span>;
|
|
<span style="color:#0057ae">const</span> binary_mask <span style="color:#ca60ca">=</span> <span style="color:#b08000">0b1_1111_1111</span>;
|
|
<span style="color:#0057ae">const</span> permissions <span style="color:#ca60ca">=</span> <span style="color:#b08000">0o7_5_5</span>;
|
|
<span style="color:#0057ae">const</span> big_address <span style="color:#ca60ca">=</span> <span style="color:#b08000">0xFF80_0000_0000_0000</span>;
|
|
|
|
<span style="color:#0057ae">const</span> floating_point <span style="color:#ca60ca">=</span> <span style="color:#b08000">123.0E+77</span>;
|
|
<span style="color:#0057ae">const</span> another_float <span style="color:#ca60ca">=</span> <span style="color:#b08000">123.0</span>;
|
|
<span style="color:#0057ae">const</span> yet_another <span style="color:#ca60ca">=</span> <span style="color:#b08000">123.0e+77</span>;
|
|
|
|
<span style="color:#0057ae">const</span> hex_floating_point <span style="color:#ca60ca">=</span> <span style="color:#b08000">0x103.70p-5</span>;
|
|
<span style="color:#0057ae">const</span> another_hex_float <span style="color:#ca60ca">=</span> <span style="color:#b08000">0x103.70</span>;
|
|
<span style="color:#0057ae">const</span> yet_another_hex_float <span style="color:#ca60ca">=</span> <span style="color:#b08000">0x103.70P-5</span>;
|
|
|
|
<span style="color:#898887">// underscores may be placed between two digits as a visual separator</span>
|
|
<span style="color:#0057ae">const</span> lightspeed <span style="color:#ca60ca">=</span> <span style="color:#b08000">299_792_458.000_000</span>;
|
|
<span style="color:#0057ae">const</span> nanosecond <span style="color:#ca60ca">=</span> <span style="color:#b08000">0.000_000_001</span>;
|
|
<span style="color:#0057ae">const</span> more_hex <span style="color:#ca60ca">=</span> <span style="color:#b08000">0x1234_5678.9ABC_CDEFp-10</span>;
|
|
|
|
<span style="color:#0057ae">const</span> A <span style="color:#ca60ca">=</span> <span style="font-weight:bold">error</span>{One};
|
|
<span style="color:#0057ae">const</span> B <span style="color:#ca60ca">=</span> <span style="font-weight:bold">error</span>{Two};
|
|
(A <span style="color:#ca60ca">||</span> B) <span style="color:#ca60ca">==</span> <span style="font-weight:bold">error</span>{One<span style="color:#ca60ca">,</span> Two}
|
|
|
|
<span style="color:#0057ae">const</span> x<span style="color:#ca60ca">:</span> <span style="color:#0057ae">u32</span> <span style="color:#ca60ca">=</span> <span style="color:#b08000">1234</span>;
|
|
<span style="color:#0057ae">const</span> ptr <span style="color:#ca60ca">=</span> <span style="color:#ca60ca">&</span>x;
|
|
ptr<span style="color:#ca60ca">.*</span> <span style="color:#ca60ca">==</span> <span style="color:#b08000">1234</span>
|
|
|
|
<span style="color:#898887">// get the size of an array</span>
|
|
<span style="color:#0057ae">comptime</span> {
|
|
assert(message<span style="color:#ca60ca">.</span>len <span style="color:#ca60ca">==</span> <span style="color:#b08000">5</span>);
|
|
}
|
|
|
|
<span style="font-weight:bold">test</span> <span style="color:#bf0303">"iterate over an array"</span> {
|
|
<span style="color:#0057ae">var</span> sum<span style="color:#ca60ca">:</span> <span style="color:#0057ae">usize</span> <span style="color:#ca60ca">=</span> <span style="color:#b08000">0</span>;
|
|
<span style="font-weight:bold">for</span> (message) <span style="color:#ca60ca">|</span>byte<span style="color:#ca60ca">|</span> {
|
|
sum <span style="color:#ca60ca">+=</span> byte;
|
|
}
|
|
<span style="font-weight:bold">try</span> expect(sum <span style="color:#ca60ca">==</span> <span style="color:#924c9d">'h'</span> <span style="color:#ca60ca">+</span> <span style="color:#924c9d">'e'</span> <span style="color:#ca60ca">+</span> <span style="color:#924c9d">'l'</span> <span style="color:#ca60ca">*</span> <span style="color:#b08000">2</span> <span style="color:#ca60ca">+</span> <span style="color:#924c9d">'o'</span>);
|
|
}
|
|
|
|
<span style="color:#898887">// use compile-time code to initialize an array</span>
|
|
<span style="color:#0057ae">var</span> fancy_array <span style="color:#ca60ca">=</span> init<span style="color:#ca60ca">:</span> {
|
|
<span style="color:#0057ae">var</span> initial_value<span style="color:#ca60ca">:</span> [<span style="color:#b08000">10</span>]Point <span style="color:#ca60ca">=</span> <span style="color:#aa5500">undefined</span>;
|
|
<span style="font-weight:bold">for</span> (initial_value) <span style="color:#ca60ca">|*</span>pt<span style="color:#ca60ca">,</span> i<span style="color:#ca60ca">|</span> {
|
|
pt<span style="color:#ca60ca">.*</span> <span style="color:#ca60ca">=</span> Point{
|
|
<span style="color:#ca60ca">.</span>x <span style="color:#ca60ca">=</span> <span style="color:#644a9b;font-weight:bold">@intCast</span>(<span style="color:#0057ae">i32</span><span style="color:#ca60ca">,</span> i)<span style="color:#ca60ca">,</span>
|
|
<span style="color:#ca60ca">.</span>y <span style="color:#ca60ca">=</span> <span style="color:#644a9b;font-weight:bold">@intCast</span>(<span style="color:#0057ae">i32</span><span style="color:#ca60ca">,</span> i) <span style="color:#ca60ca">*</span> <span style="color:#b08000">2</span><span style="color:#ca60ca">,</span>
|
|
};
|
|
}
|
|
<span style="font-weight:bold">break</span> <span style="color:#ca60ca">:</span>init initial_value;
|
|
};
|
|
|
|
<span style="font-weight:bold">test</span> <span style="color:#bf0303">"switch on non-exhaustive enum"</span> {
|
|
<span style="font-weight:bold">try</span> expect(result);
|
|
<span style="color:#0057ae">const</span> is_one <span style="color:#ca60ca">=</span> <span style="font-weight:bold">switch</span> (number) {
|
|
<span style="color:#ca60ca">.</span>one <span style="color:#ca60ca">=></span> <span style="color:#aa5500">true</span><span style="color:#ca60ca">,</span>
|
|
<span style="font-weight:bold">else</span> <span style="color:#ca60ca">=></span> <span style="color:#aa5500">false</span><span style="color:#ca60ca">,</span>
|
|
};
|
|
<span style="font-weight:bold">try</span> expect(is_one);
|
|
|
|
<span style="color:#0057ae">const</span> array_ptr <span style="color:#ca60ca">=</span> array[<span style="color:#b08000">0</span><span style="color:#ca60ca">..</span>array<span style="color:#ca60ca">.</span>len];
|
|
|
|
<span style="font-weight:bold">if</span> (a <span style="color:#ca60ca">!=</span> b) {
|
|
<span style="font-weight:bold">try</span> expect(<span style="color:#aa5500">true</span>);
|
|
} <span style="font-weight:bold">else</span> <span style="font-weight:bold">if</span> (a <span style="color:#ca60ca">==</span> <span style="color:#b08000">9</span>) {
|
|
<span style="font-weight:bold">unreachable</span>;
|
|
} <span style="font-weight:bold">else</span> {
|
|
<span style="font-weight:bold">unreachable</span>;
|
|
}
|
|
}
|
|
|
|
<span style="font-weight:bold">fn</span> deferErrorExample(is_error<span style="color:#ca60ca">:</span> <span style="color:#0057ae">bool</span>) <span style="color:#ca60ca">!</span><span style="color:#0057ae">void</span> {
|
|
print(<span style="color:#bf0303">"</span><span style="color:#3daee9">\n</span><span style="color:#bf0303">start of function</span><span style="color:#3daee9">\n</span><span style="color:#bf0303">"</span><span style="color:#ca60ca">,</span> <span style="color:#ca60ca">.</span>{});
|
|
|
|
<span style="color:#898887">// This will always be executed on exit</span>
|
|
<span style="font-weight:bold">defer</span> {
|
|
print(<span style="color:#bf0303">"end of function</span><span style="color:#3daee9">\n</span><span style="color:#bf0303">"</span><span style="color:#ca60ca">,</span> <span style="color:#ca60ca">.</span>{});
|
|
}
|
|
|
|
<span style="font-weight:bold">errdefer</span> {
|
|
print(<span style="color:#bf0303">"encountered an error!</span><span style="color:#3daee9">\n</span><span style="color:#bf0303">"</span><span style="color:#ca60ca">,</span> <span style="color:#ca60ca">.</span>{});
|
|
}
|
|
}
|
|
|
|
<span style="font-weight:bold">pub</span> <span style="font-weight:bold">fn</span> syscall3(number<span style="color:#ca60ca">:</span> <span style="color:#0057ae">usize</span><span style="color:#ca60ca">,</span> arg1<span style="color:#ca60ca">:</span> <span style="color:#0057ae">usize</span><span style="color:#ca60ca">,</span> arg2<span style="color:#ca60ca">:</span> <span style="color:#0057ae">usize</span><span style="color:#ca60ca">,</span> arg3<span style="color:#ca60ca">:</span> <span style="color:#0057ae">usize</span>) <span style="color:#0057ae">usize</span> {
|
|
<span style="font-weight:bold">return</span> <span style="font-weight:bold">asm</span> <span style="color:#0057ae">volatile</span> (<span style="color:#bf0303">"syscall"</span>
|
|
<span style="color:#ca60ca">:</span> [ret] <span style="color:#bf0303">"={rax}"</span> (<span style="color:#ca60ca">-></span> <span style="color:#0057ae">usize</span>)
|
|
<span style="color:#ca60ca">:</span> [number] <span style="color:#bf0303">"{rax}"</span> (number)<span style="color:#ca60ca">,</span>
|
|
[arg1] <span style="color:#bf0303">"{rdi}"</span> (arg1)<span style="color:#ca60ca">,</span>
|
|
[arg2] <span style="color:#bf0303">"{rsi}"</span> (arg2)<span style="color:#ca60ca">,</span>
|
|
[arg3] <span style="color:#bf0303">"{rdx}"</span> (arg3)
|
|
<span style="color:#ca60ca">:</span> <span style="color:#bf0303">"rcx"</span><span style="color:#ca60ca">,</span> <span style="color:#bf0303">"r11"</span>
|
|
);
|
|
}
|
|
</pre></body></html>
|