锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
涓銆佸湪C++涓彃鍏ヤ竴涓被VczhClass鍜屽嚱鏁皐rite銆亀riteln銆乺ead鍜宑ollect錛?
2 {
3 protected:
4 public:
5 VczhClass(FsPlugin* Plugin):FsClass(Plugin,L"interpreter_debug")
6 {
7 }
8
9 FsePluginInvoke CallConstructor(int ClassID , FsObject* Parameters , int ParamCount , FsObject& ErrorMessage , FsObject& Result)
10 {
11 GetConsole()->Write(L"VczhClass is creating.\r\n");
12 AddExternalMember(ClassID,L"MethodA",0);
13 AddExternalMember(ClassID,L"MethodB",1);
14 AddExternalMember(ClassID,L"MethodC",2);
15 return fsSuccess;
16 }
17
18 FsePluginInvoke CallMember(int ClassID , int ExternalMemberID , FsObject* Parameters , int ParamCount , FsObject& ErrorMessage , FsObject& Result)
19 {
20 switch(GetMemberID(ExternalMemberID))
21 {
22 case 0:
23 GetConsole()->Write(L"VczhClass::MethodA is invoking.\r\n");
24 break;
25 case 1:
26 GetConsole()->Write(L"VczhClass::MethodB is invoking.\r\n");
27 break;
28 case 2:
29 GetConsole()->Write(L"VczhClass::MethodC is invoking.\r\n");
30 break;
31 }
32 return fsSuccess;
33 }
34
35 void CallDestructor(int ClassID)
36 {
37 GetConsole()->Write(L"VczhClass is destroying.\r\n");
38 }
39 };
40
41 class VczhConsole : public FsPlugin
42 {
43 protected:
44 FsObject FWrite;
45 FsObject FWriteLine;
46 FsObject FRead;
47 FsObject FCollect;
48 VczhClass* FVczhClass;
49
50 VUnicodeString Transform(const FsObject& Value)
51 {
52 return Value.GetReadableString().w_str();
53 }
54 public:
55 VczhConsole(FsEngine* Engine , VUnicodeString CodePath):FsPlugin(Engine,L"interpreter")
56 {
57 FWrite =Engine->CreateExternalResource();
58 FWriteLine =Engine->CreateExternalResource();
59 FRead =Engine->CreateExternalResource();
60 FCollect =Engine->CreateExternalResource();
61
62 GetEnvironment().SetFixedVariable(L"write",FWrite);
63 GetEnvironment().SetFixedVariable(L"writeln",FWriteLine);
64 GetEnvironment().SetFixedVariable(L"read",FRead);
65 GetEnvironment().SetFixedVariable(L"collect",FCollect);
66 GetEnvironment().SetVariable(L"apppath",Engine->CreateString(CodePath.Buffer()));
67 GetEnvironment().SetFixedVariable(L"vmpath",Engine->CreateString(GetConsole()->GetAppPath().Buffer()));
68
69 #ifdef _DEBUG
70 FVczhClass=new VczhClass(this);
71 GetEnvironment().SetFixedVariable(L"VczhClass",FVczhClass->GetCtor());
72 #else
73 FVczhClass=0;
74 #endif
75 }
76
77 ~VczhConsole()
78 {
79 if(FVczhClass)
80 {
81 delete FVczhClass;
82 }
83 }
84
85 FsePluginInvoke Invoke(int ExternalID , FsObject* Parameters , int ParamCount , FsObject& ErrorMessage , FsObject& Result)
86 {
87 if(ExternalID==FWrite.GetExternalID())
88 {
89 for(VInt i=0;i<ParamCount;i++)
90 {
91 GetConsole()->Write(Transform(Parameters[i]));
92 }
93 return fsSuccess;
94 }
95 else if(ExternalID==FWriteLine.GetExternalID())
96 {
97 for(VInt i=0;i<ParamCount;i++)
98 {
99 GetConsole()->Write(Transform(Parameters[i]));
100 }
101 GetConsole()->Write(L"\r\n");
102 return fsSuccess;
103 }
104 else if(ExternalID==FRead.GetExternalID())
105 {
106 for(VInt i=0;i<ParamCount;i++)
107 {
108 GetConsole()->Write(Transform(Parameters[i]));
109 }
110 VUnicodeString Read;
111 GetConsole()->Read(Read);
112 Result=GetOwnedEngine()->CreateString(Read.Buffer());
113 return fsSuccess;
114 }
115 else if(ExternalID==FCollect.GetExternalID())
116 {
117 int* Buffer=0;
118 int Count=GetOwnedEngine()->CollectGarbage(Buffer);
119 FsReleaseBuffer(Buffer);
120 return fsSuccess;
121 }
122 else
123 {
124 return fsGiveUp;
125 }
126 }
127 };
浜屻佷功鍐欐祴璇曠敤鐨勮剼鏈唬鐮侊細(xì)
2 {
3 a=VczhClass.new();
4 a.MethodA();
5 a.MethodB();
6 a.MethodC();
7 }();
8 collect();
涓夈佽繍琛岀粨鏋滐細(xì)
2 VczhClass::MethodA is invoking.
3 VczhClass::MethodB is invoking.
4 VczhClass::MethodC is invoking.
5 VczhClass is destroying.
鍥涖佸鏋渁鐨勬垚鍛樿淇濆瓨璧鋒潵浜嗘庝箞鍔炲憿錛?
2 func()
3 {
4 a=VczhClass.new();
5 a.MethodA();
6 a.MethodB();
7 a.MethodC();
8 b=a.constructor;
9 }();
10 collect();
浜斻佺粨鏋滄槸鍥犱負(fù)b榪樿兘緇х畫浣跨敤錛屾墍浠灝變笉浼?xì)閿姣侊紙鍨冨溇鏀墮泦鍣ㄨВ鍐充簡榪欎釜闂錛夛細(xì)
2 VczhClass::MethodA is invoking.
3 VczhClass::MethodB is invoking.
4 VczhClass::MethodC is invoking.
鍒頒簡榪欓噷錛屼竴涓洿鎺ュ線鑴氭湰涓彃鍏ョ被鐨勬紨紺哄氨緇撴潫浜嗐傛帴涓嬫潵灝辨槸瀵硅繖涓彃浠惰繘琛屾祴璇曪紝騫朵笖鍦ㄧ浉搴旂殑.NET鎺ュ彛涓婃坊鍔犺繖鏍風(fēng)殑鏀寔銆?
榪欎釜鏂扮殑Syngram鍖呭惈浜嗕笁涓伐鍏鳳紝鍒嗗埆鏄鍒欒〃杈懼紡銆佽瘝娉曞垎鏋愬櫒鍜岃娉曞垎鏋愬櫒銆?
姝e垯琛ㄨ揪寮忓垎綰佸畨鍏ㄥ拰璐┆涓夌銆傜函姝e垯琛ㄨ揪寮忎粎浠呯敤浜庡尮閰嶏紝閫熷害闈炲父蹇紙浠ュ墠鐨勬祴璇曡〃鏄庝竴縐掗挓鍙互鍖歸厤44涓囨錛夛紝浣嗘槸娌℃湁棰勬煡鍜屾崟鑾風(fēng)瓑鍔熻兘銆傚畨鍏ㄥ拰璐┆涓ょ姝e垯琛ㄨ揪寮忓垯鏄氳繃涓嶅悓鐨勬悳绱㈡柟娉曟潵鍖歸厤瀛楃涓茬殑鍐呭錛岃櫧鐒舵參浜嗕竴鐐癸紝涓嶈繃鏈変簡棰勬煡鍜屾崟鑾風(fēng)瓑鍔熻兘銆備箣鍓嶇殑鏂囩珷鏈夋彁鍒拌繃鍏充簬涓涓皯鍥炴函澶氭崟鑾風(fēng)殑嫻嬭瘯鐢ㄤ緥涓嬬殑閫熷害銆傚畨鍏ㄥ垎鏋愭硶鍥炴函灝嗕細(xì)鍗犵敤寰堝鏃墮棿錛岃岃椽濠垎鏋愭硶鍒欏洖婧熀鏈槸娌′粈涔堟秷鑰楃殑銆?
璇嶆硶鍒嗘瀽鍣ㄥ垯鍙互杈撳叆涓嶅悓鐨勬鍒欒〃杈懼紡錛岀劧鍚庡皢瀛楃涓插垏鍓叉垚鍖歸厤鍜屼笉鍖歸厤鐨勬钀斤紝騫跺憡璇変綘鍖歸厤鐨勯儴鍒嗗疄闄呬笂鏄尮閰嶄簡鍝竴鏉℃鍒欒〃杈懼紡銆傝繖涓姛鑳藉湪鍒嗘瀽寰堝瀛楃涓茬殑鏃跺欓兘鏄浉褰撳ソ鐢ㄧ殑銆?
鑷充簬璇硶鍒嗘瀽鍣紝鍒欐槸瀹炵幇浜嗕竴涓笂涓嬫枃鏃犲叧鏂囨硶搴撱傝娉?nbsp; 闃呰鍏ㄦ枃
class浠ュ強(qiáng)namespace閮芥槸閫氳繃鍦╮eturn鐨勮煩杞洰鏍囧悗娣誨姞鎸囦護(hù)鑰屼繚璇乺eturn緇撴潫浣嗘槸涓嶄慨鏀筩lass鍜宯amespace琛ㄨ揪寮忕殑榪斿洖鍊箋?
class鍑芥暟鐨勫弬鏁版槸鐖剁被鐨勬瀯閫犲瓙錛宑lass鍑芥暟鍦ㄦ墍鏈変唬鐮佷箣鍓嶉鍏堟瀯閫犲ソ涓涓埗綾葷殑閾捐〃錛岀劧鍚庨氳繃InsertEnv灝嗚繖涓〃寮曠敤鍒拌嚜宸辮韓涓婏紝浠庤屽疄鐜頒簡姝g‘鐨剆cope銆傜劧鍚庤constructor涓虹┖鍑芥暟銆侰lassName.new()鐨勬椂鍊欓鍏堣繍琛宑lass鍑芥暟錛堜嬌鐢╟allctor鑰屼笉鏄痠nvoke鏉ヨ嚜鍔ㄦ壘鍒扮埗綾誨茍娣誨姞鍒板弬鏁頒腑錛夛紝鐒跺悗澶嶅埗鍫嗘爤錛岃幏鍙朿onstruct 闃呰鍏ㄦ枃
瀹為檯涓婂湪鐩墠鐨勭粨鏋勪腑娣誨姞namespace騫朵笉澶嶆潅錛屽洜涓簄amespace涔熷彲浠ョ敤闂寘鏉ユā鎷熴傚叾瀹為棴鍖呬笉浠呬粎鏄嚱鏁幫紝鑰屾槸涓孌靛甫浜嗕笂涓嬫枃鐨勬寚浠よ〃銆傚洜涓簄amespace鏈韓涔熸槸鐢ㄤ簬鎺у埗絎﹀彿鍦ㄤ笂涓嬫枃涓В閲婃柟娉曞伐鍏鳳紝鍥犳浣跨敤闂寘鏉ュ仛涔熷氨鏄崄鍒嗗悎閫傜殑浜嗐傛兂鍒頒互鍓嶆槸鐢ㄩ棴鍖呮ā鎷焎lass鐨勬椂鍊欙紝鏇劇粡瀹炵幇浜嗕竴涓妸涓鍫嗙幆澧冮摼鎺ュ埌涓婁笅鏂囦腑鐨勬寚浠ゃ傜被鐨勭戶鎵垮疄闄呬笂涔熸槸鎺у埗絎﹀彿鍦ㄧ被鎴愬憳鍑芥暟鐨勭鍙峰湪涓婁笅鏂囪В閲婃柟娉曠殑宸ュ叿錛屽洜姝ゆ垜浣跨敤浜嗗涓嬫柟娉曟潵璁╅棴鍖呭彲浠ラ『鍒╁湴妯℃嫙class鐨勭戶鎵匡細(xì) 闃呰鍏ㄦ枃