рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рд╡реНрдпрд╛рдЦреНрдпрд╛, рдпрд╛ C ++ 11 рдореЗрдВ рд▓реИрдореНрдмреНрдбрд╛ рдХреА рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдордЭ

рдпреЛ рдбреЙрдЧ, рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рддрд░рд╣ рд╕реБрдирд╛ред  рдЗрд╕рд▓рд┐рдП рд╣рдо рдЖрдкрдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рднрд╛рд╖рд╛ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЗ рд╕рдордп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ HurrTheDurr рд╕реЗ C ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкрд░ рдЧрдгрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдФрд░ рд▓реЗрдЦ рд╣рд╛рд▓ рд╣реА рдореЗрдВ Habr├й рдкрд░ рдлрд┐рд╕рд▓ рдЧрдпрд╛ред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЙрд╕рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдХреЙрд▓ рджреЗрдЦрд╛:

> рдкреНрд░рддреНрдпреЗрдХ рдирдИ рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЗ рджрд┐рдорд╛рдЧ рдХреЛ C ++ рдХреЗ рд╕рд╛рде рдЧреИрд░-рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдЬрд╛рд░реА рд╣реИ)
рдЙрджреНрдзрд░рдг 1 >> рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрджрд┐ рдЖрдк рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рд╕рднреА рдЧрдгрдирд╛рдУрдВ рдХреЛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдирд╣реАрдВред

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдРрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рд▓рд┐рдЦрдирд╛ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ рдЬреЛ рд╕реЗрд▓реНрдпреБрд▓рд░ рдСрдЯреЛрдореЗрдЯрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ? рдпрд╣ рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛; рдореИрдВрдиреЗ рдЗрд╕ рд▓реЗрдЦ рдкрд░ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 30 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╕рдордп рдмрд┐рддрд╛рдпрд╛ред

AveNat рдиреЗ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рджреЛ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд▓реИрдореНрдмреНрдбрд╛ рдХреИрд▓рдХреБрд▓рд╕ рдХрд╛ рдПрдХ рдкрд░рд┐рдЪрдп рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛ рддреБрд░рдВрдд рдЖрдИред рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ (рдЖрд▓рдВрдХрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ) рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛:
#include <iostream> #include <LC/kernel.h> #include <LC/church_numerals.h> int main() { //      - typedef ChurchEncode<2> Two; // 2 = ╬╗fx.f (fx) typedef ChurchEncode<3> Three; // 3 = ╬╗fx.f (f (fx)) // * = ╬╗ab.╬╗f.a (bf) typedef Lambda<'a', Lambda<'b', Lambda<'f', Apply<Var<'a'>, Apply<Var<'b'>, Var<'f'> > > > > > Multiply; //  (* 2 3) typedef Eval<Apply<Apply<Multiply, Two>, Three>> Output; //    -    typedef ChurchDecode<Output> Result; std::cout << Result::value; } 

рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ:
 ilammy@ferocity ~ $ gcc cpp.cpp ilammy@ferocity ~ $ ./a.out 6 

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

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

(рдЪреВрдБрдХрд┐ C ++ 03 рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП < рдЕрд╕рдордорд┐рдд < рдХреЛрдгреАрдп < рдХреЛрд╖реНрдардХ < рдЦрд╛рдХрд╛ >>>>> рдореЗрдВ рд╣реИ, рдФрд░ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореИрдВ рдЙрдирдХреЗ рд╕реНрд╡рд░реВрдк рд╕реЗ рдкрд░реЗрд╢рд╛рди рд╣реВрдБ, рдпрд╛ рддреЛ рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП C ++ 11 рд╕рдорд░реНрдерди рдпрд╛ sed ':l;s/>>/> >/g;tl' рдЖрд╡рд╢реНрдпрдХ рд╣реИред sed ':l;s/>>/> >/g;tl' рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднрд╛рдЧ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдХреЛрдб C ++ 11. рдХреА рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)


рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕


рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд▓реИрдореНрдмреНрдбрд╛ рдХреИрд▓рдХреБрд▓рд╕ рдореЗрдВ рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢рдмреНрдж рд╣реЛрддреЗ рд╣реИрдВ:
vрдЪрд░ рд╕рдВрджрд░реНрднv - рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдирд╛рдо
╬╗v.Bрдорддрд┐рд╣реАрдирддрд╛v - рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдирд╛рдо, B - рдкрдж
(рдЪ x)рдкрд┐рдкрд▓реАf рдФрд░ x рд╢рдмреНрдж рд╣реИрдВ
рдЗрди рд╕рднреА рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЛ C ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдореЗрдВ рд╡реИрд▓реНрдпреВ рдЯрд╛рдЗрдк рд╣реЛрддреА рд╣реИрдВред рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЙрдиреНрд╣реЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рдХреЗ, рд╣рдо рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдзрддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ "рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рднрд╛рд╡ рдореМрдЬреВрдж рд╣реИрдВ":
 template <class Var> struct Ref; //  template <class Var, class Exp> struct Lam; //  template <class Fun, class Arg> struct App; //  

рд╣рд╛рд▓рд╛рдБрдХрд┐, рд▓реИрдореНрдмреНрдбрд╛ рдХреИрд▓рдХреБрд▓рд╕ рдореЗрдВ рдЪрд░ рдкреВрд░реНрдг рдорд╛рди рдирд╣реАрдВ рд╣реИрдВред рдЪрд░ v рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдмрд┐рдирд╛ рдЕрдореВрд░реНрдд рдХреЗ рдЬреЛ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╢рдмреНрдж рдПрдХ рдЪрд░ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИ , рдЪрд░ рдХрд╛ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдХрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 template <char Var> struct Ref; template <char Var, class Exp> struct Lam; template <class Fun, class Arg> struct App; 

рд╣рдордиреЗ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдпрд╛ред рд▓реЗрдХрд┐рди рддрд╛рд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рддрд╛рд░ рдореЗрдВ рднреА рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ: рдЖрдкрдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рдЪрд░ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕реА рд╕рдордп, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЪрд░ рд╕реНрд╡рдпрдВ рдорд╛рди рдирд╣реАрдВ рд╣реИрдВ (рдЕрд░реНрдерд╛рдд, C ++ рдкреНрд░рдХрд╛рд░)ред
рдордЬреЗрджрд╛рд░ рддрдереНрдп
рдЪрд░ рдирд╛рдо рдХрдИ рд╡рд░реНрдгреЛрдВ рд╕реЗ рдмрдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: 'foo' ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд▓реИрдореНрдмреНрдбрд╛ рдХрд▓рди рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдЗрд╕реЗ рдПрдХ рд▓рдХреНрдЬрд░реА рдорд╛рдирддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ, рдРрд╕реЗ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд╢рд╛рдмреНрджрд┐рдХ рдХрд╛ рдореВрд▓реНрдп рд╕рдВрдХрд▓рдХ ( 2.14.3 / 1 ) рдХреЗ рд╡рд┐рд╡реЗрдХ рдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рджреБрд░реНрд▓рдн рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдирд╛рдо рд╕рдВрдШрд░реНрд╖ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред

рдЕрдм рд╣рдо рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рд▓рдореНрдмреЗ рд╢рдмреНрдж рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!

 typedef Lam<'f', App<Lam<'x', App<Ref<'f'>, App<Ref<'x'>, Ref<'x'>>>>, Lam<'x', App<Ref<'f'>, App<Ref<'x'>, Ref<'x'>>>>>> Y; 


рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?

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

рд╣рдо рдкрд╣рд┐рдпрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢рдмреНрджреЛрдВ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдмрд▓рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
 ; Y = ╬╗f.(╬╗x.f (xx)) (╬╗x.f (xx)) (define Y '(lambda (f) ((lambda (x) (f (xx))) (lambda (x) (f (xx))) ))) 

рд╣рдо рд▓реИрдореНрдмреНрдбрд╛ рдХреИрд▓рдХреБрд▓рд╕ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ:
 ;  тАФ  , ,  . (define (term? exp) (or (ref? exp) (lam? exp) (app? exp)) ) ;   . (define (ref? exp) (symbol? exp)) ;  тАФ     . (define (lam? exp) (and (list-of? 3 exp) ;   тАФ   lambda. (eqv? 'lambda (first exp)) ;  тАФ     . (list-of? 1 (second exp)) (symbol? (first (second exp))) ;   тАФ  . (term? (third exp)) ) ) ;  тАФ     . (define (app? exp) (and (list-of? 2 exp) (term? (first exp)) (term? (second exp)) ) ) 

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдХ рд╕реНрдкрд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╢рдмреНрджреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░реЗрдЧрд╛, рдЙрдиреНрд╣реЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд░реЗрдЧрд╛:
 (define (eval exp) (cond ((ref? exp) (eval-ref exp)) ((lam? exp) (eval-lam (first (second exp)) (third exp))) ((app? exp) (eval-app (first exp) (second exp))) (else (error "eval: syntax error" exp)) ) ) 

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ред рд▓реЗрдХрд┐рди eval-ref рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ? рджреБрднрд╛рд╖рд┐рдпрд╛ рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдХреИрд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИ? рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рд╡рд░рдг рдЬреИрд╕реА рдЪреАрдЬ рд╣реИ ред рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ, рдЪрд░ рдФрд░ рдЙрдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, eval рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ - рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдХреЗ рд╕рд╛рде:
 (define (eval exp env) (cond ((ref? exp) (eval-ref exp env)) ((lam? exp) (eval-lam (first (second exp)) (third exp) env)) ((app? exp) (eval-app (first exp) (second exp) env)) (else (error "Syntax error" exp)) ) ) 

рдЕрдм рдЪрд░ рд╕рдВрджрд░реНрдн рдХреА рдЧрдгрдирд╛ рдмрд╕ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ - рдпрд╣ рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдЪрд░ рдореВрд▓реНрдп рдХреА рдЦреЛрдЬ рд╣реИ:
 (define (eval-ref var env) (lookup var env) ) 

рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рдорд╛рди рдПрдХ рддрд░реНрдХ рдХрд╛ рдПрдХ рдЕрдирд╛рдо рдХрд╛рд░реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдордп рдЖрдиреЗ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рдЕрд░реНрде рд╣реИ рдЕрдкрдиреЗ рд╢рд░реАрд░ рдХреЗ exp рдЧрдгрдирд╛ рдРрд╕реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд░рдирд╛ рдЬрд╣рд╛рдВ рдЕрдореВрд░реНрдд рдЪрд░ var рдореЗрдВ рддрд░реНрдХ arg рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХрд╛ рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИред bind рдлрдВрдХреНрд╢рди рдРрд╕реЗ рдорд╛рд╣реМрд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдЧрд╛ред
 (define (eval-lam var exp env) (lambda (arg) (eval exp (bind var arg env)) ) ) 
рдЕрдиреНрдп рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓реИрдореНрдмреНрдбрд╛ рдХреИрд▓рдХреБрд▓рд╕ рдореЗрдВ рд╣реИ рдХрд┐ рд╡реЗ рдЙрд╕реА рд╕реНрдерд╛рди рдкрд░ рдмрдиреЗ рд░рд╣рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдЕрдореВрд░реНрдд рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдЕрд░реНрдерд╛рдд, рдЙрдиреНрд╣реЗрдВ рдкрд░реНрдпрд╛рд╡рд░рдг env рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред рдореВрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдХрд╛рд░рдг, рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреНрд▓реЛрдЬрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдЖрд╡реЗрджрди arg рддрд░реНрдХ рдХреЗ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдЕрдореВрд░реНрдд fun рдХреЗ рдореВрд▓реНрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реИред
 (define (eval-app fun arg env) ((eval fun env) (eval arg env)) ) 
рдпрд╣рд╛рдВ, рдЕрдореВрд░реНрдд рдФрд░ рдЗрд╕рдХреЗ рддрд░реНрдХ рдХреА рдЧрдгрдирд╛ рдкрд╣рд▓реЗ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рдХреЙрд▓ рдкрд╣рд▓реЗ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рддрджрдиреБрд╕рд╛рд░, eval рдЖрд╡реЗрджрди рдХреНрд░рдо рдореЗрдВ рд▓рдВрдмрд┐рдд рд╢рд░реНрддреЛрдВ рдХреА рдХрдореА (рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде) рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдХреЗрд╡рд▓ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдПрдХ рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рдирдП рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП bind рдХрд░рдирд╛:
 (define (bind var val env) ;     : (cons (cons var val) env) ) ; (bind 'x 1 '((y . 2))) ===> ((x . 1) (y . 1)) ; (lookup 'x '((x . 1) (y . 2))) ===> 1 (define (lookup var env) ; (lookup 'y '((x . 1) (y . 2))) ===> 2 (let ((cell (assq var env))) ; (lookup 'z '((x . 1) (y . 2))) ===> #<ERROR> (if cell (cdr cell) (error "lookup: unbound variable" var) ) ) ) 

рд╕реБрдкрд░! рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд▓рдВрдмреЛ рдХреИрд▓рдХреБрд▓рд╕ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╣реИ рдЬреЛ рд╢реБрджреНрдз рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред ( рд╕рдВрдкреВрд░реНрдг рд╕реНрд░реЛрдд ред) рдФрд░ рдпрд╣ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
 (eval '((lambda (x) x) B) (bind 'B 42 '()) ) ; ===> 42 


рд▓реЗрдХрд┐рди рдХрд┐рд╕ рддрд░рд╣ рдХреЗ рдХреЛрд╖реНрдардХ? рдФрд░ C ++ рдХрд╛ рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реИ?


рдореИрдВ рдЕрднреА рднреА рджреЛ рдкрдиреНрдиреЛрдВ рдХрд╛ рд╣реВрдБ рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдпреЛрдЬрдирд╛ рдкрд░ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд╕рд╛рди рд╣реИ рдХрд┐ C ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкрд░ рд▓реИрдореНрдмреНрдбрд╛ рд╢рдмреНрджреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рдПред рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рд╢рдмреНрдж рд╕реНрд╡рдпрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрдЯрд░реНрди рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ:
 template <char Var> struct Ref; template <char Var, class Exp> struct Lam; template <class Fun, class Arg> struct App; 

рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ (рдЧрд▓рдд рд╡рд╛рд▓реЗ)

рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ Eval рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреБрдЫ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 template <class Exp, class Env> struct Eval; 

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

рдореВрд▓реНрдпрд╛рдВрдХрди рдФрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ

рдЕрдм, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдЖрдВрд╢рд┐рдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде, рд╣рдо рдШреЛрд╖рд┐рдд рд░реВрдк рд╕реЗ Eval рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЪрд░ рд╕рдВрджрд░реНрдн рдХреА рдЧрдгрдирд╛ Lookup рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдПрдХ рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреЛрдЬ рд╣реИ (рдпрд╣ result рдорд╛рдзреНрдпрдо рд╕реЗ рдореВрд▓реНрдп рд▓реМрдЯрд╛рддрд╛ рд╣реИ):
 template <char Var, class Env> struct Eval<Ref<Var>, Env> { typedef typename Lookup<Var, Env>::result value; }; 

рдЕрдореВрд░реНрдд рдЧрдгрдирд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо Closure рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ Closure ред рдПрдХ рдХреНрд▓реЛрдЬрд░ (рдЕрдирд╛рдо) рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:
 template <char Var, class Exp, class Env> struct Eval<Lam<Var, Exp>, Env> { typedef Closure<Lam<Var, Exp>, Env> value; }; 

рдХрд┐рд╕реА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо, рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рддрд░реНрдХ (рдЧрдгрдирд╛ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд) рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рдмрдВрдж рдХрд░ рд░рд╣рд╛ рд╣реИ:
 template <class Fun, class Arg, class Env> struct Eval<App<Fun, Arg>, Env> { typedef typename Apply<typename Eval<Fun, Env>::value, typename Eval<Arg, Env>::value>::result value; }; 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, Eval рдХреЗрд╡рд▓ Ref , Lam , App (рдФрд░ рджреВрд╕рд░реЗ рддрд░реНрдХ рд╡рд╛рд▓реЗ рд╡рд╛рддрд╛рд╡рд░рдг) рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдиреНрдп рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде Eval рдХреЙрд▓ рдмрд╕ рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдЪрд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдХреНрд▓реЛрдЬрд░ рдХреЗрд╡рд▓ рджреБрднрд╛рд╖рд┐рдпрд╛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ рдЬреЛ рджреЛ рдореВрд▓реНрдпреЛрдВ (рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдЗрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╡рд╛рддрд╛рд╡рд░рдг) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИрдВред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛:
 template <class Abs, class Env> struct Closure; 

рд▓реИрдореНрдмреНрдбрд╛ рдХреИрд▓рдХреБрд▓рд╕ рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ Apply рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред рдХреНрд▓реЛрдЬрд░ рдЙрдирдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ Bind рдЧрдгрдирд╛ рдХреА рдЧрдИ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХреЛ рдЙрд╕рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрд╛рдВрдзрдХрд░ рдмрдврд╝рд╛рддрд╛ рд╣реИ:
 template <class Fun, class Arg> struct Apply; template <char Var, class Exp, class Env, class Arg> struct Apply<Closure<Lam<Var, Exp>, Env>, Arg> { typedef typename Eval<Exp, Bind<Var, Arg, Env>>::value result; }; 
(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, Apply рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐рд╕реА рднреА рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдЕрдореВрд░реНрдд рдЖрд╡реЗрджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рд▓реБрдХрдЕрдк рдФрд░ рдмрд┐рдВрдж

рдпрд╣ рдкрд░реНрдпрд╛рд╡рд░рдг рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдЦрд╛рд▓реА рд╡рд╛рддрд╛рд╡рд░рдг рд░рдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛:
 struct NullEnv; 

рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ Bind рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рдирдП рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ Var рд╡реИрд░рд┐рдПрдмрд▓ Val рд╡реИрд▓реНрдпреВ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╢реЗрд╖ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рдорд╛рди Env рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:
 template <char Var, class Val, class Env> struct Bind; 
рд╣рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд▓рд┐рдВрдХреНрдб рд╕реВрдЪреА рдорд┐рд▓реАред

рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдпрд╣ рд╕реВрдЪреА рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдореЗрдВ рдЙрд╕реА рдирд╛рдо рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ред рдЦреЛрдЬ Lookup рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:
 template <char Var, class Env> struct Lookup; 

рдЦрд╛рд▓реА рдорд╛рд╣реМрд▓ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрддрд╛ред рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рд╡реЗрд╢ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдорд╛рди рд╣реИ, рддреЛ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рдПрдВред рдЕрдиреНрдпрдерд╛, рд╣рдо рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рд╢реЗрд╖ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ:
 template <char Var> struct Lookup<Var, NullEnv>; template <char Var, class Val, class Env> struct Lookup<Var, Bind<Var, Val, Env>> { typedef Val result; }; template <char Var, char OtherVar, class Val, class Env> struct Lookup<Var, Bind<OtherVar, Val, Env>> { typedef typename Lookup<Var, Env>::result result; }; 

рдЕрдВрдд

рдЗрд╕рд▓рд┐рдП, 50 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ, рд╣рдордиреЗ C ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реИрдореНрдмреНрдбрд╛ рдХреИрд▓рдХреБрд▓рд╕ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ C ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХреА рдЯреНрдпреВрд░рд┐рдВрдЧ рдкреВрд░реНрдгрддрд╛ рд╕рд╛рдмрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЙрдкрд▓рдмреНрдз рд╕реНрдореГрддрд┐ рдХреА рдЕрд╕реАрдорд┐рдд рдорд╛рддреНрд░рд╛ рдХреЗ рдЕрдзреАрди)ред

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

рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдкреНрд░рд╛рдкреНрдд рдХреНрд╖рдорддрд╛рдУрдВ ( рдкреВрд░реНрдг рдХреЛрдб ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд░рд▓ рдЧрдгрдирд╛ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
 /* ,   */ #include <iostream> int main() { // 1 = ╬╗fx.fx typedef Lam<'f', Lam<'x', App<Ref<'f'>, Ref<'x'>>>> One; // 2 = ╬╗fx.f (fx) typedef Lam<'f', Lam<'x', App<Ref<'f'>, App<Ref<'f'>, Ref<'x'>>>>> Two; // + = ╬╗ab.╬╗fx.af (bfx) typedef Lam<'a', Lam<'b', Lam<'f', Lam<'x', App<App<Ref<'a'>, Ref<'f'>>, App<App<Ref<'b'>, Ref<'f'>>, Ref<'x'>>> >>>> Plus; // Output := (+ 1 2) typedef Eval<App<App<Plus, One>, Two>, NullEnv>::value Output; // --...    ? Output::invalid_field; } 

 ilammy@ferocity ~/dev/tlc $ g++ -std=c++11 lc.cpp lc.cpp:   ┬лint main()┬╗: lc.cpp:79:5: :   ┬лOutput {aka Closure<Lam<'f', Lam<'x', App<App<Ref<'a'>, Ref<'f'> >, App<App<Ref<'b'>, Ref<'f'> >, Ref<'x'> > > > >, Bind<'b', Closure<Lam<'f', Lam<'x', App<Ref<'f'>, App<Ref<'f'>, Ref<'x'> > > > >, NullEnv>, Bind<'a', Closure<Lam<'f', Lam<'x', App<Ref<'f'>, Ref<'x'> > > >, NullEnv>, NullEnv> > >}┬╗      Output::invalid_field; ^ 

рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рддрд░реАрдХрд╛ рдЖрдо рддреМрд░ рдкрд░ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЖрд░рд╛рдорджрд╛рдпрдХ рдмрдирд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред


рдХрдИ рд╢рдмреНрджреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░

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

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

рджрд░рдЕрд╕рд▓, рдЕрдм рд╣рдорд╛рд░рд╛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗрд╡рд▓ рд╢реБрджреНрдз рд▓рдВрдмреЛ рдЧрдгрдирд╛рдУрдВ рдХреЛ рд╕рдордЭрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рд╕рд╛рд░, рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдФрд░ рдЪрд░ (рдЬреЛ рдЕрдореВрд░реНрдд рдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ) рд╣реИрдВред рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд▓реИрдореНрдмрдбрд╛ рд╢рдмреНрджреЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрди рддреАрди рдШрдЯрдХреЛрдВ рд╕реЗ рдмрдирд╛ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдирд┐рдпрдо рдХреЗ рдХрд┐рд╕реА рднреА рдЙрд▓реНрд▓рдВрдШрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред

рдЧрдгрдирд╛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд▓рд╛рдЧреВ рд▓реИрдореНрдмреНрдбрд╛ рдХреИрд▓рдХреБрд▓рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ - рдЗрд╕рдореЗрдВ рд╢рдмреНрджреЛрдВ рдХреЗ рд╕реЗрдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд┐рд╖рдп рд╕реЗрдЯ рдХреЗ рддрддреНрд╡реЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реЗ C ++ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрдВрдЧреЗред

рд╣рдо рдЙрдирдХреЗ рд▓рд┐рдП рдЗрд╕реА рд╢рдмреНрдж рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ:
 template <class T> struct Inj; 
рдпрд╣ рд▓реИрдореНрдмреНрдбрд╛ рдкрдерд░реА рдХреЗ рдХрдИ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдЯрд╛рдЗрдк T рдПрдХ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рднрд╛рд╖рд╛ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ - Eval рд╕рд╛рде рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдирдП рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЕрд░реНрде рдХреНрдпрд╛ рд╣реИред рдЦреИрд░ ... рдЪреВрдВрдХрд┐ T рдПрдХ рдордирдорд╛рдирд╛ рдореВрд▓реНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП Eval рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдореВрд▓реНрдп рдореМрдЬреВрдж рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЕрд░реНрде рдкрд╣рдЪрд╛рди рд╣реИ:
 template <class T, class Env> struct Eval<Inj<T>, Env> { typedef T value; }; 

рдЕрдм рд╣рдо рд╕рдВрдЦреНрдпрд╛рдУрдВ (рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдП рдЧрдП) рдХреЛ рддрд░реНрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 struct Zero { static const unsigned int interpretation = 0; }; 
рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдмрд╛рдХреА рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреИрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ рд╣рдо рдЪрд░реНрдЪ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп int рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрджрд┐ рдЖрдк рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╢реВрдиреНрдп рдПрди рдмрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдПрди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред

рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдХрд┐рд╕реА рддрд░рд╣ рд╣рдо рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП Succ (рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА) рдФрд░ Zero рдкрд╛рд╕ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗред рд╣рдо рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдХрд┐ рдЬрдм рдРрд╕рд╛ рдХреЛрдИ рдлрдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
 Eval<App<Inj<Succ>, Inj<Zero>>, Env>::value Apply<Eval<Inj<Succ>, Env>, Eval<Inj<Zero>, Env>>::result Apply<Succ, Zero>::result 
рдмрд┐рдВрдЧреЛ! Succ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП Apply рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ! (рдРрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдбреЗрд▓реНрдЯрд╛ рдирд┐рдпрдо рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред)

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 struct Succ; template <class N> struct Apply<Succ, N> { typedef struct _ { static const unsigned int interpretation = N::interpretation + 1; } result; }; 
Apply рд╣реЛрдиреЗ рдХрд╛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп result рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд Zero рд╕рдорд╛рди рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдЧреИрд░-рдорд╛рдирдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЗрд╕реА рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рдпрдорд┐рдд int рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИред

рдЕрдм рдЕрдВрдд рдореЗрдВ рдЖрдк рдЬреЛрдбрд╝ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! ( рдкреВрд░реНрдг рдХреЛрдб ред)
 /* ,   */ #include <iostream> int main() { // 1 = ╬╗fx.fx typedef Lam<'f', Lam<'x', App<Ref<'f'>, Ref<'x'>>>> One; // 2 = ╬╗fx.f (fx) typedef Lam<'f', Lam<'x', App<Ref<'f'>, App<Ref<'f'>, Ref<'x'>>>>> Two; // + = ╬╗ab.╬╗fx.af (bfx) typedef Lam<'a', Lam<'b', Lam<'f', Lam<'x', App<App<Ref<'a'>, Ref<'f'>>, App<App<Ref<'b'>, Ref<'f'>>, Ref<'x'>>> >>>> Plus; // Sum = (+ 1 2) typedef App<App<Plus, One>, Two> Sum; // Result := (Sum +1 =0) typedef App<App<Sum, Inj<Succ>>, Inj<Zero>> Output; typedef Eval<Output, NullEnv>::value Result; std::cout << Result::interpretation; } 

 ilammy@ferocity ~/dev/tlc $ g++ -std=c++11 lc.cpp ilammy@ferocity ~/dev/tlc $ ./a.out 3 

рд╡реИрд╢реНрд╡рд┐рдХ рдкрд░реНрдпрд╛рд╡рд░рдг рдФрд░ рдореБрдХреНрдд рдЪрд░

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

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреЛрдИ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рди рд╣реА рд░рдЦ рд╕рдХрддрд╛ рд╣реИред рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ , рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ( рдкреВрд░реНрдг рдХреЛрдб ):
 /* ... */ #include <iostream> int main() { /*  One, Two, Plus  */ // Unchurch = ╬╗n.(n +1 =0),     int typedef Lam<'n', App<App<Ref<'n'>, Ref<'I'>>, Ref<'O'>>> Unchurch; // Result := (Unchurch (+ 1 2)) typedef Eval<App<Ref<'U'>, App<App<Ref<'+'>, Ref<'1'>>, Ref<'2'>>>, Bind<'+', typename Eval<Plus, NullEnv>::value, Bind<'1', typename Eval<One, NullEnv>::value, Bind<'2', typename Eval<Two, NullEnv>::value, Bind<'U', typename Eval<Unchurch, Bind<'I', Succ, Bind<'O', Zero, NullEnv>> >::value, NullEnv>>>> >::value Result; std::cout << Result::interpretation; } 

рд╡рд╛рддрд╛рд╡рд░рдг рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреА рд╕реНрдореГрддрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдПрдХ рд▓рд┐рдВрдХрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдХрд▓рдХ рдерд╛, рддреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд╣рд╛рдВ рдЭреВрда рдмреЛрд▓рдирд╛ рд╣реЛрдЧрд╛ред рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡реЗ "рдкреВрд░реНрд╡-рдкрд░рд┐рдХрд▓рд┐рдд" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ - рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Eval рд╕реЗ рдЧреБрдЬрд░ рдЪреБрдХреЗ рд╣реИрдВред

рдПрдХ рдФрд░ Unchurch рдЬреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рд▓рд╛рдпрдХ рд╣реИ Unchurch рд╣реИ Unchurch рдореБрдлреНрдд рдЪрд░ред рд╡реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА Inj рдЖрд╕рдкрд╛рд╕ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рднреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреА рд╕реНрдореГрддрд┐ рдореЗрдВ рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдкрд╛рда рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рд▓рдВрдмреЛрджрд░ рд╢рдмреНрджреЛрдВ рдореЗрдВ)ред


рдореИрдХреНрд░реЛ

рдПрд▓рд┐рдпрди рд▓рд┐рдкреНрд╕ рд▓реЛрдЧреЛ
рдХрд┐рд╕реА рдиреЗ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рдХрдИ рддрд░реНрдХреЛрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреНрдпреВрд░реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдФрд░ рдпреЗ рд╕рднреА рд╕реНрдерд┐рд░рд╛рдВрдХ Ref<'foo'> ?

рдФрд░ рд╡реИрд╕реЗ, рд▓реИрдореНрдмреНрдбрд╛ рдХреИрд▓рдХреБрд▓рд╕ рдореЗрдВ рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдВрдХреНрд╖рд┐рдкреНрддрд╛рдХреНрд╖рд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:
рдХреЛрдХреЗ рдмрд╛рдж
╬╗xyz.B╬╗x.╬╗y.╬╗z.B
(Fxyz)(((xx) y) z)
рдЙрд╕реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

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

рджреЛ рдЪрд░рдг

рдЙрд╕ рдХреНрд╖рдг рддрдХ, рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдЬреАрд╡рди рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдШрдЯрдирд╛ рдереА - Eval рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдирдХреЗ рдореВрд▓реНрдп рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдгред рдЕрдм рдпрд╣ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдореИрдХреНрд░реЛ рд╡рд┐рд╕реНрддрд╛рд░ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред Eval рдЗрдирдкреБрдЯ рдХреЛ рдЦрд┐рд▓рд╛рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ Expand рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдПрдХ рдирдпрд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ Compute рдлрд╝рдВрдХреНрд╢рди рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЗрди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ:
 template <class Exp> struct Expand; template <class Exp, class Env> struct Compute { typedef typename Eval<typename Expand<Exp>::result, Env>::value value; }; 

Expand рдХреЗрд╡рд▓ рдПрдХ рддрд░реНрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдмреНрд▓реИрдХ рдмреЙрдХреНрд╕ рд╣реИ: рдЗрдирдкреБрдЯ рдкрд░, рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо, рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рдЙрдирдХреЗ рдмрд┐рдирд╛ред рд╣рдорд╛рд░реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд┐рд╕реА рднреА рдореИрдХреНрд░реЛрдЗрдиреНрд╡рд╛рдпрд░рдореЗрдВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдореИрдХреНрд░реЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдЕрдм рдореИрдХреНрд░реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ Expand рдЕрдВрджрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдореЗрдВ рдХреБрдЫ Lam_ рдФрд░ App_ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдХреЛрдХреЗ рдмрд╛рдж
Lam_<'x', 'y', ..., 'z', B>Lam<'x', Lam<'y', ..., Lam<'z', B>...>>
App_<A, B, C, ..., Z>App<...App<App<A, B>, C>, ..., Z>
App_<'a', ...>App_<Ref<'a'>, ...>
C ++ 11 рдореЗрдВ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреИрдЯрд░реНрди рджрд┐рдЦрд╛рдИ рджрд┐рдП рд╣реИрдВ, рдЬреЛ рдХрд╛рд░реНрдп рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред C ++ 03 рд╕рдВрдХрд▓рдХ рдХреЗ рдорд╛рд▓рд┐рдХ рдХреЗрд╡рд▓ рдПрдХ рд╣рдЬрд╛рд░ рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рдкреАрдбрд╝рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ: рджреЛ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП Lam_3 , рддреАрди рдХреЗ рд▓рд┐рдП App_4 , рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП App_4 , рдЖрджрд┐ред рдареАрдХ рд╣реИ, рдпрд╛ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рд╡рд┐рдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдПрдВред рджреЗрд╢реА рд╕реА ++ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ред

Lam_
рд╕рдЪ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реА ++ 11 рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреА рдЕрдкрдиреА рд╕реАрдорд╛рдПрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рджрд╛рдпрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛редрддрд░реНрдХреЛрдВ рдХрд╛ рдПрдХ рдмрдВрдбрд▓ рдХреЗрд╡рд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЕрдВрддрд┐рдо рддрд░реНрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ Lam_рдПрдХ рд╡рд┐рд╢реЗрд╖ "рддрд░реНрдХ рдзрд╛рд░рдХ" рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 template <char... Vars> struct Args; template <class Args, class Exp> struct Lam_; template <char Var, class Exp> struct Expand<Lam_<Args<Var>, Exp>> { typedef typename Expand<Lam<Var, Exp>>::result result; }; template <char Var, char... Vars, class Exp> struct Expand<Lam_<Args<Var, Vars...>, Exp>> { typedef Lam<Var, typename Expand<Lam_<Args<Vars...>, Exp>>::result> result; }; 

Expandрд╡рд┐рд╕реНрддрд╛рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдмрд╛рд░-рдмрд╛рд░ рдХреЙрд▓ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ ред рд╡реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ Expand<...>::result рдпрд╣ рд╣рдореЗрд╢рд╛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╢реБрджреНрдз рд▓рдВрдмреЛрджрд░ рд╢рдмреНрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ред

App_
рд╕рд╛рде рд╣реА, C ++ 11 рдЯреЗрдореНрдкрд▓реЗрдЯ рдПрдХ рдмрдВрдбрд▓ рдореЗрдВ рддрд░реНрдХ-рд╕рдВрдЦреНрдпрд╛ рдФрд░ рддрд░реНрдХ-рдкреНрд░рдХрд╛рд░ рдХреЛ рдорд┐рд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП App_рджреЛ рд╕рдВрдЧрдд рд╡рд┐рдХрд▓реНрдк рд╣реЛрдВрдЧреЗред Pechalkaред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди App_s(рд╡рд░реНрдгреЛрдВ рдХреЗ рд▓рд┐рдП) рдФрд░ App_i(рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП) рдЕрдзрд┐рдХ рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рддрд╣рдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдФрд░ рдХреЛрдб рдЫрд┐рдкреЗ рд╣реБрдП рд╣реИрдВред
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
. , -. . C++11 map , , . ( , map ? Anyone? )

 struct Nil; template <class First, class Rest> struct RefList; 

, . Ref :
 template <char... Vars> struct ToRefList_s; template <char Var> struct ToRefList_s<Var> { typedef RefList<Ref<Var>, Nil> result; }; template <char Var, char... Vars> struct ToRefList_s<Var, Vars...> { typedef RefList<Ref<Var>, typename ToRefList_s<Vars...>::result> result; }; 

, . .
 template <class... Exps> struct ToRefList_i; template <class Exp> struct ToRefList_i<Exp> { typedef RefList<Exp, Nil> result; }; template <class Exp, class... Exps> struct ToRefList_i<Exp, Exps...> { typedef RefList<Exp, typename ToRefList_i<Exps...>::result> result; }; 

. App_wrap тАФ ! RefList ┬л┬╗ App . тАФ ┬л┬╗ App , тАФ RefList .

RefList . . , ( Nil ).
 template <class Apps, class RefList> struct App_wrap; template <class A, class D, class R> struct App_wrap<Nil, RefList<A, RefList<D, R>>> { typedef typename App_wrap<App<A, D>, R>::result result; }; template <class Apps, class A> struct App_wrap<Apps, RefList<A, Nil>> { typedef typename App_wrap<App<Apps, A>, Nil>::result result; }; template <class Apps, class A, class D> struct App_wrap<Apps, RefList<A, D>> { typedef typename App_wrap<App<Apps, A>, D>::result result; }; template <class Apps> struct App_wrap<Apps, Nil> { typedef Apps result; }; 

? , .
рдЕрдВрддрддрдГ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд░рд▓ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд╡реЗ рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рддрд╣рдд рдорд╛рдирд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рдЧрдВрджреЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╡реЗ рдЦреБрдж рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдЪрд▓рд╛рддреЗ рд╣реИрдВ Expandрддрд╛рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдХреЛрдИ рдЕрдирд╕реБрд▓рдЭреА рдореИрдХреНрд░реЛрдЬрд╝ рди рдмрдЪреЗред
 template <char... Exps> struct App_s; template <class... Exps> struct App_i; template <char... Exps> struct Expand<App_s<Exps...>> { typedef typename Expand< typename App_wrap<Nil, typename ToRefList_s<Exps...>::result >::result >::result result; }; template <class... Exps> struct Expand<App_i<Exps...>> { typedef typename Expand< typename App_wrap<Nil, typename ToRefList_i<Exps...>::result >::result >::result result; }; 

рдмрд╛рдХреА
рдФрд░ рдЕрдВрддрд┐рдо рд▓реЗрдХрд┐рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬреЛрдбрд╝ред рд╡рд┐рд╕реНрддрд╛рд░рдХ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдЬрд╣рд╛рдВ рд╡реЗ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ:
 template <char Var> struct Expand<Ref<Var>> { typedef Ref<Var> result; }; template <char Var, class Exp> struct Expand<Lam<Var, Exp>> { typedef Lam<Var, typename Expand<Exp>::result> result; }; template <class Fun, class Arg> struct Expand<App<Fun, Arg>> { typedef App<typename Expand<Fun>::result, typename Expand<Arg>::result> result; }; 

рдЬреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдФрд░ рдЙрд╕ рдХрд╛рдо рдореЗрдВ Expandрд╕рдорд╛рдирддрд╛рдПрдВ рджреЗрдЦрд╛ ред ( рдкреВрд░реНрдг рдореИрдХреНрд░реЛ рд╕рдорд░реНрдерди рдХреЛрдб ред)EvalApply



рдкреНрд░рддреНрдпрд╛рд╡рд░реНрддрди

Self description
рдкрд░рд┐рдгрд╛рдореА рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдХреЗ рдЯреНрдпреВрд░рд┐рдВрдЧ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреВрд░реНрдгрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рд╛, рд╣рдо рдХрд┐рд╕реА рднреА рддрд░рд╣ рдПрдХ рдкрд▓ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рд╕рд░рд▓ рдЕрдВрдХрдЧрдгрд┐рдд рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реЛрддреЗ рд╣реИрдВред рдЖрдЦрд┐рд░рдХрд╛рд░, рдПрдХ рдЯреНрдпреВрд░рд┐рдВрдЧ-рдкреВрд░реНрдг рдкреНрд░рдгрд╛рд▓реА рдЖрдкрдХреЛ рдЪрдХреНрд░реЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ ! рд╣рдо рдПрдХ рдЧреБрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдг ( рдбреНрд░рдо рд░реЛрд▓ ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрдХреНрд░реАрдп рдЧрдгрдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ ред

рд▓реИрдореНрдмреНрдбрд╛ рдХреИрд▓рдХреБрд▓рд╕ рдореЗрдВ, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рд╕реАрдзреЗ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╛рд░ рдореЗрдВ рдирд╛рдореЛрдВ рдХреА рдХрдореА рд╣реИред рдЕрдкрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдЬрд╛рджреБрдИ рдСрдкрд░реЗрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ RecрдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рд╕рдорд╛рди рд╣реИ Lam, рд▓реЗрдХрд┐рди рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдЕрдореВрд░реНрдд рдмрдирд╛рддрд╛ рд╣реИ - рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрдореВрд░реНрдд рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЪрд╛рд▓рд╛рдХ рдЧрдгрд┐рддрдЬреНрдЮреЛрдВ рдиреЗ рдЗрд╕ рд╕реАрдорд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдПрдХ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬ рд▓рд┐рдпрд╛ рд╣реИ: рддрдерд╛рдХрдерд┐рдд рд╡рд╛рдИ-рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░рдирд┐рд╢реНрдЪрд┐рдд рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕рдореАрдХрд░рдгреЛрдВ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдкрд┐рдЫрд▓реЗ рд╡рд╛рдХреНрдп рдХреЛ рдХреИрд╕реЗ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдк рдХрд╣реАрдВ рдФрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╡рд╛рдИ-рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛рдП:
 // Y = ╬╗f.(╬╗x.f (xx)) (╬╗x.f (xx)) typedef Lam<'f', App<Lam<'x', App<Ref<'f'>, App_s<'x', 'x'>>>, Lam<'x', App<Ref<'f'>, App_s<'x', 'x'>>>>> Y; 

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

рдЕрдВрддрддрдГ, рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд░реНрдгреЛрдВ рд╕реЗ рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИрдВ рдФрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддреА рд╣реИрдВ StandardLibraryред рдЕрдм рдЖрдк рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдлреИрдХреНрдЯрд░рд┐рдпрд▓ рдХреЗ рд▓рд┐рдП рдЬрдирд░реЗрдЯрд┐рдВрдЧ рдлрдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ :
 // F = ╬╗fn.if (= n 0) 1 // (* n (f (- n 1))) typedef Lam_<Args<'f', 'n'>, App_i<Ref<'?'>, App_s<'=', 'n', '0'>, Ref<'1'>, App_i<Ref<'*'>, Ref<'n'>, App_i<Ref<'f'>, App_s<'-', 'n', '1'>>> > > Fact_gen; 

рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдПрдХ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ f- рддрдереНрдпрд╛рддреНрдордХ рдЧрдгрдирд╛ рдлрд╝рдВрдХреНрд╢рди (рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╛рдорд╛рдиреНрдп)ред рд╡рд╛рдИ Combinator рдХреА рднреВрдорд┐рдХрд╛ рдХрд┐ рд╕рдорд╛рд░реЛрд╣ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреА рд╣реИ Fact_genрдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ FactрдХреЗ рд▓рд┐рдП App<Fact_gen, Fact>тЙб Fact- рдпрд╣ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ "рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрд┐рдВрджреБ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдПред"

рдареАрдХ рд╣реИ, рдЖрдЗрдП рдЗрд╕ рд╕рдм рдХреЛ рдПрдХ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, (YF 1) рдХреА рдЧрдгрдирд╛ - рдЗрдХрд╛рдИ рдХреЗ рднрд╛рдЬреНрдп:
 /* ... */ #include <iostream> int main() { /*  Y  Fact_gen */ typedef Compute<App<Ref<'U'>, App_i<Y, Fact_gen, MakeChurch(1)> >, StandardLibrary>::value Result; std::cout << Result::interpretation; } 

 ilammy@ferocity ~/dev/tlc $ g++ -std=c++11 lc.cpp 2>&1 | wc -c 64596 

рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВред рдФрд░ 64 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рддреНрд░реБрдЯрд┐ рд▓реЙрдЧред рдХреНрдпреЛрдВ?

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

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

рдпрджрд┐ рдЖрдк gcc рджреНрд╡рд╛рд░рд╛ рд▓реЙрдЧ рдереВрдХ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐:
 struct Apply< Closure< Lam<'x', App<Ref<'f'>, App<Ref<'x'>, Ref<'x'>>>>, Bind<'f', Closure<Fact_gen, StandardLibrary>, StandardLibrary > >, Closure< Lam<'x', App<Ref<'f'>, App<Ref<'x'>, Ref<'x'>>>>, Bind<'f', Closure<Fact_gen, StandardLibrary>, StandardLibrary > > > 
рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ result, рдЕрд░реНрдерд╛рдд, рдЗрд╕ рдХреЙрд▓ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рд╕рдВрдХрд▓рдХ рдиреЗ рдЕрдВрддрд╣реАрди рдкреИрдЯрд░реНрди рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЪрдХреНрд░ рдХреЛ рджреЗрдЦрд╛ рдФрд░ рддреЛрдбрд╝ рджрд┐рдпрд╛, рдЬреЛ рдорд╛рдирдХ ( 14.7.1 / 15 ) рджреНрд╡рд╛рд░рд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ ред

C ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯреНрд╕ рдПрдкреЗрд░реЗрдЯрд┐рд╡ рдСрд░реНрдбрд░ рдореЗрдВ рдЧрдгрдирд╛ рднреА рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдлрдВрдХреНрд╢рди рдХреЙрд▓ typename Eval<Exp, Env>::valueрдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рдирд╛ рд╣реИред рдПрдХ Evalрддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ExpрдФрд░ Envред

рдЧрдгрдирд╛рдУрдВ рдХреЗ рдЖрд╡реЗрджрди рдХреЗ рдХреНрд░рдо рд╡рд╛рд▓реА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдЬреЗрдб-рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рд╡рд╛рдИ-рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдПрдХ рд╕рдВрд╢реЛрдзрди, рдЬрд┐рд╕рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ (xx)рдПрдХ рдЕрдореВрд░реНрдд рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕рдХреА рд╕рдордпрдкреВрд░реНрд╡ рдЧрдгрдирд╛ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ:
 // Z = ╬╗f.(╬╗x.f (╬╗y.xxy)) (╬╗x.f (╬╗y.xxy)) typedef Lam<'f', App<Lam<'x', App<Ref<'f'>, Lam<'y', App_s<'x', 'x', 'y'>>>>, Lam<'x', App<Ref<'f'>, Lam<'y', App_s<'x', 'x', 'y'>>>>>> Z; 

рдЕрдм рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпрд╛рдБ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣реА рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЗрд╕рдХрд╛ рдЕрдВрдд рднреАред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕ рдмрд╛рд░ рд╣рдордиреЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдкреАрдЫреЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдФрд░ рдЬрдмрд░рджрд╕реНрддреА рдЗрд╕реЗ рджреЛрдмрд╛рд░рд╛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ред рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рддрдереНрдпрд╛рддреНрдордХ рдХреЙрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕реЗ рд░реЛрдХреЛ!рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рднреА рдлреИрдХреНрдЯрд░рд┐рдпрд▓ рдХреЛ рдЦреБрдж рдореЗрдВ рдмрджрд▓рдирд╛ рдХрдм рдмрдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдЬрдм рд╣рдо рдЙрд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ If: рдЬрдм рдлреИрдХреНрдЯрд░рд┐рдпрд▓ рддрд░реНрдХ рд╢реВрдиреНрдп рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ If?

 typedef Lam_<Args<'c', 't', 'f'>, App_s<'c', 't', 'f'>> If; 

рдПрдХ рдЕрдореВрд░реНрдд рдХреА рддрд░рд╣ред рд╕рдм рдХреБрдЫ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ, рдЪрд░реНрдЪ рдмреБрд▓рд┐рдпрди рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдкрд░рд┐рднрд╛рд╖рд╛ ... рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рдХрдЯреМрддреА рдХреЗ рдЖрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ! рдЖрд╡реЗрджрди рдХреЗ рдХреНрд░рдо рдореЗрдВ, рдпрд╣ Ifрд╢рд░реНрдд рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рджреЛрдиреЛрдВ рд╢рд╛рдЦрд╛рдУрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдПрдХ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рддрд╛ рд╣реИред

рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЬреЗрдб-рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХреЗ рд╕рдорд╛рди рдПрдХ рддрд░рд╣ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд▓рдВрдмрд┐рдд рдЧрдгрдирд╛рдУрдВ рдХреЛ рдПрдХ рдЕрдореВрд░реНрдд рдореЗрдВ рд▓рдкреЗрдЯреЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, Ifрд╣рд╛рд▓рдд рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд┐рд░реНрдл рд▓рдкреЗрдЯрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрджрд┐ рдЖрд╡реЗрджрдХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕реЗ рдПрдХ рдореИрдХреНрд░реЛ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!
 template <class Cond, class Then, class Else> struct If; template <class Cond, class Then, class Else> struct Expand<If<Cond, Then, Else>> { typedef typename Expand< App_i<Cond, Lam<'u', Then>, Lam<'u', Else>, Lam<'u', Ref<'u'>> > >::result result; }; 

рдХрдбрд╝рд╛рдИ рд╕реЗ рдмреЛрд▓рддреЗ рд╣реБрдП, рдЪрд░ 'u'рдХреЛ рдХрд┐рд╕реА рднреА рдореБрдлреНрдд рдЪрд░ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП Thenрдпрд╛ Elseред рд╣рдорд╛рд░реА рдореИрдХреНрд░реЛ рдкреНрд░рдгрд╛рд▓реА рдРрд╕рд╛ рдЕрд╡рд╕рд░ (рд╕реНрд╡рдЪреНрдЫрддрд╛) рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЪрд░ рдирд╛рдо рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ 0рдХреЛ рдЧреИрд░-рдорд┐рд▓рд╛рди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ :
 template <char Var> struct Lookup<Var, NullEnv>; template <class Env> struct Lookup<0, Env>; template <char Var, class Val, class Env> struct Lookup<Var, Bind<Var, Val, Env>> { typedef Val result; }; 

рдЕрдм, рдЖрдЦрд┐рд░рдХрд╛рд░, рдлреИрдХреНрдЯрд░рд┐рдпрд▓ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред ( рдкреВрд░реНрдг рдХреЛрдб ред)

 ilammy@ferocity ~/dev/tlc $ time g++ -std=c++11 lc.cpp -DARG=6 real 0m12.630s user 0m11.979s sys 0m0.466s ilammy@ferocity ~/dev/tlc $ ./a.out 720 

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ рд╕рд╛рдд рдХреЗ рддрдереНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛, рдЗрд╕ рддрдереНрдп рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ 32-рдмрд┐рдЯ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдмрд╕ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рд╕реЗ рдорд░ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА! ..


рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╕реЗ рд╢рд╛рдпрдж рдХреЛрдИ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рд▓рд╛рдн рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдЪрд╛рд░ рд╣реА рдЖрдирдВрджрдордп рд╣реИред C ++ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬреНрдЮрд╛рди рдореЗрдВ "рдЧрд▓рддреА рд╕реЗ рдЯреНрдпреВрд░рд┐рдВрдЧ-рдкреВрд░реНрдг" рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдпрд╣реА рднрд╛рд╡рдирд╛ рдереА рдХрд┐ рдЬрдм рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ x86- рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдкреГрд╖реНрда рдкреНрд░рдмрдВрдзрди рд╕рдмрд╕рд┐рд╕реНрдЯрдо рднреА рдЯреНрдпреВрд░рд┐рдВрдЧ-рдкреВрд░реНрдг рд╣реИред рдпрджрд┐ рдпрд╣ рджреБрднрд╛рд╖рд┐рдпрд╛ рдЖрдкрдХреЛ рдПрдХрд▓ C ++ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ MMU рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдПрдХ рдорд╢реАрди рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

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

рдкреАрдПрд╕ рд╣рд░ рд╕рдордп, рдЬрдм рдореИрдВ рдПрдХ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦ рд░рд╣рд╛ рдерд╛, рддреЛ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдЫреЛрдбрд╝рд╛: "рдпрд╣ рдпрд╛ рддреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреВрд╕реНрдЯ рдореЗрдВ рд╣реИ, рдпрд╛ рд╡рд╣рд╛рдВ рддреАрди рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред"

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


All Articles