ObjectScript рдПрдХ рдирдпрд╛ рдУрдкрди рд╕реЛрд░реНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ рд╣реИред ObjectScript рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рд▓реБрдЖ рдФрд░ PHP рдЬреИрд╕реА рднрд╛рд╖рд╛рдУрдВ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред
рднрд╛рдЧ 3: C ++ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛
рдЖрдЗрдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВ рдЬреЛ рдУрдПрд╕ рдХреЛрдб рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред рд╣рдо рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛
рджреЛ рдХрд╛рд░реНрдп:
isdigit
рдЬрд╛рдБрдЪ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкрд╛рд░рд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдВрдЦреНрдпрд╛рдПрдБ рд╣реИрдВhash
рд╣рдорд╛рд░реЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╣реИрд╢ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ C ++ рдореЗрдВ рд╣рдорд╛рд░реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдкрд╣рд▓рд╛ рд╣реИ
my_isdigit
:
static int my_isdigit(OS * os, int params, int, int, void*) { OS::String str = os->toString(-params); int len = str.getLen(); for(int i = 0; i < len; i++){ if(!isdigit(str[i])){ os->pushBool(false); return 1; } } os->pushBool(len > 0); return 1; }
рдмрд┐рд▓ рдкрд░ рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг:
OS::String str = os->toString(-params);
рдпрд╣рд╛рдВ рд╣рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдорд┐рд▓рддрд╛ рд╣реИред
params
рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬреЛ OS рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЧрдП рдереЗред
-params
рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рд╕реНрдЯреИрдХ рдкрд░ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реВрдЪрдХ рд╣реИред рдпрджрд┐ рд╣рдореЗрдВ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдУрд░ рдореБрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
os->toString(-params+1)
, рддреАрд╕рд░реЗ рдХреЛ -
os->toString(-params+2)
, рдЖрджрд┐ред
C ++ API рд╕реНрдЯреИрдХ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
toFloat, toDouble, toInt, toString, toUserdata, popFloat
, рдЖрджрд┐ред
рдХрднреА-рдХрднреА рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрдЯреИрдХ рдХрд╛ рдХрд╛рдо C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд╛рдкреЗрдХреНрд╖ рдСрдлрд╝рд╕реЗрдЯреНрд╕ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рди рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП (рдЪреВрдВрдХрд┐ рд╡реЗ рдХреБрдЫ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдпрд╛ рд╕реНрдЯреИрдХ рд╕реЗ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдмрджрд▓ рдЬрд╛рдПрдВрдЧреЗ), рд╕реНрдЯреИрдХ рдкрд░ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░рдкреЗрдХреНрд╖ рд╕реВрдЪрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЗрд╕реЗ
getAbsoluteOffs(int offs)
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдВ:
int params_offs = os->getAbsoluteOffs(-params); OS::String str = os->toString(params_offs);
рдпрд╣ рдПрдХ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдерд╛, рдЕрдм рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рджреВрд╕рд░рд╛ рдХрд╛рд░реНрдп
my_hash
:
static int my_hash(OS * os, int params, int, int, void*) { OS::String str = os->toString(-params); int i, len = str.getLen(), hash = 5381; for(i = 0; i < len; i++){ hash = ((hash << 5) + hash) + str[i]; } hash &= 0x7fffffff; char buf[16]; for(i = 0; hash > 0; hash >>= 4){ buf[i++] = "0123456789abcdef"[hash & 0xf]; } buf[i] = 0; os->pushString(buf); return 1; }
рдмрд┐рд▓ рдкрд░ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╡реНрдпрд╛рдЦреНрдпрд╛:
return 1;
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рддреИрдпрд╛рд░ рд╣реИрдВ, рдЕрдм рд╣рдореЗрдВ рдУрдПрд╕ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдореЙрдбреНрдпреВрд▓ рд╣реИ:
void initMyModule(OS * os) { OS::FuncDef funcs[] = { {"isdigit", my_isdigit}, {"hash", my_hash}, {} }; os->getModule("my"); os->setFuncs(funcs); os->pop(); }
рдЕрдм рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдУрдПрд╕ (main.os) рдкрд░ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦреЗрдВ, рдЬреЛ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рдХреЗ рд▓рд┐рдП C ++ рдореЗрдВ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛:
for(var i, s in ["123", "12w", 1234, " df", " "]){ print("my.isdigit("..s..") = "my.isdigit(s)" my.hash("..s..") = "my.hash(s)) }
рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛:
my.isdigit(123) = true my.hash(123) = bf9878b my.isdigit(12w) = false my.hash(12w) = f3a878b my.isdigit(1234) = true my.hash(1234) = f89c87c7 my.isdigit( df) = false my.hash( df) = f48478b my.isdigit( ) = false my.hash( ) = 5082f6c7
C ++ рдореЗрдВ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб:
#include "objectscript.h" #include <ctype.h> using namespace ObjectScript; static int my_isdigit(OS * os, int params, int, int, void*) { OS::String str = os->toString(-params); int len = str.getLen(); for(int i = 0; i < len; i++){ if(!isdigit(str[i])){ os->pushBool(false); return 1; } } os->pushBool(len > 0); return 1; } static int my_hash(OS * os, int params, int, int, void*) { OS::String str = os->toString(-params); int i, len = str.getLen(), hash = 5381; for(i = 0; i < len; i++){ hash = ((hash << 5) + hash) + str[i]; } char buf[16]; hash &= 0x7fffffff; for(i = 0; hash > 0; hash >>= 4){ buf[i++] = "0123456789abcdef"[hash & 0xf]; } buf[i] = 0; os->pushString(buf); return 1; } void initMyModule(OS * os) { OS::FuncDef funcs[] = { {"isdigit", my_isdigit}, {"hash", my_hash}, {} }; os->getModule("my"); os->setFuncs(funcs); os->pop(); } void main() { OS * os = OS::create(); initMyModule(os); os->require("main.os"); os->release(); }
рдЖрдк
рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ
рд╣реИрдВ ,
proj.win32 \ example.sln ,
add_user_module рдкреНрд░реЛрдЬреЗрдХреНрдЯ
рдЦреЛрд▓реЗрдВ ред
ObjectScript рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреНрдп рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд▓реЗрдЦ:
PS OS::String
рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдУрдкрд╕ OS::String
OS :: рд╕реНрдЯреНрд░рд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕реЗ рдХрд╕реНрдЯрдо C ++ рдХреЛрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдкрдиреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд╕рднреА рд╕рдордп рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдз рдореВрд▓реНрдп рд░рдЦрддреА рд╣реИред рдПрдХ рд╢реВрдиреНрдп-рд╕рдорд╛рдкреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
toChar()
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред ObjectScript рдореЗрдореЛрд░реА рдореЗрдВ рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рд╛рдЗрдиреЛрдВ
рдХреЛ рдПрдХ рд╣реА рдХреЙрдкреА рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП
OS::String
рдПрдХ рд╕реНрдерд┐рд░ рд▓рд╛рдЗрди рд╣реИ, рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдПрдХ рдирдИ рд▓рд╛рдЗрди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
OS::String
рдХрдИ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдФрд░ рдПрдХ рдХреЙрдиреНрдЯреИрдХреНрд╢рди рдСрдкрд░реЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП
OS::String
рдХреЛ рдпреВрдЬрд░ рдХреЛрдб рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ)ред
рдкреНрд░рд╢реНрди: OS::String
os->release()
рд╕реЗ рдкрд╣рд▓реЗ рдЕрдЧрд░
OS::String
os->release()
рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛
os->release()
OS::String
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд
OS::String
рдХреЛ рдирд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
A: OS :: рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдХ OS рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкрдХрдбрд╝рддреА рд╣реИ, рдпрд╣ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рд╣рд░реА рдХреЛрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП,
os->release()
OS рдЖрд╡реГрддреНрддрд┐ рдХреЛ рдирд╖реНрдЯ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо
OS::String
рдореМрдЬреВрдж рд╣реЛрдиреЗ рдкрд░ рдпрд╣ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред