рдирдорд╕реНрдХрд╛рд░ рд╕рд╛рдерд┐рдпреЛрдВ!
рдореИрдВ рдЖрдкрдХреЛ рдЕрдкрдиреА рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВ рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ
рд▓реБрдЖ рд╕реЗ рдорд┐рд▓рд╛ рдерд╛ рдЬрдм рдореИрдВ рдПрдХ рдПрдореНрдмреЗрдбреЗрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬреЛ рдЖрдХрд╛рд░ рдФрд░ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдорд╛рдореВрд▓реА рд╣реЛред рд▓реБрдЖ рди рдХреЗрд╡рд▓ рдЗрди рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЕрдкрдиреА рдЕрджреНрднреБрдд рд╕рд╛рджрдЧреА рдФрд░ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд╕рд╛рде рдордиреЛрд░рдо рд╣реЛрддрд╛ рд╣реИред
рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рдХрд┐ рдореИрдВ рд▓реБрдЖ рдПрдкреАрдЖрдИ рд╕реЗ рдЕрд╕рдВрддреБрд╖реНрдЯ рд╣реВрдВ: рдпрд╣ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд╕реЗрдЯ рд╣реИ, рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рднрд╛рд╖рд╛ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдХреЛрдИ рдХрдард┐рдирд╛рдИ рдирд╣реАрдВ рд╣реБрдИ, рдФрд░ рдХреЛрдИ "рдиреБрдХрд╕рд╛рди" рднреА рдирд╣реАрдВ рд╣реБрдЖред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдЗрд╕ рд╕реА-рдЙрдиреНрдореБрдЦ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдирд╣реАрдВ рдЫреЛрдбрд╝рд╛ рдЧрдпрд╛ рдХрд┐ рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддреА рд╣реИред рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рд░реИрдкрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдкрд╣рд▓рд╛ рдкреНрд░рдпрд╛рд╕ рд╡рд┐рдлрд▓ рд░рд╣рд╛: рдЙрдкрд▓рдмреНрдз рдзрди рдХреЗ рд╕рд╛рде, рдореИрдВ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрд╛ рдЬреЛ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдпреЛрдЧреНрдп рд╣реЛ, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдмреЛрдЭрд┐рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ред
рдФрд░ рдлрд┐рд░
рд╕реА ++ 11 рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ , рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рд░реЛрдХрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ - рдЬреЛ рдпрд╛рдж рдЖ рд░рд╣реА рдереА рдЙрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛), рдФрд░ рдкрд╣реЗрд▓реА рдзреАрд░реЗ-рдзреАрд░реЗ рдЖрдХрд╛рд░ рд▓реЗрдиреЗ рд▓рдЧреАред рджреВрд╕рд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рдлрд▓ рд░рд╣рд╛, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдореИрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдСрдкрд░реЗрд╢рди рдХреЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рдлреА рд╣рд▓реНрдХрд╛ рдЖрд╡рд░рдг рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ
Lua API ++ рдХрд╣рд╛ рд╣реИ, рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп Lua API рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрд╡рд╛ рдХрд░рдирд╛ рд╣реИред рд▓реБрдЖ рд╡рд░реНрдХрд╢реЙрдк рдореЗрдВ рдореЗрд░реА рдкреНрд░рд╕реНрддреБрддрд┐ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдпрд╣ рд▓реЗрдЦ, рдЖрдкрдХреЛ рд▓реБрдЖ рдПрдкреАрдЖрдИ ++ рдХреА рдореВрд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдФрд░ рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
рдкреНрд░рдореБрдЦ рдЕрднрд┐рдиреЗрддрд╛
рдкреБрд╕реНрддрдХрд╛рд▓рдп рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдмреБрдирд┐рдпрд╛рджреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, рдпреЗ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд╣реЛрддреА рд╣реИрдВред
State
State
рд▓реБрдЖ рд░рд╛рдЬреНрдп рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИред рдпрд╣ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдкреНрд░рдХрд╛рд░ рд╣реИ, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рд╕реЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд░рд╛рдЬреНрдп рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╡рд┐рдирд╛рд╢ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдлрд╛рдЗрд▓реЛрдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдФрд░ рд▓реБрдЖ-рд╕рдВрдЧрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕рд╛рдзрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЙрдирдХреЗ рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрдкрд╡рд╛рджреЛрдВ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИрдВред
LFunction
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ
LFunction
рдЕрдВрджрд░ рд╣реЛрддрд╛ рд╣реИ, Lua API ++ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рд╛рд░реВрдк рдХреЗ рдХрд╛рд░реНрдпред рдпрд╣ рд▓реБрдЖ-рд╕рдВрдЧрдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИ, рдЬрд┐рд╕реЗ рдмрджрд▓реЗ рдореЗрдВ рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
CFunction
ред рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рдЕрдЧрд▓реЗ рдЪрд░рд┐рддреНрд░ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рд░реВрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА:
Context
Context
рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд▓реБрдЖ рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рдХреЗрдВрджреНрд░ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде, рдЖрдк рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░, рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ,
рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдФрд░
upvalues рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛, рд╕рд┐рдЧреНрдирд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХрдИ рд░рд┐рдЯрд░реНрди рдорд╛рди рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЛрд╖ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ,
Context
рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╣ рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕реАрдзреЗ рдЙрди рдореВрд▓реНрдпреЛрдВ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдЕрдиреБрдЧрд╛рдореА рдХреЗ рдкреНрд░рдореБрдЦ рд╣реИрдВ:
рдореВрд▓реНрдп
рдкрд┐рдЫрд▓реА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╡рд░реНрдЧ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реБрдЖ рдПрдкреАрдЖрдИ ++ рдореЗрдВ "рдореВрд▓реНрдп" рдХреБрдЫ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐
Value
рд╡рд░реНрдЧ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореМрдЬреВрдж рд╣реИ)ред рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ "рдУрдкрди рдмреЙрд░реНрдбрд░реНрд╕" рдиреАрддрд┐ рдХреЗ рдХрд╛рд░рдг рд╣реИ, рдЬреЛ рд▓реБрдЖ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдореЗрдВ рдореВрд▓ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдореБрдлреНрдд рдкреНрд░рд╡рд╛рд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЬрд╣рд╛рдВ рдХрд╣реАрдВ рднреА рд▓реБрдЖ рдореВрд▓реНрдпреЛрдВ рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛рддреА рд╣реИ, рдЖрдк рд╕рдорд░реНрдерд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдореВрд▓ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реБрдЖ рд╕реНрдЯреИрдХ рдореЗрдВ "рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд" рд╣реЛрдВрдЧреЗред рд╡рд┐рдкрд░реАрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдСрдкрд░реЗрдЯрд░ рдЖрдкрдХреЛ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдпрджрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдЕрд╕рдВрдЧрдд рд╣реИрдВ, рддреЛ рд╡реЗ рд╣рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рд╕реВрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓реБрдЖ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ, рдЙрдирдХреА рдЙрддреНрдкрддреНрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореВрд▓реНрдпреЛрдВ рдкрд░ рд╕рднреА рд╡реИрдз рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ: рджреЗрд╢реА рдкреНрд░рдХрд╛рд░, рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓, рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ, рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди, рддреБрд▓рдирд╛, рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ, рд▓реЗрдЦрди рдФрд░ рдореЗрдЯрд╛рдЯреИрдмрд▓реНрд╕ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдгред
Valref
рдпрд╣ рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦреЗ рдЧрдП рдорд╛рди рдХрд╛ рд▓рд┐рдВрдХ рд╣реИ, рдпрд╛ рдпреВрдБ рдХрд╣реЗрдВ рдХрд┐ рд▓реБрдЖ рд╕реНрдЯреИрдХ рдкрд░ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрд▓реЙрдЯ рдХреЗ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдирд╣реАрдВ рд╣реИред
Valref
рд╕реНрдЯреИрдХ рдкрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд░рдЦрдиреЗ рдпрд╛ рд╣рдЯрд╛рдиреЗ
Valref
рд╕рд╛рде
Valref
рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдореВрд▓реНрдп рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред Lua API ++
Valref
рдПрдХ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред
рдЕрд╕реНрдерд╛рдпреА
рдЕрд╕реНрдерд╛рдпреА рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛ рдСрдкрд░реЗрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ, рдпрд╣ рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдпреЗ рд╡реЗ рдорд╛рди рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕реНрдЯреИрдХ рдкрд░
рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдпрд╛ рдирд╣реАрдВ),
рдПрдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдлрд┐рд░ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдСрдкрд░реЗрд╢рди рдХреЗ рддрд░реНрдХ рд╕реНрд╡рдпрдВ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдлрд▓рддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдХреЗ рдмрд┐рдирд╛ рднреАред рдФрд░ рдЙрдкрдпреЛрдЧ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдЬрдм рд╕реНрдЯреИрдХ рдкрд░ рдкрдврд╝рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдиреБрдХреНрд░рдордг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреБрдВрдЬреА рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдирдпрд╛ рдорд╛рди рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд▓реЗрдЦрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХреБрдВрдЬреА рдФрд░ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдП рдЧрдП рдорд╛рди рдХреЛ рд╕реНрдЯреИрдХ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрдЪрд╛рд▓рди рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдХреЗ рдЖрджреЗрд╢ рдХрд╛ рдХрдбрд╝рд╛рдИ рд╕реЗ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдФрд░ рдЕрдкреНрд░рдпреБрдХреНрдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?
рдХрдИ рд▓реЛрдЧ рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рдореБрдЭреЗ рдХреНрдпрд╛ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред рдЕрд╕реНрдерд╛рдпреА рдорд╛рдиреЛрдВ рдХреЛ рдкреНрд░реЙрдХреНрд╕реА рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗ рдЕрджреГрд╢реНрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░
Valref
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди, рд╕рд░рд▓ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЧрд▓рддреА рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдВрдХрд▓рдХ рдЖрдкрдХреЛ рдХреЛрдг рдХреЗ рдХреЛрд╖реНрдардХ рд╕реЗ рднрд░рд╛, рдПрдХ рдЬреНрд╡рд╛рд▓рд╛рдореБрдЦреАрдп рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде "рдХреГрдкрдпрд╛" рдХрд░реЗрдЧрд╛ред
рдПрдВрдХрд░
рдПрдВрдХрд░реЛрдВ рдХрд╛ рдирд╛рдо рдЗрд╕рд▓рд┐рдП рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЖрдкрдХреЛ рдвреЗрд░ рдореЗрдВ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдорд╛рди "рдкрд┐рди" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
Value
рдПрдХ рдПрдХрд▓ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ "рд▓рдВрдЧрд░" рд╣реИ,
Table
рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рдФрд░
Valset
рдХрдИ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
рдЕрдм рдЬрдм рдореБрдЦреНрдп рдкрд╛рддреНрд░ рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдирдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
State
State
рдкрд╛рд╕ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рдВрджрд░реНрдн рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд┐рд░реНрдорд╛рддрд╛ рдЖрдкрдХреЛ рдПрдХ
рдХрд╕реНрдЯрдо рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛
рд╣реИ ред рдЖрдк
getRawState
рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ Lua API рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рд░рд╛рдЬреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реЗрдЯ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕
runFile
,
runString
рдФрд░
call
, рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рд╕рд░рд▓ рджреБрднрд╛рд╖рд┐рдпрд╛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ:
рд╕рдмрд╕реЗ рд╕рд░рд▓ рджреБрднрд╛рд╖рд┐рдпрд╛ #include <iostream> #include <luapp/lua.hpp> using namespace std; using namespace lua; void interpretLine(State& state, const string& line) { try { state.runString(line); // } catch(std::exception& e) { // cerr << e.what() << endl; } } void interpretStream(State& state, istream& in) { string currentLine; while(!in.eof()) { // getline(in, currentLine); interpretLine(state, currentLine); } } int main() { State state; interpretStream(state, cin); }
рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓реБрдЖ рдХреЗ рдкреИрд░реЛрдВ рдХреЗ рдиреАрдЪреЗ рдирд╣реАрдВ рдЬрд╛рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╛ рддреЛ рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдЬреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд╣реА рдЬреБрдбрд╝реЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ
Table
рд╕реЗ
Table
рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдЬрд┐рдиреНрд╣реЗрдВ (рд╕рдВрднрд╡рддрдГ) рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдореЗрдВ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред , рдЯрд╛рдЗрдкрдХрд╛рд╕реНрдЯрд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рддрд░рд╣ред рд▓рд╛рдпрдмреНрд░реЗрд░реА рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рд▓реБрдЖ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдкреНрд░рдпрд╛рд╕, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдореВрд▓реНрдп рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдПрдХ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдЙрдард╛рдПрдЧрд╛ред рдпрд╣
lua_call
рдХреЙрд▓ рдХреЗ рдЕрдВрджрд░ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдПрдХ Lua- рд╢реИрд▓реА рддреНрд░реБрдЯрд┐ (рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рд╡реНрдпрд╡рдзрд╛рди рдФрд░ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХреЙрд▓ рдХреЗ рдирд┐рдХрдЯрддрдо рдмрд┐рдВрджреБ рдкрд░ рд▓реМрдЯрдиреЗ) рдХрд╛ рдХрд╛рд░рдг рдмрдиреЗрдЧрд╛ред
LFunction
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ "рдкрд╛рд░рджрд░реНрд╢реА" рдЖрд╡рд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдорд░реНрдерд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ (рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ) рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕реАрдзреЗ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рдмрддрд╛рдПрдВ рдЬрд╣рд╛рдВ Lua рдорд╛рди рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо Lua API ++ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╕рднреА Lua рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреЗрдХреНрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ L- рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:
Retval myFunc(Context& c);
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: рд╣рдорд╛рд░рд╛ рдлрд╝рдВрдХреНрд╢рди
Context
рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░
Retval
рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ
Context::ret
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
mkcf
рдЯреЗрдореНрдкрд▓реЗрдЯ рдЖрдкрдХреЛ
LFunction
рд╕рд╛рде Lua рджреЛрд╕реНрдд рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
int (*myCfunc)(lua_State*) = mkcf<myFunc>;
рдЗрд╕ рддрд░рд╣ рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд░реИрдкрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ "рдкрд╛рд░рджрд░реНрд╢реА" рдЖрд╡рд░рдг рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдУрд╡рд░рд╣реЗрдб рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛ред рджреВрд╕рд░реА рдУрд░,
mkcf
рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЖрд╡рд░рдг рд╕рдорд╛рд░реЛрд╣ рдмрдирд╛рдПрдЧрд╛ред
рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, "рдЖрд╡рд░рдг" рдПрдХ
Context
рд╡рд╕реНрддреБ рдмрдирд╛рдПрдЧрд╛, рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдЧрд╛, рдФрд░ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░
Retval
рд╕реЗ
Retval
рдорд╛рдзреНрдпрдо рд╕реЗ
Retval
рдЧрдП рдорд╛рдиреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдЧрд╛ред рд▓рд┐рдкрдЯреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдПрдХ рд▓реБрдЖ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд╣реА рд▓реМрдЯ рд░рд╣рд╛ рд╣реИ? рдореБрдЭреЗ рджреЛ! Retval retSelf(Context& c) { return c.ret(retSelf, mkcf<retSelf>);
Context
рдлрд╝рдВрдХреНрд╢рди рд╕рдВрджрд░реНрдн рд▓реБрдЖ рдХреЗ рд▓рд┐рдП рдХреЗрдВрджреНрд░реАрдп рдПрдХреНрд╕реЗрд╕ рдиреЛрдб рд╣реИред рд╕рдм рдХреБрдЫ рдЬреЛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рд╕реАрдзреЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рдХреЙрдиреНрд╕реЗрдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ
рджреЗрд╡ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдирддрд╛ рдХреЗ рд╕рдВрдХреЗрдд рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реБрдЖ рдПрдкреАрдЖрдИ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рджреНрд╡рд╛рд░рд╛ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
Context
рдорд╛рдзреНрдпрдо рд╕реЗ
Context
рдЖрдк рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦреЗ рдЧрдП рдорд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЛ рд╕реАрдзреЗ рд▓реБрдЖ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде
lua_State*
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рддреЛ рдЗрд╕реЗ
lua_State*
рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЬрд╛рджреВ рд╢рдмреНрдж (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдПрдХ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╕реНрдерд┐рд░ рд╕реНрдерд┐рд░рд╛рдВрдХ)
initializeExplicitly
рдХрд┐рдпрд╛ рдЬрд╛рддрд╛
initializeExplicitly
рдЬреЛ рдХрд┐
initializeExplicitly
, рдЬреЛ рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ,
LFunction
рдмрд╛рд╣рд░,
Context
рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдорд╛рди рд▓реМрдЯрд╛рдПрдВ
рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐
рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИред рдореБрдЭреЗ рджреЛ рдирд┐рдХрдЯрддрдо рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдирд╛ рдерд╛: рдПрдХ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдЕрддрд┐рднрд╛рд░рд┐рдд рдСрдкрд░реЗрдЯрд░ рдпрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдЪрд╛рд▓рд╛рдХ "рд╕реНрдЯрд╛рд░реНрдЯрд░"ред
рдореИрддреНрд░реА рд╕рдорд╛рд░реЛрд╣ рдЬреАрддрд╛ред рдЗрд╕рд▓рд┐рдП,
LFunction
рдХреЛ
LFunction
рд╡рд╛рдкрд╕
LFunction
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк рдХреЗрд╡рд▓ рд╡рд┐рдирдореНрд░ рдирд╛рдо рдХреЗ рд╕рд╛рде
Context
рд╡рд┐рдзрд┐ рддрдХ
LFunction
рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдп рд╣реИ: рдЗрд╕реЗ рдХрд╣рд╛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЗрд╕рд╕реЗ рджреВрд░ рди рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓
рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
ret
рдХреЙрд▓ рдореЗрдВ, рдЖрдк рдЙрддрдиреЗ рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рддрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рддреБрд▓рдирд╛ return ctx.ret(1, "two", three);
рд╕рдорддреБрд▓реНрдп рдХреЛрдб:
lua_pushinteger(ctx, 1); lua_pushstring(ctx, "two"); lua_pushvalue(ctx, three); return 3;
рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐
рдпрд╣ рддрд░реНрдХ рджреЗрддреЗ рд╣реБрдП рдХрд┐
Retval
рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛
Retval
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдореИрдВрдиреЗ рд╕рдЪреНрдЪрд╛рдИ рдХреЗ рдЦрд┐рд▓рд╛рдл рдкрд╛рдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╣реИ ... рдФрдкрдЪрд╛рд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ,
error
рдлрд╝рдВрдХреНрд╢рди рднреА рд╣реИ, рдЬреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рднреА рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
Retval
рдирд┐рд░реНрдорд╛рдг рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдХреЛрдИ рд╡рд╛рдкрд╕реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЕрдзрд┐рдХрддрдо рдЖрдк рдЬрд┐рд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡рд╣ рд╣реИ рд▓реБрдЖ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЗрдВрдЬрди рдХреЛ рдЕрдкрдирд╛ рд╕рдВрджреЗрд╢ рджреЗрдирд╛ред Lua API рдкреНрд░рд▓реЗрдЦрди
рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ
lua_error
рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╕рдВрдХреЗрдд рдорд┐рд▓ рд╕рдХреЗ рдХрд┐ рдХреЙрд▓ рдХреЗ рджреМрд░рд╛рди рдлрд╝рдВрдХреНрд╢рди рдмрд╛рдзрд┐рдд рд╣реИред рдЙрд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ Lua API ++ рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП
error
Retval
рд░реВрдк
error
рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдХ Lua рдорд╛рди рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рд╕рдорд╡рд░реНрддреА рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛, рдЦрд╛рд╕рдХрд░
where
рдлрд╝рдВрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рдкрдВрдХреНрддрд┐ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рд╕рдВрджреЗрд╢ рдмрд┐рд▓реНрдХреБрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕рдорд╛рди рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
if(verbose) return ctx.error(ctx.where() & " intentional error " & 42); else return ctx.error();
рд╕рдорддреБрд▓реНрдп рдХреВрдЯ if(verbose) { luaL_where(ctx, 0); lua_pushstring(ctx, " intentional error "); lua_pushinteger(ctx, 42); lua_concat(ctx, 3); return lua_error(ctx); } else { luaL_where(ctx, 0); return lua_error(ctx); }
рдкрд░реНрдпрд╛рд╡рд░рдг рддрдХ рдкрд╣реБрдВрдЪ
рд╣рдорд╛рд░рд╛
Context
рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рд╕реНрд░реЛрдд рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡реЗ рдФрд░ рдХрд╣рд╛рдБ рд╕реЗ рдЖ рд╕рдХрддреЗ рд╣реИрдВ?
рд╣рдореЗрдВ
Context
рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдПрдХреНрд╕реЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рд╡рд┐рднрд┐рдиреНрди рджрд┐рд▓рдЪрд╕реНрдк рд╕реНрдерд╛рдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рд╡реЗ рд╕рднреА рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпреЗ
args
, рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рд╣реИрдВред рдЕрдиреНрдп рдПрдХреНрд╕реЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ рджреБрд░реНрдЧрдо рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣рд╛рдВ рд╕рд╛рдорд╛рдиреНрдп
Valset
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреА рдХрдореА рдХрд╛ рдорддрд▓рдм рдХреЗрд╡рд▓ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЗ рд▓рд┐рдП рддрд░реНрдХреЛрдВ рдХрд╛ рдЕрд░реНрде рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╡рд▓рд╕реЗрдЯ рдХреЛ рдПрд╕рдЯреАрдПрд▓-рд╕рдВрдЧрдд рдХрдВрдЯреЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 0. рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реБрдЖ рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдиреБрдХреНрд░рдордг 1 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
if(ctx.args.size() > 1 && ctx.args[0].is<string>()) {...};
рд╕рдорддреБрд▓реНрдп рдХреВрдЯ if(nArgs > 1 && lua_isstring(ctx, 1) ) {...};
рджреВрд╕рд░реЗ рд╕реНрдерд╛рди рдкрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред
global
рд╡рд╕реНрддреБ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
ctx.global["answer"] = 42;
рд╕рдорддреБрд▓реНрдп рдХреВрдЯ lua_pushinteger(ctx, 42); lua_setglobal(ctx, "answer");
рдпрджрд┐ рд╣рдорд╛рд░рд╛ LFunction рднреА рдмрдВрдж рд╣реИ, рддреЛ рд╣рдо рдкреВрд░реНрдгрд╛рдВрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде
upvalues
рдорд╛рдзреНрдпрдо рд╕реЗ
upvalues
рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ (1 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реИ)ред рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд╛рдирдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ: рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреНрдЮрд╛рдд рд╣реИред
рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рд▓реБрдЖ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛рдЯреИрдмрд▓реНрд╕ рдХреЛ рд╡рд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдорд╛рдиреЛрдВ рдХреЗ рднрдВрдбрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдкреВрд░реНрдгрд╛рдВрдХ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
registry.store
рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ
registry.store
рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдорд╛рди рдХреЛ рдорд┐рдЯрд╛рддреЗ рд╣реБрдП рдФрд░ рдЬрдм
nil
рд▓рд┐рдЦрд╛
nil
рд╣реИ, рддрдм рдХреБрдВрдЬреА рдЬрд╛рд░реА рд╣реЛрддреА рд╣реИред
auto k = ctx.registry.store(ctx.upvalues[1]);
рд╕рдорддреБрд▓реНрдп рдХреВрдЯ lua_pushvalue(ctx, lua_upvalueindex(1)); auto k = luaL_ref(ctx, LUA_REGISTRYINDEX); luaL_unref(ctx, LUA_REGISTRYINDEX, k);
рдХрд╛рд░реНрдпреЛрдВ
рдореИрдВрдиреЗ рдЕрднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рд▓реБрдЖ рдЖрдкрдХреЛ рдХреНрд▓реЛрдЬрд░ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
Context
рд╡рд╕реНрддреБ рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП
closure
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐
CFunction
рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЬреЛ рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкрд░рд┐рдгрд╛рдо рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╡рд╕реНрддреБ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдПрдХ рдкреВрд░реНрдг рд▓реБрдЖ рдорд╛рдиред
CFunction
рдмрдЬрд╛рдп
CFunction
рд╣рдо
LFunction
рддреБрд░рдВрдд рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рд▓рдкрдЯ рдХреА рдЕрдкрдиреА рдХреАрдордд рд╣реИред рдкрд╣рд▓реЗ рдЙрддреНрдерд╛рди рдХреЛ рдкрд░рд┐рдгрд╛рдореА рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рдЖрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рд╡рд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрд╡рд░рдг рдХрд┐рд╕реА рднреА LFunction рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИ)ред рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде
LFunction
рдкрд╛рд░рджрд░реНрд╢реА рдкреНрд░рд╡рд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣
mkcf
рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рдЕрдВрддрд░ рд╣реИ, рдЬреЛ рдХреБрдЫ рднреА рдЖрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЖрд╡рд░рдг рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИред
рдЖрдк рд╡рд┐рдЦрдВрдбреВ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ: рд╕рдВрдХрд▓рд┐рдд рд▓реБрдЖ рдХреЛрдбред рдкрд╛рда рдХреЛ рд╕реНрд╡рдпрдВ
chunk
рд╡рд┐рдзрд┐, рдФрд░
load
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред "рдкреВрд░реНрдг рдФрд░ рд╡рд┐рд╕реНрдореГрдд" рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП
runString
рдФрд░
runFile
, рдмрд┐рд▓реНрдХреБрд▓
State
рдХреЗ рд╕рдорд╛рдиред рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдЭреВрдордирд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред
wrap
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд╕рдВрдЧрдд рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдХреНрд▓реЛрдЬрд░ рднреА рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЖрд╡рд░рдг рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд▓реБрдЖ рд╕реНрдЯреИрдХ рд╕реЗ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд╣рдорд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЧрдП рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд▓реМрд╡рд╛ рд╕реНрдЯреИрдХ рдкрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рд╕рд╣рд┐рдд рд╕рднреА рд╕рдорд░реНрдерд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ
vector
рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
, рддреЛ рд╣рдо рдПрдХ рджрд┐рд╢рд╛ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ wrap
рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред vwrap
рд╡рд┐рдзрд┐ рд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫ рдПрдХ рд╣реА рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рд▓рд┐рдкрдЯреЗ рдЬрд╛ рд░рд╣реЗ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдп рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИред
рдорд╛рди рдкрд▓рд╛рдпрди
Lua API ++ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореВрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ:
рд╕рдВрдЦреНрдпрд╛рддреНрдордХ |
---|
int |
unsigned int |
long long |
unsigned long long |
float |
double |
рддрд╛рд░ |
---|
const char* |
std::string |
рдХрд╛рд░реНрдпреЛрдВ |
---|
CFunction: int (*) (lua_State*) |
LFunction: Retval (*) (Context&) |
рдордирдорд╛рдирд╛ рдХрд╛рд░реНрдп |
рд╕рджрд╕реНрдп рдХрд╛рд░реНрдп |
рдЕрдиреЗрдХ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ |
---|
Nil |
bool |
LightUserData: void* |
рдкрдВрдЬреАрдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХрд╛рд░ |
рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдорд╛рди рд▓реБрдЖ рд╕реНрдЯреИрдХ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд (рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, Nil
рдФрд░ "рд▓рд┐рдкрдЯреЗ" рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд░реИрдкрд░ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдмрдиреЗ рд╣реБрдП рд╣реИрдВ)ред
рд░рд┐рд╡рд░реНрд╕ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ cast
рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ Lua рдорд╛рди рдореЗрдВ рдбреЗрдЯрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред optcast
рдлрд╝рдВрдХреНрд╢рди рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдмрдЬрд╛рдп "рдлрд╝реЙрд▓рдмреИрдХ" рдорд╛рди рд▓реМрдЯрд╛рдПрдЧрд╛ред
int a = val; auto b = val.cast<int>(); auto c = val.optcast<int>(42);
рд╕рдорддреБрд▓реНрдп рдХреВрдЯ if(!lua_isnumber(ctx, valIdx)){ lua_pushstring(ctx, "Conversion error"); return lua_error(ctx); } int a = lua_tointeger(ctx, valIdx); if(!lua_isnumber(ctx, valIdx)){ lua_pushstring(ctx, "Conversion error"); return lua_error(ctx); } auto b = lua_tointeger(ctx, valIdx); auto c = lua_isnumber(ctx, valIdx) ? lua_tointeger(ctx, valIdx) : 42;
рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ type
рд╕рд╛рде, рд╕реАрдзреЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред
if(val.is<double>()) ...; if(val.type() == ValueTypes::Number) ...;
рдПрдХрд▓ рдореВрд▓реНрдп рд╕рдВрдЪрд╛рд▓рди
рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ
рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореВрд▓реНрдп рд╣реИ, рддреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк рдЗрд╕реЗ рдХреБрдЫ рдореВрд▓реНрдп, рдЕрдиреНрдп рдореВрд▓реНрдп рдФрд░ рдореВрд▓ рдирд┐рд╡рд╛рд╕реА рджреЛрдиреЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рдЕрд╕реНрдерд╛рдпреА рдореВрд▓реНрдпреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдпрд╛ рд▓рдВрдмрд╛рдИ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП: рдмрд╛рдИрдВ рдУрд░ =
рдЪрд┐рд╣реНрди рд╣реЛрдиреЗ рдкрд░, рд╡реЗ рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдЕрд╕реНрдерд╛рдпреА рдореВрд▓реНрдп, рдЬреИрд╕реЗ рдХрд┐ рдЕрдиреБрдХреНрд░рдордг рдпрд╛ рдПрдХ рдореЗрдЯрд╛рдмрд▓, рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд╛рдлреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред рдкреНрд░рджрд░реНрд╢рди рдХреА рдЧрдИ рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрд░реНрде рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВред
metatables
mt
рд╡рд┐рдзрд┐ рдПрдХ рдореВрд▓реНрдп рдХреЗ рдореЗрдЯрд┐рдмреЗрдЯ рддрдХ рдкрд╣реБрдВрдЪ рджреЗрддреА рд╣реИ рдЬрд┐рд╕реЗ рдкрдврд╝рд╛ рдФрд░ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
{ Table mt = val.mt(); val.mt() = nil; }
рд╕рдорддреБрд▓реНрдп рдХреВрдЯ if(!lua_getmetatable(ctx, valIdx)){ lua_pushstring(ctx, "The value has no metatable"); return lua_error(ctx); } int mtIdx = lua_gettop(ctx); lua_pushnil(ctx); lua_setmetatable(ctx, valIdx); lua_pop(ctx, 1);
рд▓рдВрдмрд╛рдИ
len
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд▓реБрдЖ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ: 5.1 рд╕рдВрдЧрддрддрд╛ рдореЛрдб рдореЗрдВ, рдпрд╣ рджреЗрд╢реА size_t
рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ 5.2 рдореЛрдб рдореЗрдВ рдпрд╣ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдЕрдиреБрдХреНрд░рдордг
рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдкреНрд░рдореБрдЦ рддрддреНрд╡реЛрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдордг рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдХреБрдВрдЬреА рдХрд┐рд╕реА рднреА рд╕рдорд░реНрдерд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рд╣реЛ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬрдм рд░реИрдкрд┐рдВрдЧ рдлрдВрдХреНрд╢рдВрд╕, рдирдП рдХреНрд▓реЛрдЬрд░ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗ:
void myFunc(); Retval example(Context& c) { Table t(c); t[myFunc] = 42;
рд╕рдорддреБрд▓реНрдп рдХреВрдЯ void myFunc(); int wrapped_void_void(lua_State* s) { if(!lua_islightuserdata(ctx, lua_upvalueindex(1))) { lua_pushstring(ctx, "Conversion error"); return lua_error(ctx); } void (*fptr) () = reinterpret_cast<void(*)()>(lua_touserdata(ctx, lua_upvalueindex(1))); fptr(); return 0; } int mkcf_myFunc(lua_State* s) { myFunc(); return 0; } int example(lua_State* ctx) { lua_createtable(ctx, 0, 0); int t = lua_gettop(ctx); lua_pushlightuserdata(ctx, reinterpret_cast<void*>(&myFunc)); lua_pushcclosure(ctx, &wrapped_void_void, 1); lua_pushinteger(ctx, 42); lua_settable(ctx, t); lua_pushlightuserdata(ctx, reinterpret_cast<void*>(&myFunc)); lua_pushcclosure(ctx, &wrapped_void_void, 1); lua_gettable(ctx, t); assert(lua_isnil(ctx, -1)); lua_pushcfunction(ctx, &mkcf_myFunc); lua_pushnumber(ctx, 42.42); lua_settable(ctx, t); lua_pushcfunction(ctx, &mkcf_myFunc); lua_gettable(ctx, t); lua_pushnumber(ctx, 42.42); int result = lua_compare(ctx, -1, -2, LUA_OPEQ); lua_pop(ctx, 2); assert(result == 1); }
рдлрдВрдХреНрд╢рди рдХреЙрд▓
Lua рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рдпрдорд┐рдд рдХреЛрд╖реНрдардХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ call
рд╡рд┐рдзрд┐ рд╣реИ, рдпрджрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рдЕрдзрд┐рдХ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ pcall
рдХреЙрд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред
int x = fn(1); int y = fn.call(1);
рдПрдХрд╛рдзрд┐рдХ рд╡рд╛рдкрд╕реА рдорд╛рди
рд╣рдордиреЗ рдЕрднреА рджреЗрдЦрд╛ рдХрд┐ рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдХрдИ рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Lua рдкрд░ рдРрд╕рд╛ рдХрд╛рд░реНрдп рдХрд░реЗрдВ: function mrv() return 2, 3, 4; end
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рде рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк рдХреЙрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рднреА рд▓реМрдЯреЗ рдорд╛рдиреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
mrv();
рд╕рдорддреБрд▓реНрдп рдХреВрдЯ lua_pushvalue(ctx, mrvIdx); lua_call(ctx, 0, 0);
рджреВрд╕рд░реЗ, рдЖрдк рдирд┐рдпрдорд┐рдд Lua рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдордВрдЧрд▓рд╛рдЪрд░рдг рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддрдм рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рд▓реМрдЯреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдпрд╛ nil
рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдиреЗ рдХреБрдЫ рднреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ), рдФрд░ рдмрд╛рдХреА рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
Value x = mrv();
рд╕рдорддреБрд▓реНрдп рдХреВрдЯ lua_pushvalue(ctx, mrvIdx); lua_call(ctx, 0, 1); int x = lua_gettop(ctx);
рддреАрд╕рд░рд╛, рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рд╕рдВрджрд░реНрдн рдореЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░), рдХреЙрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: рд▓реМрдЯреЗ рдорд╛рди рдЕрдиреБрдХреНрд░рдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрди рдЬрд╛рдПрдВрдЧреЗред
print(1, mrv(), 5);
рд╕рдорддреБрд▓реНрдп рдХреВрдЯ lua_pushvalue(ctx, printIdx); int oldtop = lua_gettop(ctx); lua_pushinteger(ctx, 1); lua_pushvalue(ctx, mrvIdx); lua_call(ctx, 0, LUA_MULTRET); lua_pushinteger(ctx, 5); int nArgs = lua_gettop(ctx) - oldtop; lua_call(ctx, nArgs, 0);
рдЪреМрдерд╛, рдЖрдк рдХреЗрд╡рд▓ Valset
рдХреЛ рд╕рдм рдХреБрдЫ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
Valset vs = mrv.pcall();
рд╕рдорддреБрд▓реНрдп рдХреВрдЯ int vsBegin = lua_gettop(ctx) + 1; lua_pushvalue(ctx, mrvIdx); bool vsSuccess = lua_pcall(ctx, 0, LUA_MULTRET) == LUA_OK; int vsSize = lua_gettop(ctx) + 1 - vsBegin;
Valset
рдпрд╣ рднреА рдпрд╛рдж рд░рдЦреЗрдЧрд╛ рдХрд┐ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХреЙрд▓ рд╕рдлрд▓ рдерд╛ (рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ)ред рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ, Valset
рдЙрд╕реА рддрд░рд╣ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ рдЬреИрд╕реЗ рдХреЙрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдиред
print(1, vs, 5);
рд╕рдорддреБрд▓реНрдп рдХреВрдЯ lua_pushvalue(ctx, printIdx); int oldTop = lua_gettop(ctx); lua_pushInteger(ctx, 1); lua_pushvalue(ctx, mrvIdx); for(auto i = 0; i < vsSize; ++i) lua_pushvalue(ctx, vsBegin + i); lua_pushinteger(ctx, 5); int nArgs = lua_gettop(ctx) - oldtop; lua_call(ctx, nArgs, 0);
Valset
. STL- STL, ┬л┬╗ Valref
. Valset
, push_back
pop_back
. Valref
, ( Valset
), . , .
, Value- , :
string s = "The answer to question " & val & " is " & 42;
lua_pushstring(ctx, "The answer to question "); lua_pushvalue(ctx, valIdx); lua_pushstring(ctx, " is "); lua_pushinteger(ctx, 42); lua_concat(ctx, 4); string s = lua_tostring(ctx, -1); lua_pop(ctx, 1);
& . , ┬л┬╗ . , Valset
.
Lua, .
5.2 , , ┬л┬╗ ^
.
, Table
, Valref
. , , , . raw
, , , iterate
, for_each
. , iterate
( , , ), -. Valref
true
, false
, . :
Table t = ctx.global["myTable"]; t.iterate([] (Valref k, Valref v) { cout << int(k) << int(v); });
lua_getglobal(ctx, "myTable"); if(!lua_istable(ctx, -1)){ lua_pushstring(ctx, "Conversion error"); return lua_error(ctx); } int t = lua_gettop(ctx); lua_pushnil(ctx); size_t visited = 0; while(lua_next(ctx, t)) { ++ visited; if(!lua_isnumber(ctx, -2) || !lua_isnumber(ctx, -1)){ lua_pushstring(ctx, "Conversion error"); return lua_error(ctx); } cout << lua_tointeger(ctx, -2) << lua_tointeger(ctx, -1); lua_pop(ctx, 1); }
iterate
.
Table
тАФ array
records
. .
fn(Table::array(ctx, "one", 42, Table::array(ctx, 1, 2, 3)));
lua_pushvalue(ctx, fn); lua_createtable(ctx, 3, 0); lua_pushinteger(ctx, 1); lua_pushstring(ctx, "one"); lua_settable(ctx, -3); lua_pushinteger(ctx, 2); lua_pushinteger(ctx, 42); lua_settable(ctx, -3); lua_pushinteger(ctx, 3); lua_createtable(ctx, 3, 0); lua_pushinteger(ctx, 1); lua_pushinteger(ctx, 1); lua_settable(ctx, -3); lua_pushinteger(ctx, 2); lua_pushinteger(ctx, 2); lua_settable(ctx, -3); lua_pushinteger(ctx, 3); lua_pushinteger(ctx, 3); lua_settable(ctx, -3); lua_settable(ctx, -3); lua_call(ctx, 1, 0);
, . , array
, 1. , Valset
.
records
, -. .
x.mt() = Table::records(ctx, "__index", xRead, "__newindex", xWrite, "__gc", xDestroy );
lua_createtable(ctx, 0, 3); lua_pushstring(ctx, "__index"); lua_pushlightuserdata(ctx, reinterpret_cast<void*>(&xRead)); lua_pushcclosure(ctx, &wrapped_signature_1, 1); lua_settable(ctx, -3); lua_pushstring(ctx, "__newindex"); lua_pushlightuserdata(ctx, reinterpret_cast<void*>(&xWrite)); lua_pushcclosure(ctx, &wrapped_signature_2, 1); lua_settable(ctx, -3); lua_pushstring(ctx, "__gc"); lua_pushlightuserdata(ctx, reinterpret_cast<void*>(&xDestroy)); lua_pushcclosure(ctx, &wrapped_signature_3, 1); lua_settable(ctx, -3); lua_setmetatable(ctx, x);
. - , : , cast
, .
. LUAPP_USERDATA
. , , . , registry
-, :
LUAPP_USERDATA(MyType, "MyType Lua ID") Retval setup(Context& ctx) { ctx.mt<MyType>() = Table::records(ctx);
Lua . , , ┬л┬╗ , тАФ .
Lua , Lua . Lua API++ placement new , , . POD-. , , .
. , -, , . , Lua , :
#include <vector> using dvec = std::vector<double>; // LUAPP_USERDATA(dvec, "Number array") // dvec aCreate(size_t size) // . { // - . return dvec(size); // RVO } void aDestroy(dvec& self) // - . { self.~dvec(); } void aWrite(dvec& self, size_t index, double val) // __newindex { self.at(index) = val; // at, Lua } Retval setup(Context& c) { // c.mt<dvec>() = Table::records(c, // "__index", static_cast<double& (dvec::*)(size_t)> (&dvec::at), // at // (const -const), "__newindex", aWrite, "__len", dvec::size, // size vector , "__gc", aDestroy ); c.global["createArray"] = aCreate; // return c.ret(); }
рдирд┐рд╖реНрдХрд░реНрд╖
, Lua . Lua API ++, . Lua Lua API (coroutine, string buffers, ).
, Lua API, Lua. inline
, Lua API , , Link time code generation (LTO GCC). header-only. inline
Lua.
, C++11 , Lua STL. Boost Unit Test Framework .
Lua 5.2 ( 5.3 ), 5.1, LuaJIT.
Lua API++ MIT тАФ , Lua, . HTML, .
, - .