рдореИрдВ рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рддрдереНрдпрд╛рддреНрдордХ рдХрд┐рддрдиреЗ рддрд░реАрдХреЗ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ?

рджреБрд╖реНрдЯ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдПрдВ "рддрдереНрдпрд╛рддреНрдордХ рд▓реЗрдЦрди рднрд╛рд╖рд╛рдПрдБ" рд╣реИрдВред рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╣рд╛рд╕реНрдХреЗрд▓ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдиреЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдФрд░ рдХрдИ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЯреВрд▓ рдХреЗ рд╕рдмрд╕реЗрдЯ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ - рдпреЛрдЬрдирд╛ред рдХрдо рд╕реЗ рдХрдо map рдФрд░ for-each , filter рдФрд░ reduce , рд╕рд╛рде рд╣реА apply рдФрд░ eval рд╣рдорд╛рд░реА рдкрд╕рдВрджреАрджрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЖрдП, рдпрджрд┐ рд╕реНрдХреАрдо рд╕реЗ рдирд╣реАрдВ, рддреЛ рд╡рд╣рд╛рдВ рд╕реЗред


рддрдереНрдпрд╛рддреНрдордХ рдЧрдгрдирд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдХреБрдЫ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЙрд╕реА рд╕рдордп, рдЖрдкрдХреЛ рдпреЛрдЬрдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░рд╣ рдХрд╛ рдСрдб рдорд┐рд▓ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрджреНрднреБрдд рднрд╛рд╖рд╛ рдЗрд╕рдХреА рд╣рдХрджрд╛рд░ рд╣реИред


рдореБрдЭреЗ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП 10 рд╡рд┐рдХрд▓реНрдк рдорд┐рд▓реЗ, рдЬрд┐рдиреНрд╣реЗрдВ рдЧрдгрдирд╛ рдХреЗ 3 рдореБрдЦреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реИрдЦрд┐рдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐, рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреА рдкреАрдврд╝реА, рдЗрд╕рдХреЗ рдмрд╛рдж рдХрдиреНрд╡реЗрдВрд╢рди рдЧреБрдгрдиред рдореИрдВ рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред рд░рд╛рд╕реНрддреЗ рдХреЗ рд╕рд╛рде, рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ: рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЕрдиреБрдХреВрд▓рди, рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдп рдФрд░ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ, рдЖрд╕реНрдердЧрд┐рдд рдЧрдгрдирд╛, рдЕрдВрддрд╣реАрди рд╕реВрдЪрд┐рдпрд╛рдВ, рд╕рдВрд╕реНрдорд░рдг, рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рдЪрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛, рдФрд░ рд╕реНрд╡рдЪреНрдЫрддрд╛ рдореИрдХреНрд░реЛрдЬрд╝ред


рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЕрдЪреНрдЫреА рдкреБрд░рд╛рдиреА рдмреЛрд▓реА рдпреЛрдЬрдирд╛ R5RS рдФрд░ рд▓рд▓рд┐рдд рдХрд▓рд╛ рдХреЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕рд┐рджреНрдзрд╛рдВрдд "рдиреНрдпреВрдирддрдо рд╕рд╛рдзрди - рдЕрдзрд┐рдХрддрдо рдЗрдВрдкреНрд░реЗрд╢рди" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред


рд╕рднреА рдпреЛрдЬрдирд╛ рдЙрджрд╛рд╣рд░рдг R5RS рдореЛрдб рдореЗрдВ DrRacket 6.2 рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдереЗред OpenSUSE рд▓реАрдк 15 OS рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЧреБрдЗрд▓ 2.0 рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдорд╛рдк рдХрд┐рдП рдЧрдП рдереЗред


рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рднрд╛рдЬреНрдп рдХреА рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкрд░рд┐рднрд╛рд╖рд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпреЛрдЬрдирд╛ рдкрд░ рд╕реВрддреНрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:


 (define (factorial-classic n) (if (zero? n) 1 (* n (factorial-classic (- n 1))))) 

