рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рдпрд╣ рдкреЛрд╕реНрдЯ 15 рдорд╛рд░реНрдЪ 2018 рдХреЛ рд▓реЗрдЦрдХ рдХреЗ рдмреНрд▓реЙрдЧ рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реБрдИ рдереАред рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдХреЛрдИ рднрд╛рд╖рд╛ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддреА рд╣реИ, рдЙрд╕рдХрд╛ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡рд░реНрдгрд┐рдд рд╕рдм рдХреБрдЫ Zig 0.2.0 рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рднрд╛рд╖рд╛ рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг Zig 0.3.0 рд╣реИред
рдореИрдВрдиреЗ рдкреЛрд╕реНрдЯ рдХреЗ рд▓реЗрдЦрдХ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд┐рдпрд╛, рдФрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЬрд┐рдЧ 0.0.0 рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛
рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ! рдЪрд▓реЛ рдПрдХ Brainfuck рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рд┐рдЦреЗрдВ! "рдХреНрдпреЛрдВ?" "рдЖрдк рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред"
рдореИрдВ рдЗрд╕реЗ
рдЬрд╝рд┐рдЧ рдкрд░ рдХрд░реВрдВрдЧрд╛ред

рдЬрд┐рдЧ рд╣реИ ...
... рдПрдХ рдирдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ред рдпрд╣ рдЕрднреА рднреА рдмреАрдЯрд╛ рдореЗрдВ рд╣реИ рдФрд░ рддреЗрдЬреА рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ Zig рдХреЛрдб рджреЗрдЦрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХрд╛ рдХреЛрдб рдЖрдкрдХреЛ рдХреБрдЫ рдЕрд▓рдЧ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд▓рдЧ рд╣реИ! Zig 0.2.0 рдЕрднреА рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреБрдЫ рд╕рдкреНрддрд╛рд╣ рдкрд╣рд▓реЗ
LLVM 6 рдХреА рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдХрдИ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рднрд╛рд╖рд╛ рд╕реБрдзрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЕрдзрд┐рдХрддрд░, рдХрдИ "рдордВрддреНрд░" рдХреЛ рдХреАрд╡рд░реНрдб рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЧрд╣рди рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП
рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ!
Zig рдХреЛ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдкрд░, рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛рдУрдВ рдЬреИрд╕реЗ C, C ++, рдФрд░ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП
рдкрдардиреАрдп рдФрд░ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд╣рдЬ рдмрдирд╛рдпрд╛ рдЧрдпрд╛
рд╣реИ ред
рдХреЛрдб рдХреЛ Zig 0.2.0 рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рд╣реЛрдордмреЙрд╡ рд╕рд╣рд┐рдд
рд╡рд┐рднрд┐рдиреНрди рдЪреИрдирд▓реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрднреА рдЙрдкрд▓рдмреНрдз рд╣реИ, рдпрджрд┐ рдЖрдк OSX рдкрд░ рд╣реИрдВ: рдХрд╛рдврд╝рд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдмреНрд░реЗрдирдлрдХ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ,
рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВред рд╡рд╣рд╛рдБ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ
рдЯреНрдпреВрд░рд┐рдВрдЧ-рдкреВрд░реНрдг рднрд╛рд╖рд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рдкрд░
рдХреБрдЫ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдкрдиреЗ рдЕрдВрддрд┐рдо рдЙрддреНрдкрд╛рдж рдпрд╛ рдЖрд░рдВрднрд┐рдХ рдХрдорд┐рдЯ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ
рд╣реИрдВ , рддреЛ рдореИрдВрдиреЗ
рдпрд╣рд╛рдВ рдХреЛрдб рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИред
рдЬрд┐рдЧ рдПрдХ рд╕рдВрдХрд▓рд┐рдд рднрд╛рд╖рд╛ рд╣реИред рдЬрдм рдЖрдк рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд░рд┐рдгрд╛рдореА рдмрд╛рдЗрдирд░реА (рдпрджрд┐ рдЖрдк рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрд╛рдЗрдирд░реА рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд╣реАрдВ) рдореЗрдВ рдПрдХ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП ...
// main.zig fn main() void { }
... рдФрд░ рд╢реБрд░реВ ...
$ zig build-exe main.zig
... рдмрд╛рд╣рд░ рджреЗрддрд╛ рд╣реИ ...
/zig/std/special/bootstrap.zig:70:33: error: 'main' is private /zigfuck/main.zig:2:1: note: declared here
рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд╣рд░ рджрд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ...
// main.zig pub fn main() void { }
рдмреНрд░реЗрдирдлреИрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕реНрдореГрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ 30,000 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рджреЗрдВ, рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдКрдВрдЧрд╛ред
// main.zig pub fn main() void { const mem: [30000]u8; }
рдореИрдВ рдПрдХ рд╕реНрдерд┐рд░ (рдХреЙрдиреНрд╕реНрдЯреЗрдВрд╕) рдпрд╛ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ (var) рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдпрд╣рд╛рдБ, рдореИрдВрдиреЗ 30,000 рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд (рдпреВ) рдмрд╛рдЗрдЯреНрд╕ (8 рдмрд┐рдЯреНрд╕) рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрдо рдХреА рдШреЛрд╖рдгрд╛ рдХреАред
рдпрд╣ рд╕рдВрдХрд▓рди рдирд╣реАрдВ рд╣реИред
/main.zig:3:5: error: variables must be initialized
рдПрдХ рд╕рдорддреБрд▓реНрдп рд╕реА рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛: рдореИрдВ рдПрдХ рдЪрд░ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдШреЛрд╖рдгрд╛ рдХреЗ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬрд┐рдЧ рдореБрдЭреЗ рдПрдХ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕ рд╕рдордп рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдорд╛рди (рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд) рдХреЗ рд╕рд╛рде рдЪрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░реВрдБрдЧрд╛ред
// main.zig pub fn main() void { const mem: [30000]u8 = undefined; }
рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдЪрд░ рдХрд╛ рдкреНрд░рд╛рд░рдВрдн рд╕реНрдореГрддрд┐ рдореЗрдВ рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдпрд╣ C рдореЗрдВ рдПрдХ рдЕрдирдзрд┐рдХреГрдд рд░реВрдк рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдореЗрдореЛрд░реА рдХреЛ рдХреИрд╕реЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╢рд╛рдпрдж рдореИрдВ рдПрдХ рдЧрд╛рд░рдВрдЯреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╢реВрдиреНрдп рдпрд╛ рдХреБрдЫ рдордирдорд╛рдирд╛ рдореВрд▓реНрдп рд╡рд╣рд╛рдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
// main.zig pub fn main() void { const mem = []u8{0} ** 30000; }
рдпрд╣ рдЕрдЬреАрдм рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди ** рдСрдкрд░реЗрдЯрд░ рдХреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ 0 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ 30,000 рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ 30,000 рдЬреАрд░реЛ рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЕрдВрддрд┐рдо рдЖрд░рдВрднреАрдХрд░рдг рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рдСрдкрд░реЗрд╢рди рдПрдХ рдмрд╛рд░,
рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рд╣реЛрддрд╛ рд╣реИ ред compig Zig рдХреЗ рдорд╣рд╛рди рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдФрд░ рдореИрдВ рдЗрд╕рдореЗрдВ рд╕реЗ рдПрдХ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрдКрдВрдЧрд╛ред
рдЕрдм рдмреНрд░реЗрдирдлреИрдХ рдкрд░ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдкрд╛рдВрдЪ рдореЗрдореЛрд░реА рд╕реНрд▓реЙрдЯ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ!
pub fn main() void { const mem = []u8{0} ** 30000; const src = "+++++"; }
рдЬрд╝рд┐рдЧ рдореЗрдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрд╛рдЗрдЯ рд╕рд░рдгрд┐рдпрд╛рдБ рд╣реИрдВред рдореБрдЭреЗ src рдХреЛ рдмрд╛рдЗрдЯ рдРрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИред рдпрд╣ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ:
const src: [5]u8 = "+++++";
рдпрд╣ рдареАрдХ рд╕рдВрдХрд▓рди рдХрд░реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣:
const src: [6]u8= "+++++";
рдирд╣реАрдВ рд╣реЛрдЧрд╛
main.zig:5:22: error: expected type '[6]u8', found '[5]u8'
рдПрдХ рдФрд░ рдзреНрдпрд╛рди рджреЗрдВ: рдЪреВрдВрдХрд┐ рддрд╛рд░ рд╕рд┐рд░реНрдл рд╕рд░рдгрд┐рдпрд╛рдБ рд╣реИрдВ, рд╡реЗ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк рдПрдХ рд╢реВрдиреНрдп-рд╕рдорд╛рдкреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реА рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
c"Hello I am a null terminated string";
рдЖрдо рдЕрдЪреНрдЫреЗ рдХреЗ рд▓рд┐рдП ...
рдореИрдВ рд╣рд░ рдХрд┐рд░рджрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ
рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдпрд╣ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ! Main.zig рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реВрдВ:
const warn = @import("std").debug.warn;
рдЖрдпрд╛рдд , рд╡рд╕реНрддреБрддрдГ @ рдЪрд┐рд╣реНрди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рдм рдХреБрдЫ, рдПрдХ
рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдВрдХрд▓рдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ ред рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛рдПрдБ рд╣рдореЗрд╢рд╛ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдпрд╣рд╛рдВ рдЖрдпрд╛рдд рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рдорд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдЖрдк рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ рдЦреБрджрд╛рдИ рдХрд░рдХреЗ рдФрд░ рдХрд┐рд╕реА рднреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рдЪрд░ рд╕реЗ рдЗрд╕реЗ рдирд┐рдХрд╛рд▓рдХрд░ рдХреБрдЫ рднреА рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рд╕реАрдзреЗ рдЪреЗрддрд╛рд╡рдиреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдЕрдЪрд╛рдирдХ рдЕрд╕рд╛рдЗрди рдХрд░рддрд╛ рд╣реВрдВ, рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдХреЛред рдЕрдм рдЙрд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╣реИ: рд╣рдо рд╕реАрдзреЗ std рдирд╛рдо рд╕реНрдерд╛рди рд╕реЗ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдпрд╛ рддреЛ std.debug.warn () рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕реЗ рдЪреЗрддрд╛рд╡рдиреА рдЪрд░ рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
const std = @import("std"); const warn = std.debug.warn;
const warn = @import("std").debug.warn; // main.zig pub fn main() void { const mem = []u8{0} ** 30000; const src = "+++++"; for (src) |c| { warn("{}", c); } }
рдбрд┐рдмрдЧрд┐рдВрдЧ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, рдореИрдВ рд╕рд┐рд░реНрдл рд╕реНрдХреНрд░реАрди рдкрд░ рдХреБрдЫ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред Zig
рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рд╣реИ , рдФрд░ stdout рднреА рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рд╣реИред рдореИрдВ рдЕрднреА рдпрд╣ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рд╕реАрдзреЗ рдЪреЗрддрд╛рд╡рдиреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯрд╛рдбрд░ рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдерд╛ред
рдЪреЗрддрд╛рд╡рдиреА рд╕реНрд╡рд░реВрдкрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ C рдореЗрдВ Printf! рдКрдкрд░ рдХрд╛ рдХреЛрдб рдкреНрд░рд┐рдВрдЯ рд╣реЛрдЧрд╛:
4343434343
43 рдПрд╕рд╕реАрдЖрдИ рд╡рд░реНрдг рдХреЛрдб + рд╣реИред рдореИрдВ рднреА рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ:
warn("{c}", c);
рдФрд░:
+++++
рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдореЗрдореЛрд░реА рд╕реНрдкреЗрд╕ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛, рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрд╛ред рдЕрдм рд╣рдо рднрд╛рд╖рд╛ рдХреЛ рд╣реА рд╕рд╛рдХрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ + рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛, рдФрд░ рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рд▓реВрдк рдХреЗ рд╢рд░реАрд░ рдХреЛ рдмрджрд▓реВрдВрдЧрд╛:
for (src) |c| { switch(c) { '+' => mem[0] += 1 } }
рдореБрдЭреЗ рджреЛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓реАрдВ:
/main.zig:10:7: error: switch must handle all possibilities switch(c) { ^ /main.zig:11:25: error: cannot assign to constant '+' => mem[0] += 1 ^
рдмреЗрд╢рдХ, рдореИрдВ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдирдпрд╛ рдорд╛рди рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛, рдЬреЛ рдПрдХ рд╕реНрдерд┐рд░ рд╣реИ! рдореЗрдо рдХреЛ рдПрдХ рдЪрд░ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ ...
var mem = []u8{0} ** 30000;
рдЕрдиреНрдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рддрд░рд╣, рдореЗрд░реЗ
рд╕реНрд╡рд┐рдЪ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрджрд┐ рдЪрд░рд┐рддреНрд░ рдирд╣реАрдВ рд╣реИ рддреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдПрдХ рдЦрд╛рд▓реА рдмреНрд▓реЙрдХ рд╕реЗ рднрд░рддрд╛ рд╣реВрдВ:
for (src) |c| { switch(c) { '+' => mem[0] += 1, else => {} } }
рдЕрдм рдореИрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЕрдВрдд рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ:
const warn = @import("std").debug.warn; pub fn main() void { var mem = []u8{0} ** 30000; const src = "+++++"; for (src) |c| { switch(c) { '+' => mem[0] += 1, else => {} } } warn("{}", mem[0]); }
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЙрдореНрдореАрдж рдХреА рдереА, рдореБрдЭреЗ рдирдВрдмрд░ 5 рдореЗрдВ рдорд┐рд▓рд╛ рд╣реБрдЖ рд╣реИред
рдЪрд▓реЛ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ ...
рдЗрд╕реА рддрд░рд╣, рд╣рдо рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред
switch(c) { '+' => mem[0] += 1, '-' => mem[0] -= 1, else => {} }
> рдФрд░ <рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЙрд╕ рдореЗрдореЛрд░реА рдореЗрдВ "рдкреЙрдЗрдВрдЯрд░" рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмреНрд░реЗрдирдлрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдерд╛ред
var memptr: u16 = 0;
рдЪреВрдВрдХрд┐ рдПрдХ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд 16-рдмрд┐рдЯ рдЕрдзрд┐рдХрддрдо 65535 рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдкрддрд╛ рд╕реНрдерд╛рди рдХреЗ 30,000 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, 15 рдмрд┐рдЯреНрд╕ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдВрдЧреЗ, рдЬреЛ рд╣рдореЗрдВ 32767 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред Zig рд╡рд┐рднрд┐рдиреНрди рдЪреМрдбрд╝рд╛рдИ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди u15 рдЕрднреА рддрдХ рдирд╣реАрдВред
рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
const u15 = @IntType(false, 15):
рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ рдХрд┐ рдХреЛрдИ рднреА [iu] \ d + рдкреНрд░рдХрд╛рд░ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреНрдп рд╣реЛред
рдЕрдм рдореЗрдо [0] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдЗрд╕ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
'+' => mem[memptr] += 1, '-' => mem[memptr] -= 1,
<рдФрд░> рдмрд╕ рдЗрд╕ рд╕реВрдЪрдХ рдХреЛ рдмрдврд╝рд╛рдПрдБ рдФрд░ рдШрдЯрд╛рдПрдБред
'>' => memptr += 1, '<' => memptr -= 1,
рдЕрджреНрднреБрддред рд╣рдо рдЕрдм рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ!
1,2,3 рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ
рдЬрд┐рдЧ рдореЗрдВ рдмрд┐рд▓реНрдЯ-рдЗрди рдЯреЗрд╕реНрдЯ рдЗрдВрдЬрди рд╣реИред рдХрд╣реАрдВ рднреА рдХрд┐рд╕реА рднреА рдлрд╛рдЗрд▓ рдореЗрдВ рдореИрдВ рдПрдХ рдЯреЗрд╕реНрдЯ рдмреНрд▓реЙрдХ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ:
test "Name of Test" { // test code }
рдФрд░ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рдЯреЗрд╕реНрдЯ рд░рди рдХрд░реЗрдВ: zig test $ FILENAMEред рдмрд╛рдХреА рдкрд░реАрдХреНрд╖рдг рдмреНрд▓реЙрдХ рдирд┐рдпрдорд┐рдд рдХреЛрдб рдХреЗ рд╕рдорд╛рди рд╣реИрдВред
рдЖрдЗрдП рдЗрд╕реЗ рджреЗрдЦреЗрдВ:
// test.zig test "testing tests" {} zig test test.zig Test 1/1 testing tests...OK
рдмреЗрд╢рдХ, рдПрдХ рдЦрд╛рд▓реА рдкрд░реАрдХреНрд╖рдг рдмреЗрдХрд╛рд░ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
const assert = @import("std").debug.assert; test "test true" { assert(true); } test "test false" { assert(false); }
zig test test.zig "thing.zig" 10L, 127C written :!zig test thing.zig Test 1/2 test true...OK Test 2/2 test false...assertion failure [37;1m_panic.7 [0m: [2m0x0000000105260f34 in ??? (???) [0m [37;1m_panic [0m: [2m0x0000000105260d6b in ??? (???) [0m [37;1m_assert [0m: [2m0x0000000105260619 in ??? (???) [0m [37;1m_test false [0m: [2m0x0000000105260cfb in ??? (???) [0m [37;1m_main.0 [0m: [2m0x00000001052695ea in ??? (???) [0m [37;1m_callMain [0m: [2m0x0000000105269379 in ??? (???) [0m [37;1m_callMainWithArgs [0m: [2m0x00000001052692f9 in ??? (???) [0m [37;1m_main [0m: [2m0x0000000105269184 in ??? (???) [0m [37;1m??? [0m: [2m0x00007fff5c75c115 in ??? (???) [0m [37;1m??? [0m: [2m0x0000000000000001 in ??? (???) [0m
рдкрд░реАрдХреНрд╖рдг рдЧрд┐рд░ рдЧрдпрд╛ред рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдЖрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
./zig-cache/test
рдЦрд╕рдЦрд╕ рдкрд░ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдЕрднреА рднреА рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЕрдзреАрди рд╣реИредрдЗрд╕реЗ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЗрд╕реЗ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рддреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕рдХреА рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВ:
fn bf(src: []const u8, mem: [30000]u8) void { var memptr: u16 = 0; for (src) |c| { switch(c) { '+' => mem[memptr] += 1, '-' => mem[memptr] -= 1, '>' => memptr += 1, '<' => memptr -= 1, else => {} } } } pub fn main() void { var mem = []u8{0} ** 30000; const src = "+++++"; bf(src, mem); }
рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣реИ рдирд╛?
рд▓реЗрдХрд┐рди ...
/main.zig:1:29: error: type '[30000]u8' is not copyable; cannot pass by value
рдпрд╣ https://github.com/zig-lang/zig/issues/733 рдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИред
Zig рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдЦреНрдд рд╣реИред рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░, рдФрд░ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ рдЖрдХрд╛рд░ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдореВрд▓реНрдп рд╕реЗ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕реНрдЯреИрдХ рдЖрд╡рдВрдЯрди рдХреЛ рдЕрдиреБрдорд╛рдирд┐рдд рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдирдХрд▓ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреА рдЖрд╡рдВрдЯрди рд░рдгрдиреАрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рднрд╛рд╖рд╛ рд╕реНрд╡рдпрдВ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреА рд╣реИред
рдЗрд╕ рд╕реАрдорд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛ рдкреНрд░рд╛рдХреГрддрд┐рдХ рддрд░реАрдХрд╛ рдореВрд▓реНрдп рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реИ (рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдкрд╛рд╕)ред рдЬрд╝рд┐рдЧ рдПрдХ рдЕрд▓рдЧ рд░рдгрдиреАрддрд┐, рд╕реНрд▓рд╛рдЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдПрдХ рд╕реВрдЪрдХ рд╣реИ рдЬрд┐рд╕рдХреА рд▓рдВрдмрд╛рдИ рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИ рдФрд░ рд╕реАрдорд╛рдУрдВ рдореЗрдВ рдЧрд┐рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреЗрдХ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
fn bf(src: []const u8, mem: []u8) void { ... }
рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
bf(src, mem[0..mem.len]);
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВрдиреЗ рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдХреЗ рдКрдкрд░реА рд╕реАрдорд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдВрдХреЗрддрди рд╣реИ:
bf(src, mem[0..]);
рдЕрдм рдореИрдВ рд╕реАрдзреЗ рдмреАрдПрдл () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВ рдЕрднреА рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдЬреЛрдбрд╝реВрдВрдЧрд╛ ...
test "+" { var mem = []u8{0}; const src = "+++"; bf(src, mem[0..]); assert(mem[0] == 3); }
рдореИрдВ рдПрдХ рдмрд╛рдЗрдЯ рд╕реЗ рдореЗрдо рд╕рд░рдгреА рд▓реЗрддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ рдЬрд╛рдВрдЪрддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рддреАрди рдмрд╛рд░ рдмрд╛рдЗрдЯ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ)ред рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!
Test 1/1 +...OK
"-" рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ:
test "-" { var mem = []u8{0}; const src = "---"; bf(src, mem[0..]); assert(mem[0] == 253); }
рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ! рдЬрдм рдореИрдВ 0 рд╕реЗ 1 рдХреЛ рдШрдЯрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдорд┐рд▓рддрд╛ рд╣реИ ...
Test 2/2 -...integer overflow
рдореЗрдо рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ, рдФрд░ 0 рд╕реЗ 1 рдШрдЯрд╛рдирд╛ рдПрдХ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рдлрд┐рд░ рд╕реЗ, рдЬрд┐рдЧ рдореБрдЭреЗ рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдРрд╕рд╛ рд╣реЛ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо
рдореЙрдбреНрдпреВрд▓рд░ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ,
рдорд╕реНрддрд┐рд╖реНрдХ рдХреЗ
рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░ ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ 0 рдирдВрдмрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрд▓ рдШрдЯрдиреЗ рд╕реЗ рдореБрдЭреЗ 255 рдорд┐рд▓реЗрдЧрд╛, рдФрд░ 255 рдХрд╛ рдЗрдВрдХреНрд░реАрдореЗрдВрдЯ рдореБрдЭреЗ 0 рджреЗрдЧрд╛ред
рдЬрд╝рд┐рдЧ рдХреЗ рдкрд╛рд╕ рдХрдИ рд╕рд╣рд╛рдпрдХ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрд╢рди рд╣реИрдВ рдЬреЛ
рдЧрд╛рд░рдВрдЯреАрдХреГрдд "рд░реИрдкрд┐рдВрдЧ" рдХреЗ
рд╢рдмреНрджрд╛рд░реНрде рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддреЗ рд╣реИрдВред
'+' => mem[memptr] +%= 1, '-' => mem[memptr] -%= 1,
рдпрд╣ рд╕рдВрдкреВрд░реНрдг рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд╣реА рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЙрдореНрдореАрдж рдереАред
<рдФрд░> рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдЫреЛрдЯреЗ рд╕рд░рдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдмрдврд╝реЗ рд╣реБрдП рд╕реЗрд▓ рдХреЗ рдореВрд▓реНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реВрдВ:
test ">" { var mem = []u8{0} ** 5; const src = ">>>+++"; bf(src, mem[0..]); assert(mem[3] == 3); }
рдФрд░ ...
test "<" { var mem = []u8{0} ** 5; const src = ">>>+++<++<+"; bf(src, mem[0..]); assert(mem[3] == 3); assert(mem[2] == 2); assert(mem[1] == 1); }
рдмрд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рд╕реАрдзреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдереИрддрд┐рдХ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ ...
const mem = std.mem;
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА std рдЖрдпрд╛рдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рдЗрд╕ рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ рдореЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:
test "<" { var storage = []u8{0} ** 5; const src = ">>>+++<++<+"; bf(src, storage[0..]); assert(mem.eql(u8, storage, []u8{ 0, 1, 2, 3, 0 })); }
... рдФрд░ рдпрд╛рдж рд░рдЦреЗрдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ, рдпреЗ рд╕рд┐рд░реНрдл u8 рд╕рд░рдгрд┐рдпрд╛рдВ рд╣реИрдВ рдЬрд┐рдЧ рдореЗрдВ, рдФрд░ рдореИрдВ рдЙрдирдореЗрдВ рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рд╢рд╛рдмреНрджрд┐рдХ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реВрдВ, рдЕрд░реНрдерд╛рддреНред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛!
assert(mem.eql(u8, storage, "\x00\x01\x02\x03\x00"));
"рдЬреЛрдбрд╝реЗрдВ!" рдпрд╣ рдХреЗрд╡рд▓ рдЙрд╕ рдХрдХреНрд╖ рдореЗрдВ рдПрдХ рдмрд╛рдЗрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реВрдЪрдХ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЕрдм рдЪреЗрддрд╛рд╡рдиреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдореИрдВ рдЗрд╕реЗ рд╕реНрдЯрдбрдЖрдЙрдЯ рд╕реЗ рдмрджрд▓ рджреВрдВрдЧрд╛ред рдпрд╣ рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреБрдЫ рд╣рдж рддрдХ рдЙрд▓рдЭрди рдореЗрдВ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдХрд░реВрдВрдЧрд╛!
'.' => warn("{c}", storage[memptr]),
рдЪрдХреНрд░
[рдФрд░] - рдпрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдЬрд╛рджреВ ...ред
[- рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдХрд╛ рдорд╛рди рд╢реВрдиреНрдп рд╣реИ, рддреЛ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рд╕рдорд╛рдкрди рдмреНрд░реИрдХреЗрдЯ рдореЗрдВ рдХрджрдо рдЫреЛрдбрд╝реЗрдВред
] - рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдХрд╛ рдорд╛рди рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдУрдкрдирд┐рдВрдЧ рдмреНрд░реИрдХреЗрдЯ рдореЗрдВ рд▓реМрдЯреЗрдВ рдФрд░ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред
рдЗрд╕ рдмрд╛рд░ рдореИрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд░реВрдВрдЧрд╛ (рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕рдХрд╛ рдЕрд▓рдЧ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ)ред рдкрд╣рд▓рд╛ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ - рд╕реНрдЯреЛрд░реЗрдЬ [2] рд╕реЗрд▓ рдЦрд╛рд▓реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд▓реВрдк рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдмрдврд╝рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
test "[] skips execution and exits" { var storage = []u8{0} ** 3; const src = "+++++>[>+++++<-]"; bf(src, storage[0..]); assert(storage[0] == 5); assert(storage[1] == 0); assert(storage[2] == 0); }
рдФрд░ рдореИрдВ рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдмрдирд╛рдКрдВрдЧрд╛:
'[' => if (storage[memptr] == 0) { }, ']' => if (storage[memptr] == 0) { },
рдЕрдм рдХреНрдпрд╛ рдХрд░реЗрдВ? рдЖрдк рдПрдХ рднреЛрд▓реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЕрднреА рддрдХ src рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реВрдВ рдЬрдм рддрдХ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓ рдЬрд╛рддрд╛]ред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП zig рдореЗрдВ рд▓реВрдк рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдпрд╣ рдХреЗрд╡рд▓ рдЙрдирдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдпрд╛рдж рдХрд┐рдП рдмрд┐рдирд╛, рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдХ рдЙрдкрдпреБрдХреНрдд рдирд┐рд░реНрдорд╛рдг рдпрд╣рд╛рдБ рд╣реИ:
рдпрд╣ рдерд╛:
var memptr: u16 = 0; for (src) |c| { switch(c) { ... } }
рдмрди рдЧрдпрд╛ ...
var memptr: u16 = 0; var srcptr: u16 = 0; while (srcptr < src.len) { switch(src[srcptr]) { ... } srcptr += 1; }
рдЕрдм рдореИрдВ рдмреНрд▓реЙрдХ рдХреЗ рдмреАрдЪ рдореЗрдВ srcptr рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдкреБрди: рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдореИрдВ рдпрд╣ рдХрд░реВрдВрдЧрд╛:
'[' => if (storage[memptr] == 0) { while (src[srcptr] != ']') srcptr += 1; },
рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ "[] рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ"
рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ "[рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХ рджреЗрддрд╛ рд╣реИ рдФрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ", рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗред
рдХреЛрд╖реНрдардХ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
test "[] executes and exits" { var storage = []u8{0} ** 2; const src = "+++++[>+++++<-]"; bf(src, storage[0..]); assert(storage[0] == 0); assert(storage[1] == 25); } ']' => if (storage[memptr] != 0) { while (src[srcptr] != '[') srcptr -= 1; },
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ ... рджреЛ рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рде рдПрдХ рднреЛрд▓реЗ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдПрдХ рдШрд╛рддрдХ рджреЛрд╖ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рдЫреЛрд░реЛрдВ рдкрд░ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
++>[>++[-]++<-]
рдкрд░рд┐рдгрд╛рдо {2, 0} рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдкрд╣рд▓рд╛ рдЦреБрд▓рд╛ рдмреНрд░реИрдХреЗрдЯ рдХреЗрд╡рд▓ рдмреЗрд╡рдХреВрдлреА рд╕реЗ рдкрд╣рд▓реЗ рд╕рдорд╛рдкрди рдмреНрд░реИрдХреЗрдЯ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рдм рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреЗ рд╕рдорд╛рди рдЕрдЧрд▓реЗ рд╕рдорд╛рдкрди рдмреНрд░реИрдХреЗрдЯ рдореЗрдВ рдХреВрджрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдЧрд╣рд░рд╛рдИ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдЗрд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕реЗ рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ:
'[' => if (storage[memptr] == 0) { var depth:u16 = 1; srcptr += 1; while (depth > 0) { srcptr += 1; switch(src[srcptr]) { '[' => depth += 1, ']' => depth -= 1, else => {} } } }, ']' => if (storage[memptr] != 0) { var depth:u16 = 1; srcptr -= 1; while (depth > 0) { srcptr -= 1; switch(src[srcptr]) { '[' => depth -= 1, ']' => depth += 1, else => {} } } },
рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдкрд░реАрдХреНрд╖рдг: рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рджреЛрдиреЛрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ src рдореЗрдВ рдПрдХ рдЖрдВрддрд░рд┐рдХ рд▓реВрдк рд╢рд╛рдорд┐рд▓ рд╣реИред
test "[] skips execution with internal braces and exits" { var storage = []u8{0} ** 2; const src = "++>[>++[-]++<-]"; try bf(src, storage[0..]); assert(storage[0] == 2); assert(storage[1] == 0); } test "[] executes with internal braces and exits" { var storage = []u8{0} ** 2; const src = "++[>++[-]++<-]"; try bf(src, storage[0..]); assert(storage[0] == 0); assert(storage[1] == 2); }
рдЕрд▓рдЧ рд╕реЗ, рдзреНрдпрд╛рди рджреЗрдВ [-] - рдмреНрд░реЗрдирдлрдХ рдХрд╛ рдореБрд╣рд╛рд╡рд░рд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "рдЗрд╕ рд╕реЗрд▓ рдХреЛ рд╢реВрдиреНрдп рдХрд░реЗрдВред" рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рд╕реЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреНрдпрд╛ рдореВрд▓реНрдп рдерд╛, рдЗрд╕реЗ 0 рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рддрдХ рдШрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдлрд┐рд░ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛ред
рдЕрд╢реБрдн рдорд╛рд░реНрдЧ
рдореИрдВрдиреЗ рдЗрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдХрд┐ рдмреАрдПрдл рдкрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдореИрдВ рдЕрдкрдиреЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рдЧрд▓рдд рдЗрдирдкреБрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╕ [рдПрдХ рдмрдВрдж рдмреНрд░реИрдХреЗрдЯ рдХреЗ рдмрд┐рдирд╛, рдпрд╛ <, рдЬреЛ рддреБрд░рдВрдд рдореЗрдореЛрд░реА рдПрд░реЗ рд╕реЗ рдЖрдЧреЗ рдирд┐рдХрд▓ рдЬрд╛рддрд╛ рд╣реИ? (рдореИрдВ рдореЗрдореЛрд░реА рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд▓рдкреЗрдЯ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдирд╛ тАЛтАЛрдмреЗрд╣рддрд░ рд╣реИ)ред
рдореИрдВ рдереЛрдбрд╝рд╛ рдЖрдЧреЗ рджреЗрдЦрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдХреЛрдб рдХреЗ рд╕рднреА рдЕрдВрддрд░реЛрдВ рдХреЛ рд╕рдордЭрд╛рдКрдВрдЧрд╛ред рдореИрдВ bf рджреБрднрд╛рд╖рд┐рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбрд╛рд▓реВрдБрдЧрд╛ рдФрд░ рдЕрдкрдиреЗ рдЫреЛрдЯреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рднреА рдЪрд╛рд╣рдирд╛ рдФрд░ рдЪрд╛рд╣рдиреЗ рд╡рд╛рд▓реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реВрдБред
const warn = @import("std").debug.warn; const sub = @import("std").math.sub; fn seekBack(src: []const u8, srcptr: u16) !u16 { var depth:u16 = 1; var ptr: u16 = srcptr; while (depth > 0) { ptr = sub(u16, ptr, 1) catch return error.OutOfBounds; switch(src[ptr]) { '[' => depth -= 1, ']' => depth += 1, else => {} } } return ptr; } fn seekForward(src: []const u8, srcptr: u16) !u16 { var depth:u16 = 1; var ptr: u16 = srcptr; while (depth > 0) { ptr += 1; if (ptr >= src.len) return error.OutOfBounds; switch(src[ptr]) { '[' => depth += 1, ']' => depth -= 1, else => {} } } return ptr; } pub fn bf(src: []const u8, storage: []u8) !void { var memptr: u16 = 0; var srcptr: u16 = 0; while (srcptr < src.len) { switch(src[srcptr]) { '+' => storage[memptr] +%= 1, '-' => storage[memptr] -%= 1, '>' => memptr += 1, '<' => memptr -= 1, '[' => if (storage[memptr] == 0) srcptr = try seekForward(src, srcptr), ']' => if (storage[memptr] != 0) srcptr = try seekBack(src, srcptr), '.' => warn("{c}", storage[memptr]), else => {} } srcptr += 1; } }
рдпрд╣ рд╕реНрд╡рд┐рдЪ рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЪрд╛рд╣рдиреЗ рд╡рд╛рд▓реЗ рдФрд░ рдЪрд╛рд╣рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рд╕рдорд╛рди рджрд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рдЕрдзрд┐рдХ рдФрд░ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЛрднрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рд╡реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВред рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рднреАред рдХреЙрдкреА рдХрд░рдиреЗ рдФрд░ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди, рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рдмрд╛рдж рдореЗрдВ, рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рд╕рдВрднрд╡рддрдГ рдмрд╛рдж рдХреА рдкреЛрд╕реНрдЯ рдореЗрдВ, рдЪрд╛рд╣рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░реВрдВрдЧрд╛ред
рдореИрдВрдиреЗ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рддреЗрдВ рдЬреЛрдбрд╝реАрдВ! рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рднреА рддреАрди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЕрдм рдПрдХ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯ рд░рд╣реЗ рд╣реИрдВ! .. рдпрд╣ рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ рдЬреЛ рдЯрд╛рдЗрдк% T (рддреНрд░реБрдЯрд┐ рд╕рдВрдШ) рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рдореИрдВ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╛ рддреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЛ рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИ, рдпрд╛ рдХреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
const x = functionCall() catch {}
рдЬрд╣рд╛рдВ рдореИрдВ рдХреИрдЪ рдмреНрд▓реЙрдХ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реВрдВред рдЬреИрд╕рд╛ рдХрд┐ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдкрдХрдбрд╝ рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдХреЛ рдирд┐рдЧрд▓ рд╕рдХрддреА рд╣реИред рдпрд╣ рдмреБрд░рд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЬрд┐рдЧ рд╣рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдореИрдВ рдПрдХ рдЦрд╛рд▓реА рдмреНрд▓реЙрдХ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкрдХрдбрд╝рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╛ рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдпрд╛ рдореБрдЭреЗ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ TODO рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рднреА рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ!
const x = functionCall() catch { @panic("TODO") }
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдореЗрдВ рдХрднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдореИрдВ рд╕рдВрдХрд▓рдХ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ, рддреЛ рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
рддреЛ рдореБрдЭреЗ рд╕реАрдХрдмреИрдХ рдпрд╛ рд╕реАрдХрд╡рд░реНрдб рд╕реЗ рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╡рд╛рдкрд╕ рдЖрдиреА рдЪрд╛рд╣рд┐рдП?
рддрд▓рд╛рд╢ рдореЗрдВ:
ptr = sub(u16, ptr, 1) catch return error.OutOfBounds;
рдореИрдВрдиреЗ std lib рдХреЗ рдЙрдк рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдХреНрд░рд┐рдореЗрдВрдЯ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛, рдЬреЛ рдУрд╡рд░рдлреНрд▓реЛ рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдЙрдЯрдСрдлрдмрд╛рдЙрдВрдб рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕реЗ рдореИрдВ рд╕рд┐рд░реНрдл рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рддрд╛ рд╣реВрдВред
рддреНрд░реБрдЯрд┐рдпрд╛рдБ Zig рдореВрд▓ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ред рд╡реЗ рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕реНрд╡рд┐рдЪ рдмреНрд▓реЙрдХ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВ рдпрд╣рд╛рдВ рдЖрдЙрдЯрдСрдлрдмрд╛рдЙрдВрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐, рд╢рдмреНрджрд╛рд░реНрде, рдпрджрд┐ рдореЗрдореЛрд░реА рдкреЙрдЗрдВрдЯрд░ рд╢реВрдиреНрдп рд╕реЗ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рд░рдирдЯрд╛рдЗрдо рдХреЛ рдЙрд╕ рдореЗрдореЛрд░реА рд╕реНрдкреЗрд╕ рд╕реЗ рдкрд░реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдерд╛ред
рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЪрд╛рд╣рдиреЗ рд╡рд╛рд▓реЗ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ:
if (ptr >= src.len) return error.OutOfBounds;
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрджрд┐ рд╕реВрдЪрдХ src.len рд╕реЗ рдмрдбрд╝рд╛ рд╣реИ, рддреЛ рдореИрдВ рдпрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рдкрдХрдбрд╝рддрд╛ рд╣реВрдВ рдФрд░ рдЙрд╕реА рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реВрдВред
рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп:
'[' => if (storage[memptr] == 0) srcptr = try seekForward(src, srcptr), ']' => if (storage[memptr] != 0) srcptr = try seekBack(src, srcptr),
рдореИрдВ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВред рдпрджрд┐ рдЙрдиреНрд╣реЗрдВ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд░рд┐рдЯрд░реНрди srcptr рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдпрджрд┐ рд╡реЗ рдЕрд╕рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдХреЙрд▓ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд╕рдВрдкреВрд░реНрдг рдлрд╝рдВрдХреНрд╢рди bf рдореЗрдВ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред
рдХреЙрд▓ рдореБрдЦреНрдп рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ!
const bf = @import("./bf.zig").bf; // yes, hello const hello_world = "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>."; pub fn main() void { storage = []u8{0} ** 30000; bf(hello_world, storage[0..]) catch {}; }
рдореИрдВ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдпрд╣рд╛рдБ рдирд┐рдЧрд▓рддрд╛ рд╣реВрдБ, рдФрд░ рдпрд╣ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВрдЧреЗ рдХрд┐ рдЬрд┐рдЧ рдХрд┐рддрдиреА рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЙрд▓ рдХреЛ рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдХреЛрд╢рд┐рд╢ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╣рдореЗрд╢рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рднрд▓реЗ рд╣реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдП!
рдирдпрд╛ рдкреНрд░рдпрд╛рд╕ / рдХреИрдЪ рд╕рд┐рдВрдЯреИрдХреНрд╕, %% рдФрд░% рдЬреИрд╕реЗ рдХрдИ рдордВрддреНрд░реЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд▓реЛрдЧ рдЗрддрдирд╛ рдирд╛рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред
рдЕрдм рдореИрдВрдиреЗ 8 рдореЗрдВ рд╕реЗ 7 рдмреНрд░реЗрдирдлреБрдХ рд╡рд░реНрдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ "рд╕рд╛рд░реНрдердХ" рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдПрдХ рд╕рд╛рд░реНрдердХ рдХрд╛рд░реНрдпрдХреНрд░рдо
рдпрд╣рд╛рдБ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ:
// , const fib = "++++++++++++++++++++++++++++++++++++++++++++>++++++++++++++++++++++++++++++++>++++++++++++++++>>+<<[>>>>++++++++++<<[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>[<+>-]>[-]>>>++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]>>[++++++++++++++++++++++++++++++++++++++++++++++++.[-]]<[++++++++++++++++++++++++++++++++++++++++++++++++.[-]]<<<++++++++++++++++++++++++++++++++++++++++++++++++.[-]<<<<<<<.>.>>[>>+<<-]>[>+<<+>-]>[<+>-]<<<-]<<++...";
рдЪрд▓рд┐рдП ...
pub fn main() void { storage = []u8{0} ** 30000; bf(fib, storage[0..]) catch {}; }
рджреЗрдЦрд╛!
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 121, 98, 219,
80 рдХреЗ рджрд╢рдХ рдореЗрдВ рдкреАрдмреАрдПрд╕ (рдкрдмреНрд▓рд┐рдХ рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯрд┐рдВрдЧ рд╕рд░реНрд╡рд┐рд╕, рдПрдХ рдЕрдореЗрд░рд┐рдХрди рдиреЙрди-рдХрдорд░реНрд╢рд┐рдпрд▓ рдЯреЗрд▓реАрд╡рд┐рдЬрд╝рди рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯрд┐рдВрдЧ рд╕рд░реНрд╡рд┐рд╕) рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдЪрд▓рдиреЗ рдкрд░ рдореБрдЭреЗ рдПрдХ рд╕реНрдореГрддрд┐ рд╣рд░ рдмрд╛рд░ рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд╛рдкрд╕ рдЖрддреА рд╣реИред рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдЗрд╕реЗ рднреБрд▓рд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди Youtube рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдЪреАрдЬ рд╣реИ ред
рдореИрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕реБрдзрд╛рд░ рд╕рдХрддрд╛ рд╣реВрдВ?
рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХреБрдЫ TODO рдкрд░ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рд╣реИред рдореБрдЭреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП stderr рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдореИрдВ рд╕реНрдЯрдбрдЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рд╣рд░ рдмрд╛рд░ рдЬрдм рдореИрдВ рджреБрднрд╛рд╖рд┐рдпрд╛ рдЦреЛрд▓рддрд╛ рд╣реВрдВ, рдореИрдВ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╕реНрдЯреНрд░реАрдордЖрдЙрдЯ рдореЗрдВ рдЦреЛрд▓рддрд╛ рд╣реВрдВ рдФрд░ рдЙрд╕рдореЗрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реВрдВ:
const io = std.io; ... pub fn bf(src: []const u8, storage: []u8) !void { const stdout = &(io.FileOutStream.init(&(io.getStdOut() catch unreachable)).stream); ... '.' => stdout.print("{c}", storage[memptr]) catch unreachable, ...
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ?
рдореИрдВ io.getStdOut () рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдФрд░ рдлрд┐рд░ рд╕реЗ, рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрдХрдбрд╝ рдореЗрдВ рдирд╣реАрдВ рдЖрдиреЗ рд╡рд╛рд▓реА рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐ рдХреЛ рдирд┐рдЧрд▓ рд╕рдХрддрд╛ рд╣реВрдВ - рдпрджрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛!)ред рдореИрдВ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реЗрддрд╛ рд╣реВрдВ, рдФрд░ рдЗрд╕реЗ рдПрдХ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕реЗ рдореИрдВ рдкреНрд░рд┐рдВрдЯ рдХреЙрд▓ рдХрд░рдХреЗ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВред рдкреНрд░рд┐рдВрдЯ рдПрдХ рд╕реНрд╡рд░реВрдкрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рдХрд┐ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реАрдзреЗ рдЬрдЧрд╣ рд▓реЗрддрд╛ рд╣реИред рдкреНрд░рд┐рдВрдЯ рднреА рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рднреА рдирд┐рдЧрд▓рддрд╛ рд╣реВрдВредрдПрдХ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдореБрдЭреЗ stdout рдЦреЛрд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рд╛рде рд╣реА stdout рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред Zig рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВредрдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЕрдЧрд░ рдореИрдВ рддрдп рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ? рдХреНрдпрд╛ рдореИрдВ рдПрдХ рдХрдк рдХреЙрдлреА рдХреЗ рд╕рд╛рде рдмреИрдареВрдВрдЧрд╛ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╣рд░ рд╕рдВрднрд╡ рдорд╛рдорд▓реЗ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд╢рдХреЛрдВ рдХреЗ рдЕрдиреБрднрд╡ рдФрд░ рдЬреНрдЮрд╛рди рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реБрдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдПрдХ рдХреГрддрдШреНрди рдХрд╛рдо рдХрд░реВрдВрдЧрд╛, рдФрд░ рдореИрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реВрдВ? рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рджрд╢рдХреЛрдВ рдХрд╛ рдЕрдиреБрднрд╡ рдФрд░ рдЬреНрдЮрд╛рди рдирд╣реАрдВ рд╣реИ? рдпрд╣ рдареАрдХ рд╣реИ, Zig рдпрд╣ рдХрд░ рджреЗрдЧрд╛!рдореИрдВ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЪреАрдЬ, рддреНрд░реБрдЯрд┐ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ! const bf = @import("./bf.zig").bf; const warn = @import("std").debug.warn; const serpinsky = "++++++++[>+>++++<<-]>++>>+<[-[>>+<<-]+>>]>+[ -<<<[ ->[+[-]+>++>>>-<<]<[<]>>++++++[<<+++++>>-]+<<++.[-]<< ]>.>+[>>]>+ ] "; pub fn main() void { var storage = []u8{0} ** 30000; bf(serpinsky, storage[0..]) catch unreachable; }
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ bf рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ! рдореИрдВ рдореБрдЦреНрдп рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ, рдХреЙрд▓ рдкрдХреНрд╖ рдкрд░ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдирд┐рдЧрд▓рддрд╛ рд╣реВрдВред рдЬрдм рдореИрдВ рдЕрдкрдиреЗ рднрд╛рдЧреНрдп рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдФрд░ рд╕рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВ, рддреЛ рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ: const bf = @import("./bf.zig").bf; const warn = @import("std").debug.warn; const serpinsky = "++++++++[>+>++++<<-]>++>>+<[-[>>+<<-]+>>]>+[ -<<<[ ->[+[-]+>++>>>-<<]<[<]>>++++++[<<+++++>>-]+<<++.[-]<< ]>.>+[>>]>+ ] "; pub fn main() void { var storage = []u8{0} ** 30000; bf(serpinsky, storage[0..]) catch |err| switch (err) { }; }
рд╕рдВрдХрд▓рдХ рдЕрдм рдореЗрд░рд╛ рджреЛрд╕реНрдд рд╣реИ! /Users/jfo/code/zigfuck/main.zig:7:46: error: error.OutOfBounds not handled in switch shell returned 1
рдпрд╣ рддреНрд░реБрдЯрд┐ рдЖрдкрдХреЛ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ bf рдФрд░ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рдерд╛! рд▓реЗрдХрд┐рди рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдореИрдВ stdout рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВ рдЬреЛ рдореИрдВрдиреЗ bf рдореЗрдВ рдирд┐рдЧрд▓ рд▓рд┐рдпрд╛ рдерд╛ред рдЙрдиреНрд╣реЗрдВ рдирд┐рдЧрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореБрдЭреЗ рдХреЛрд╢рд┐рд╢ рдХрд░рдХреЗ рдЪреЗрди рдХреЛ рдзрдХреНрдХрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдлрдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬреЛ рдмрд┐рдирд╛ рдкрдХрдбрд╝ рдХреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдХреЛрд╢рд┐рд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐рд╕реА рднреА рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐ рдХреЗ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реБрдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИредрдЗрд╕рд▓рд┐рдП, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп: const io = std.io; ... pub fn bf(src: []const u8, storage: []u8) !void { const stdout = &(io.FileOutStream.init(&(io.getStdOut() catch unreachable)).stream); ... '.' => stdout.print("{c}", storage[memptr]) catch unreachable, ...
рд╣рдо рдХрд░рддреЗ рд╣реИрдВ: const io = std.io; ... pub fn bf(src: []const u8, storage: []u8) !void { const stdout = &(io.FileOutStream.init(&(try io.getStdOut())).stream); ... '.' => try stdout.print("{c}", storage[memptr]), ...
рд╣рдо рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╣реИрдВ: const bf = @import("./bf.zig").bf; const warn = @import("std").debug.warn; const serpinsky = "++++++++[>+>++++<<-]>++>>+<[-[>>+<<-]+>>]>+[ -<<<[ ->[+[-]+>++>>>-<<]<[<]>>++++++[<<+++++>>-]+<<++.[-]<< ]>.>+[>>]>+ ] "; pub fn main() void { var storage = []u8{0} ** 30000; bf(serpinsky, storage[0..]) catch |err| switch (err) { }; }
рдФрд░ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдЬреЛ рдореИрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ! /Users/jfo/code/zigfuck/main.zig:7:46: error: error.SystemResources not handled in switch /Users/jfo/code/zigfuck/main.zig:7:46: error: error.OperationAborted not handled in switch /Users/jfo/code/zigfuck/main.zig:7:46: error: error.IoPending not handled in switch /Users/jfo/code/zigfuck/main.zig:7:46: error: error.BrokenPipe not handled in switch /Users/jfo/code/zigfuck/main.zig:7:46: error: error.Unexpected not handled in switch /Users/jfo/code/zigfuck/main.zig:7:46: error: error.WouldBlock not handled in switch /Users/jfo/code/zigfuck/main.zig:7:46: error: error.FileClosed not handled in switch /Users/jfo/code/zigfuck/main.zig:7:46: error: error.DestinationAddressRequired not handled in switch /Users/jfo/code/zigfuck/main.zig:7:46: error: error.DiskQuota not handled in switch /Users/jfo/code/zigfuck/main.zig:7:46: error: error.FileTooBig not handled in switch /Users/jfo/code/zigfuck/main.zig:7:46: error: error.InputOutput not handled in switch /Users/jfo/code/zigfuck/main.zig:7:46: error: error.NoSpaceLeft not handled in switch /Users/jfo/code/zigfuck/main.zig:7:46: error: error.AccessDenied not handled in switch /Users/jfo/code/zigfuck/main.zig:7:46: error: error.OutOfBounds not handled in switch /Users/jfo/code/zigfuck/main.zig:7:46: error: error.NoStdHandles not handled in switch shell returned 1
рдЬрд┐рдЧ рдореБрдЭреЗ рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрддрд╛ рд╣реИ рдпрджрд┐ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ! рдореИрдВ рддреНрд░реБрдЯрд┐ рдорд╛рдиреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╕реНрд╡рд┐рдЪ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рдпрджрд┐ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддреЛ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдФрд░ рдЕрдЧрд░ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддреЛ рд╕реНрдХрд┐рдк рдХрд░рдирд╛ред pub fn main() void { var storage = []u8{0} ** 30000; bf(serpinsky, storage[0..]) catch |err| switch (err) { error.OutOfBounds => @panic("Out Of Bounds!"), else => @panic("IO error") }; }
рдпрд╣ рдЕрднреА рднреА рд╕рд╣реА рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ, рд╕рдЦреНрддреА рд╕реЗ рдмреЛрд▓рдиреЗ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рддреНрд░реБрдЯрд┐ рдорд╛рдорд▓реЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдХреЗ рд╕реНрдорд╛рд░реНрдЯ рдЬрд┐рдЧ рдХрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ! рдФрд░ рдЬрдм рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рддреНрд░реБрдЯрд┐ рдЯреНрд░реЗрд╕ рдорд┐рд▓рддрд╛ рд╣реИ ! рдорд╕реНрдд рдЪреАрдЬрд╝!рддреЛрджреЛ
рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реБрдзрд╛рд░ рд╣реИрдВ рдЬреЛ рдЖрдк рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ "," рдСрдкрд░реЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдмреНрд░реЗрдирдлрдХ рдореЗрдВ рдЧрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдкрд░ рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред рдЖрдкрдХреЛ рд╣рд╛рд░реНрдбрдХреЛрдб bf рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдлрд╝рд░ рдореЗрдВ рдкрдврд╝рдирд╛ рдФрд░ рдЙрд╕рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдХреБрдЫ рд╕реБрдзрд╛рд░ рднреА рд╣реИрдВ рдЬреЛ рдХрдбрд╝рд╛рдИ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬрд╝рд┐рдЧ рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреЛрд╕реНрдЯ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЙрди рд╕рднреА рдХреЛ рдбрдВрдк рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреЛрд╕реНрдЯ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рдХрд┐ рдЫреЛрдЯреЗ рдФрд░ рдкрдЪрд╛рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛрдВрдЧреЗредрдирд┐рд╖реНрдХрд░реНрд╖
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЖрдзрд╛-рдЕрдзреВрд░рд╛ рд▓рдШреБ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдкрдХреЛ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ рдХрд┐ Zig рдХреЛрдб рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрд┐рдЧ рдПрдХ рд╕реНрд╡рд┐рд╕ рдЪрд╛рдХреВ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рдм рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджрд░реНрд╢ рдЙрдкрдХрд░рдг рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХреБрдЫ рдЪреАрдЬреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкреНрд░рдгрд╛рд▓реА рдХреА рднрд╛рд╖рд╛ рд╣реЛрдиреЗ рдкрд░ рдЬреЛ рдХрд┐ рд╕реА рдФрд░ рд╕реА ++ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рд╛рде рдпрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЗрд╕рдиреЗ рдореБрдЭреЗ рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ, рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди рдФрд░ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд┐рдпрд╛ред рд╕реАрдорд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╡рд╛рд▓реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ, рдпрд╣ рдПрдХ рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдмрдЧ рдирд╣реАрдВред рдЬрд┐рдЧ рдирд┐рдпрддрд╛рддреНрдордХ рд╣реИ, рдЗрд╕рдореЗрдВ рдХреЛрдИ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рдРрд╕реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЛрдб рдХреЗ рд▓реЗрдЦрди рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИредрдореИрдВрдиреЗ рдЬрд╝рд┐рдЧ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдмрджрд▓рд╛рд╡ рд╣реИрдВ рдЬреЛ рд╕рдВрд╕реНрдХрд░рдг 0.2.0 рдФрд░ рдЙрдЪреНрдЪрддрд░ рднрд╛рд╖рд╛ рдореЗрдВ рдЖрдП рд╣реИрдВ! рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рд╕рднреА рдХреЛрдб рдХреЛ рдбрд┐рдмрдЧ рдореЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рд╕реБрд░рдХреНрд╖рд╛ рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рд╣реИ рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди рд╕рдордп рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП! --Release-fast рдФрд░ --release-safe рдореЛрдб рд╣реИрдВ, рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ рд╣реЛрдЧрд╛ ред рдЖрдк рдпрд╣рд╛рдБ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдирдХреЗ рдорддрднреЗрджреЛрдВ рдФрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ редрдореИрдВ рдЬрд┐рдЧ рд╡рд┐рдХрд╛рд╕ рдХреА рдЧрддрд┐ рдФрд░ рджрд┐рд╢рд╛ рдкрд░ рд▓рдЧрд╛рддрд╛рд░ рдЪрдХрд┐рдд рд╣реВрдВред рдмрд╣реБрдд рдХреБрдЫ рдЕрднреА рднреА рдЬрд╛рд░реА рд╣реИ, рдФрд░ рд╕рдВрд╕реНрдХрд░рдг 1.0.0 рдХреА рд░рд┐рд▓реАрдЬ рддрдХ рдРрд╕рд╛ рд░рд╣реЗрдЧрд╛, рдФрд░ рдпрджрд┐ рдЖрдк рдЬрд┐рдЧ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд╕ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдЪреНрдЫреЗ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рдФрд░ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВ!, #zig freenode , .