рдкрд░рд┐рдгрд╛рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ (рд╕реНрдХреАрдо рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ - рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ), рдлреИрдХреНрдЯрд░рд┐рдпрд▓ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕реЗ рдЕрдирдЧрд┐рдирдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЧрд╛рдЗрдбреЛрдВ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдПрдЪред рдПрдмреЗрд▓реНрд╕рди рдФрд░ рдбреАред рдкреИрд╕рдореИрди рдХреА рдЕрдорд░ рдкреБрд╕реНрддрдХ "рдХрдВрдкреНрдпреВрдЯрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╡реНрдпрд╛рдЦреНрдпрд╛" рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред ред


рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрдврд╝ рдФрд░ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ: рднрд╛рдЬреНрдп рдПрдирдПрди рд╡рд╣рд╛рдБ рд╣реИ 1 рдЕрдЧрд░ n=0 рдЕрдиреНрдпрдерд╛ - n cdot(nтИТ1)! ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдХреЛрдб рдЧреБрдЯрдмрд╛рдЬреА рдХреА рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЧрдгрд┐рдд рдореЗрдВ рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рд╣рдо рд╕рдВрдмрджреНрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдПрди рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ред


рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рдореВрд▓реНрдп рдкрд░ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИ рдПрди : рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдбреЗрдЯрд╛ рддрдм рддрдХ рд╕реНрдЯреИрдХ рдкрд░ рдЬрдорд╛ рд╣реЛрдЧрд╛ рдПрди 0. рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗрдЧрд╛ред рдЗрд╕рд╕реЗ рдмрдбрд╝реЗ рд╕реНрддрд░ рдкрд░ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдПрди ред


рдореИрдВ рдЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдХреИрд╕реЗ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реВрдВ? рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ: рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ рддрд╛рдХрд┐ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдкреВрдВрдЫ рдмрди рдЬрд╛рдП (рдпрд╛рдиреА, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЕрдВрддрд┐рдо)ред рдпрд╣ рдпреЛрдЬрдирд╛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ - рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕рдВрдЧрдгрдирд╛ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ред


рдпрджрд┐ рдЖрдк рдЙрдкрд░реЛрдХреНрдд рдкреБрд╕реНрддрдХ рдХреЗ рд▓реЗрдЦрдХреЛрдВ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 (define (factorial-classic-tco n) (define (iteration product counter) (if (> counter n) product (iteration (* product counter) (+ counter 1)))) (iteration 1 1)) 

рдпрд╣ рдХреЛрдб рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдФрд░ "рдХрдВрдкреНрдпреВрдЯрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╡реНрдпрд╛рдЦреНрдпрд╛" рдкреБрд╕реНрддрдХ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдЗрд╕ рдкрд░ рд╣реИ рдХрд┐ рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдЖрдорддреМрд░ рдкрд░ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдпрд╣ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдерд╛ред рд▓реЗрдХрд┐рди рдпреЛрдЬрдирд╛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд▓рдЪреАрд▓рд╛рдкрди рд╣реИ, рдХреНрдпрд╛ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХреЛ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдФрд░ рдЕрдзрд┐рдорд╛рдирддрдГ рдХрдо рднреА? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ n!=1 cdot2 cdot3 cdot  cdots  cdotn рд╕реЗ рдПрдХ рдХреНрд░рдо рдмрдирд╛рдПрдБ 1 рдХреЛ рдПрди (рдпрд╛ рд╕реЗ рдПрди рдХреЛ 1 ) рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдШрдЯрд╛рдПрдВ? рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдпреЛрдЬрдирд╛ рдореЗрдВ рдмрд┐рд▓реНрдЯ-рдЗрди apply рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдЬреЛ рд╕реВрдЪреА рдореЗрдВ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ:


 (define (iota n) (define (iteration sequence i) (if (> in) sequence (iteration (cons i sequence) (+ i 1)))) (iteration '() 1)) (define (factorial-fold n) (apply * (iota n))) 

рдпреЛрдЬрдирд╛ "рдХреЛрдб рдФрд░ рдбреЗрдЯрд╛ рдХреА рдПрдХрддрд╛" рдХреЗ рдХрд╛рд░рдг рдкреНрд░рддреАрдХрд╛рддреНрдордХ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рд┐рджреНрдз рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрднреА-рдХрднреА рд▓рд┐рд╕реНрдк рдкрд░рд┐рд╡рд╛рд░ рдХреА рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рддреЗ рд╣реИрдВ)ред рд╣рдо рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рднрд╛рдЬреНрдп рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ рдПрди рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ:


 (define (factorial-eval n) (define expression `(* ,@(iota n))) (eval expression (interaction-environment))) 

рдкреНрд░рддреАрдХ "рдмреИрдХ рд╕рд┐рдВрдЧрд▓ рдЙрджреНрдзрд░рдг" рдХрд╛ рдЕрд░реНрде рд╣реИ рдХреНрд╡рд╛рд╕рд┐рдХреЛрдЯреЗрд╢рдиред рдЕрд░реНрдз-рдЙрджреНрдзрд░рдг рдХреЗ рдмрд┐рдирд╛, рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдЧреЗ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ (cons '* (iota n)) ред рдПрдХ рдПрдХрд▓ рдЙрджреНрдзрд░рдг (рдЙрджреНрдзрд░рдг, рдЙрджреНрдзрд░рдг) рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ * рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдирд╛рдо (рдкреНрд░рддреАрдХ) рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕реА рдореВрд▓реНрдп (рдпрд╣рд╛рдВ - рдкреНрд░рдХреНрд░рд┐рдпрд╛) рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВред рддреЛ, рдХреЗ рд╕рд╛рде n=3 рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ (* 3 2 1) ред рдпрд╣ рд╕реВрдЪреА рдпреЛрдЬрдирд╛ рдХреА рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИред рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ - рдПрдХ рдкрд░реНрдпрд╛рд╡рд░рдг (interaction-environment) рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдпреБрдХреНрдд рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдо factorial-eval рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВред


рдпреЛрдЬрдирд╛ рдЖрд╕реНрдердЧрд┐рдд рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИред рд╣рд╛рд╕реНрдХреЗрд▓, рдЬреЛ рдпреЛрдЬрдирд╛ рд╕реЗ рдХрд╛рдлреА рдкреНрд░рднрд╛рд╡рд┐рдд рдереЗ, рдПрдХ рдЖрд▓рд╕реА рдЧрдгрдирд╛ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдЬрдм рддрдХ рдЗрди рдЧрдгрдирд╛рдУрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдРрд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдЕрдВрддрд╣реАрди рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдХреЗрд╡рд▓ рдЖрдЧреЗ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рднрд╛рдЧ рдЙрдирд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрдХреНрд░ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛:


 ghci> take 4 [1 ..] [1,2,3,4] 

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ [1 ..] рдкреВрд░реНрдгрд╛рдВрдХ рдХреА рдПрдХ рдЕрдирдВрдд рд╕реВрдЪреА рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред take 4 рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЛ рдЗрд╕ рд╕реВрдЪреА рд╕реЗ рдкрд╣рд▓реЗ 4 рддрддреНрд╡ рдорд┐рд▓рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдмрд╛рдж рдХреА рд╕реВрдЪреА рдЖрдЗрдЯрдо рд▓рд╛рд╡рд╛рд░рд┐рд╕ рдмрдиреЗ рд╣реБрдП рд╣реИрдВ, рдЙрдирдХреА рдЧрдгрдирд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред


рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рд╣реЛ рд░рд╣реА рд╣реИ рдПрди! рдПрдХ рдЕрдВрддрд╣реАрди рд╕реВрдЪреА рд╕реЗ рдЖрдк рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:


 factorials :: [Integer] factorials = next 0 1 where next n fact = let n' = n + 1 in fact : next n' (fact * n') factorial :: Integer -> Integer factorial n = factorials !! fromIntegral n 

 ghci> take 7 $ factorials [1,1,2,6,24,120,720] ghci> factorial 6 720 

рдпреЛрдЬрдирд╛ delay / force рдХреБрдЫ рд░реВрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП force рдЖрдЗрдП рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред delay рдХреАрд╡рд░реНрдб рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИред force рдХреАрд╡рд░реНрдб рдЗрди рдЧрдгрдирд╛рдУрдВ рдХреЛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдФрд░ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд╛рд░-рдмрд╛рд░ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░, рдирдИ рдЧрдгрдирд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдХреА рдЧрдгрдирд╛ рдХреА рдЧрдИ рд░рд╛рд╢рд┐ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреА рд╣реИред


рд▓рд┐рд╕реНрдк рдкрд░рд┐рд╡рд╛рд░ рдХреА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдЬреЛрдбрд╝реЗ рд╕реЗ рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдирдВрдд рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо "рдЖрд▓рд╕реА рдЬреЛрдбрд╝реА" рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ - рдПрдХ рдЬреЛрдбрд╝реА рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓рд╛ рддрддреНрд╡ рдЧрдгрдирд╛ рдореВрд▓реНрдп рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд▓рд┐рд╕реНрдк рдкрд░рд┐рд╡рд╛рд░ ( cons , car , cdr ) рдХреА рднрд╛рд╖рд╛рдУрдВ рдХреЗ "рдкрд╡рд┐рддреНрд░ рддреНрд░рд┐рдореВрд░реНрддрд┐" рдХреЛ рдЙрдирдХреЗ рдЖрд▓рд╕реА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 (define-syntax lazy-cons (syntax-rules () ((_ first second) (cons first (delay second))))) (define lazy-car car) (define (lazy-cdr lazy-pair) (force (cdr lazy-pair))) 

lazy-cons рдЬреЛрдбрд╝реА рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЬреЛрдбрд╝реЗ рдХреЗ рджреВрд╕рд░реЗ рддрддреНрд╡ рдХреЗ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рд╡рд┐рдЪрд╛рд░ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рдЕрдВрддрд╣реАрди рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдФрд░ рдлрд┐рд░ рдЙрд╕рд╕реЗ рдЬреЛ рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЙрд╕реЗ рд▓реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рддрддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЖрд▓рд╕реА рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:


 (define (lazy-list-ref lazy-list index) (if (zero? index) (lazy-car lazy-list) (lazy-list-ref (lazy-cdr lazy-list) (- index 1)))) (define (generate-factorials) (define (next nn!) (define n+1 (+ n 1)) (lazy-cons n! (next n+1 (* n! n+1)))) (next 0 1)) 

рдпрд╣рд╛рдБ n! рдФрд░ n+1 рдЪрд░ рдХреЗ рдирд╛рдо рд╣реИрдВред рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрдХреАрдо рдореЗрдВ, рдмрд╣реБрдд рдХрдо рдЕрдХреНрд╖рд░ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрдирдВрдд рд╕реВрдЪреА рдЬреЗрдирд░реЗрдЯрд░ generate-factorials рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕реЗ рд▓реВрдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдЗрд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЗрд╡рд▓ рд╕реВрдЪреА рдХреЗ рдкреНрд░рдореБрдЦ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рдПрдЧреА, рдЬрдмрдХрд┐ рдкреВрдВрдЫ рдХреЛ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд╡рд╛рджреЗ рд╕реЗ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдЕрдм рдЖрдк рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдПрди! рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдПрди рдЧреБрдЯреЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рддрддреНрд╡:


 (define lazy-factorials (generate-factorials)) (define (factorial-lazy n) (lazy-list-ref lazy-factorials n)) 

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдХреЗ рдПрдХ рд╕рддреНрд░ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рднрд╛рдЬреНрдп рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рд╕рдЦреНрдд рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЧрдгрдирд╛ рддреЗрдЬреА рд╕реЗ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдЖрд▓рд╕реА рд╕реВрдЪреА рдХреЗ рдХреБрдЫ рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреА рдЬрд╛рдПрдЧреАред


рд╡реИрд╕реЗ, рд╕реНрдХреАрдо рдкрд░ рдХреЛрдб рд╣рд╛рд╕реНрдХреЗрд▓ рдкрд░ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИред рддреЛ, рдкреНрд░рд╛рдкреНрдд рдмрдпрд╛рди !! рд▓рдЧрднрдЧ lazy-list-ref рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ lazy-list-ref рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ : lazy-cons рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХреНрдпреЛрдВрдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдЖрд▓рд╕реА рдЧрдгрдирд╛ рдореЙрдбрд▓ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпреЛрдЬрдирд╛ рдореЗрдВ delay / force рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдореВрд▓реНрдпреЛрдВ рдХреЛ рдпрд╛рдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


рд╡реИрд╕реЗ, рдЙрддреНрдкрд╛рджрдХрддрд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреЗ рд╕рдВрд╕реНрдорд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд╕рдВрд╕реНрдорд░рдгред рд╣рдо рдЧрдгрдирд╛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рд╣рдЪрд░реНрдп рд╕реВрдЪреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдЪрд╛рдмрд┐рдпрд╛рдБ рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╣реИрдВ, рдФрд░ рдореВрд▓реНрдп рдЙрдирдХреЗ рднрд╛рдЬреНрдп рд╣реИрдВред рдЬрдм рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧрдгрдирд╛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реВрдЪреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦреЗрдВрдЧреЗред рдпрджрд┐ рдореВрд▓реНрдп рд╕реВрдЪреА рдореЗрдВ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВрдЧреЗред рдпрджрд┐ рдореВрд▓реНрдп рд╕реВрдЪреА рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕реЗ рд╕реВрдЪреА рдореЗрдВ рдбрд╛рд▓реЗрдВрдЧреЗ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рд╕реВрдЪреА рд╣рдореЗрд╢рд╛ рдХреЙрд▓ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╣реИ, рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдПрдХ рд╕реНрдерд┐рд░ рдЪрд░ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ:


 (define factorial-memoized (let ((memo '())) (lambda (n) (let ((memoized (assq n memo))) (if memoized (cadr memoized) (if (zero? n) 1 (let ((computed (* n (factorial-memoized (- n 1))))) (set! memo (cons (list n computed) memo)) computed))))))) 

рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕реНрдереИрддрд┐рдХ рдЪрд░

рдХреЛрдб рджреЗрдЦреЗрдВ


 (define proc (let ((static-var initial-value)) (lambda args ...))) 

рд╕реНрдереИрддрд┐рдХ рдЪрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдпреЛрдЬрдирд╛-рд╕реНрд╡реАрдХреГрдд рддрд░реАрдХрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдЫреЛрдЯреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬреЛ рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддреА рд╣реИ:


 (define count (let ((n 0)) (lambda () (set! n (+ n 1)) n))) 

рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╕рддреНрд░ рдореЗрдВ, рдкрд╣рд▓реА рдХреЙрд▓ (count) 1, рджреВрд╕рд░реА - 2, рддреАрд╕рд░реА - 3, рдЖрджрд┐ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?


рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░ рдХреЗ рдмрд┐рдирд╛, count рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:


 (define count ((lambda (n) (lambda () (set! n (+ n 1)) n)) 0)) 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рддрд░реНрдХреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ (lambda () (set! n (+ n 1)) n) , рдЬрд┐рд╕рдореЗрдВ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ n рд╢рд╛рдорд┐рд▓ рд╣реИрдВ n рдирд╛рдо count рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ n рдмрд╛рд╣рд░реА рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ (lambda () (set! n (+ n 1)) n) рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ count рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЗ рдмреАрдЪ n рдХрд╛ рдорд╛рди рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдорд╛рди n рдХреЛ рд╢реВрдиреНрдп n рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЪреВрдВрдХрд┐ (lambda (n) ...) рддрд░реНрдХ 0 рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, n рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди count рд╕реЗ рд╣рдореЗрд╢рд╛ рд╕реБрд▓рдн рд╣реИред


рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╕рддреНрд░ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рднрд╛рдЬреНрдп рдХреА рдмрд╛рд░-рдмрд╛рд░ рдЧрдгрдирд╛ рдХрд░рдХреЗ рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИред


рдмреЗрд╢рдХ, рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЕрдиреБрдХреВрд▓рди рднреА рдпрд╣рд╛рдВ рд╕рдВрднрд╡ рд╣реИ:


 (define factorial-memoized-tco (let ((memo '())) (lambda (n) (define (iteration product counter) (cond ((> counter n) product) (else (set! memo (cons (list counter product) memo)) (iteration (* product counter) (+ counter 1))))) (iteration 1 1)))) 

"рдпреЗ рдирд╛рдЪрддреЗ рдХреНрдпреЛрдВ рд╣реИрдВ рдПрдХ рддрдорд╛рд╢рдмреАрди рдХреЗ рд╕рд╛рде?", рдкрд╛рдардХ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдирд┐рд╡рд╛рд░реНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдПрдХ рд╣реА рдЪреАрдЬ рдмрд╕ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИ - рдПрдХ рд▓реВрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдпрд╣ рдЬрд▓реНрджреА рдФрд░ рдмрд┐рдирд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕реНрдореГрддрд┐ рд▓рд╛рдЧрдд рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпреЛрдЬрдирд╛ рдореЗрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдмрд╕реЗрдЯ рд╣реИ, рдЗрд╕рдореЗрдВ рд▓реВрдк рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрди рднреА рд╣реИ - рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк ред рдЧреБрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛, рдЗрд╕рдХреА рдорджрдж рд╕реЗ рд▓рд┐рдЦрд┐рдд, рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:


 (define (factorial-do n) (define product 1) (do ((i 1 (+ i 1))) ((> in) product) (set! product (* product i)))) 

do рдирд┐рд░реНрдорд╛рдг рдХрд╛рдлреА рдмрд╣реБрдореБрдЦреА рд╣реИ, рдФрд░ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдкрдардиреАрдп рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдЕрдкрдиреА рдЦреБрдж рдХреА рдЕрдирд┐рд╡рд╛рд░реНрдп рд╢реИрд▓реА рдЪрдХреНрд░ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ? рдореИрдХреНрд░реЛрдВ рдЗрд╕рдХреА рдорджрдж рдХрд░реЗрдВрдЧреЗ:


 (define-syntax for (syntax-rules () ((_ (variable init test step) . body) (let loop ((variable init)) (if test (begin (begin . body) (loop step))))))) 

рджреБрднрд╛рд╖рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдореЗрдВ рдПрдХ рд▓реВрдк рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВред рдкреВрдВрдЫ рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдХреЗ, рдвреЗрд░ рдирд╣реАрдВ рдмрдврд╝реЗрдЧрд╛ред


рдХреЗ for рдЙрдкрдпреЛрдЧ рдХрд░ рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛:


 (define (factorial-for n) (define product 1) (for (i 1 (<= in) (+ i 1)) (set! product (* product i))) product) 

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (for (i 1 (<= in) (+ i 1)) (set! product (* product i))) рдорд┐рд▓рд╛рди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд┐рдпрдо рдХреЗ рдкреИрдЯрд░реНрди (_ (variable init test step) . body) ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ:


 for тЖТ _ i тЖТ variable 1 тЖТ init (<= in) тЖТ test (+ i 1) тЖТ step (set! product (* product i)) тЖТ body 

рдпрд╣рд╛рдВ рд╕реЗ, рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд┐рдпрдо рдЯреЗрдореНрдкреНрд▓реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:


 (define (factorial-for n) (define product 1) (let loop ((i 1)) ;   (if (<= in) ;  (begin (begin (set! product (* product i))) ;  (loop (+ i 1))))) ;  for product) 

рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬреЛ рд▓реВрдк рдХреЗ for рдЕрдирд┐рд╡рд╛рд░реНрдп рдХреЗ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ - рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд for-each рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде:


 (define (factorial-for-each n) (define product 1) (for-each (lambda (i) (set! product (* product i))) (iota n)) product) 

рдорд╣рд╛рди рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдпреЛрдЬрдирд╛ рднрд╛рд╖рд╛! рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?


рд╣рдо рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП GNU Guile рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ - рдЗрд╕ рдорд╛рд╣реМрд▓ рдореЗрдВ рдЖрдк рдХрд┐рд╕реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓реЗ рд╕рдордп рдХреЛ рдорд╛рдк рд╕рдХрддреЗ рд╣реИрдВред


рдЧрд┐рд▓ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдФрд░ рдПрдХ рдпреЛрдЬрдирд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рдХрдИ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЕрдиреНрдп рд╣реИрдВ: рд░реИрдХреЗрдЯ (рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ), рдЪрд┐рдХрди рдпреЛрдЬрдирд╛ (рд╕реА рдХреЗ рд╕рдмрд╕реЗрдЯ рдореЗрдВ "рдИрдорд╛рдирджрд╛рд░" рд╡реНрдпрд╛рдЦреНрдпрд╛ рдпрд╛ рд╕рдВрдХрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ), рдЖрджрд┐ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрди рдкрд░рд┐рд╡реЗрд╢реЛрдВ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреА рд╕реАрдорд╛рдПрдВ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рджреЛрдиреЛрдВ рдереЛрдбрд╝рд╛ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред


рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓реНрдп рдкрд░ рдорд╛рдк рд▓реЗрдВрдЧреЗ рдПрди ред рдпрд╣ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдПрди ? рддреЛ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдорд╣рд╛рди рд╣реИ рдПрди рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде "рд╕рд╛рдордирд╛" рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЧрдЗрд▓ 2.0 рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде, рдЗрдВрдЯреЗрд▓ рдХреЛрд░ i5 рдФрд░ 4 рдЬреАрдмреА рд░реИрдо рдХреЗ рд╕рд╛рде рдкреАрд╕реА рдкрд░, рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рд╛:


рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╕рдорд╕реНрдпрд╛
factorial-classicрд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ n>10000
factorial-classic-tcoрдирд╣реАрдВ ( n=100000 )
factorial-foldрд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ n>10000
factorial-evalрд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ n>8000
factorial-lazyрдкрд░ n=100000 рд╕реНрд╡реИрдк рд╡рд┐рднрд╛рдЬрди рдФрд░ рдлреНрд░реАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
factorial-memoizedрд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ n>10000 рдХреЗрд╡рд▓ рдкрд╣рд▓реА рд╢реБрд░реБрдЖрдд рдкрд░
factorial-memoized-tcoрдкрд░ n>1000 рд╕реНрд╡реИрдк рд╡рд┐рднрд╛рдЬрди рдФрд░ рдлреНрд░реАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
factorial-doрдирд╣реАрдВ ( n=100000 )
factorial-forрдирд╣реАрдВ ( n=100000 )
factorial-for-eachрдирд╣реАрдВ ( n=100000 )

рдпрд╣рд╛рдВ рд╕реЗ, рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЧрдпрд╛ n=8000 ред рдкрд░рд┐рдгрд╛рдо рдиреАрдЪреЗ рджреА рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЬрд╣рд╛рдВ tрд░рди - рд▓реАрдб рд╕рдордп tGC - рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рд╕реЗрдХрдВрдб рдореЗрдВ рд╕рдордп рдЪрд▓рд╛рддреЗ рд╣реИрдВред
рдЖрд▓рд╕реА рдФрд░ рдЬреНрдЮрд╛рдкрди рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рдореВрд▓реНрдп рдФрд░ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рд╕рдВрдЧрдд рд╕рдордп рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рддреАрди рдкреНрд░рд╛рд░рдВрдн рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред n=8000 ред
рдЬреНрдЮрд╛рдкрди рдФрд░ рдЖрд▓рд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реА рдХреЙрд▓ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рддреАрди рдХреЙрд▓ рдХреЗ рдЫреЛрдЯреЗред


рдкреНрд░рдХреНрд░рд┐рдпрд╛tрд░рди рд╕рд╛рдеtGC рд╕рд╛рдердиреЛрдЯ
factorial-classic00510034
factorial-classic-tco00550041
factorial-fold00650059
factorial-eval00700040
factorial-lazy00760036рдкрд╣рд▓реЗ рдХреЙрд▓ рдХрд░реЗрдВ
factorial-lazy0009-рдмрд╛рдж рдХреЗ рдХреЙрд▓
factorial-memoized00770041рдкрд╣рд▓реЗ рдХреЙрд▓ рдХрд░реЗрдВ
factorial-memoized0,002-рдмрд╛рдж рдХреЗ рдХреЙрд▓
factorial-memoized-tco00770041рдкрд╣рд▓реЗ рдХреЙрд▓ рдХрд░реЗрдВ
factorial-memoized-tco0,002-рдмрд╛рдж рдХреЗ рдХреЙрд▓
factorial-do00520,025
factorial-for00590044
factorial-for-each00660042

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 4 рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬреЛ рдмрдбрд╝реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдПрди ред рдкрд░ n=100000 рдЙрдирдХреЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧрдгрдирд╛ рдФрд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдг рд╕рдордп рд╣реИ:


рдкреНрд░рдХреНрд░рд┐рдпрд╛tрд░рди рд╕рд╛рдеtGC рд╕рд╛рде
factorial-classic-tco8.4686628
factorial-do84706.632
factorial-for84406601
factorial-for-each9.9987.985

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ рдПрди рд╕рдмрд╕реЗ рддреЗрдЬ рдФрд░, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рд╣реИред рд╕рдорд╛рди рд╡рд┐рдХрд▓реНрдк рдЧреБрдЯрдмрд╛рдЬреА рдХреА рдЧрдгрд┐рддреАрдп рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд╕рдВрдЧрдд рд╣реИред рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЗрд╕рдХреЗ рдкреНрд░рддрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реАрди рдирд╣реАрдВ рд╣реИред рдпреЗ рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдк рднрд╛рд╖рд╛ рдХреЗ рд▓реЗрдЦрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рд╣реИрдВред рдирд┐рд╖реНрдХрд░реНрд╖ рдХрдИ рдорд╛рдпрдиреЛрдВ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реИ: рдЬрдм рддрдХ рдЕрдиреНрдпрдерд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдЬреЛ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП "рд╡рд┐рд╢рд┐рд╖реНрдЯ" рд╣реИ, рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рддреА рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдПрд▓реНрдЧреЛрд░рд┐рдердо рдпрд╛ рд╡рд┐рдзрд┐ рдХреЗ рдкрд╣рд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдПред


рдЙрд╕реА рд╕рдордп, рдпреЛрдЬрдирд╛ рднрд╛рд╖рд╛ рдиреЗ рд╣рдореЗрдВ рдмрд╣реБрдд рд╣реА рд╕реАрдорд┐рдд рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡реНрд╕ (рдмрд╣реБрдд "рдиреНрдпреВрдирддрдо рд╕рд╛рдзрди - рдЕрдзрд┐рдХрддрдо рдЗрдВрдкреНрд░реЗрд╢рди") рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдлреИрдХреНрдЯрд░рд┐рдпрд▓ рдЧрдгрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред рдЗрд╕рд▓рд┐рдП, рдЕрдкрдиреА рдЖрджрд░рдгреАрдп рдЙрдореНрд░ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдФрд░ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЗрд╕ рднрд╛рд╖рд╛ рдХреЛ рдЕрднреА рднреА рдЕрдиреБрд╕рдВрдзрд╛рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ (рдФрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ) рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рдЗрд╕ рдкрд░ рдХреБрдЫ рднреА рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi436698/


All Articles