锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 涓婃鏈変漢鏉ヨ姹傛垜鍐欎竴綃囨枃绔犺皥璋堜粈涔堜唬鐮佹墠鏄ソ浠g爜錛屾槸璋佹垜宸茬粡蹇樿浜嗭紝濂藉儚鏄疉utoHotkey榪樻槸鍟ョ殑涓撴爮鐨勪綔鑰呫傛拠寮閭d簺濂囨殑鏉℃涓嶈皥錛岄潬璋辯殑 浠g爜鏈変竴涓叡鍚岀殑鐗圭偣錛屽氨鏄疍RY銆侱RY灝辨槸Don't Repeat Yourself錛屽叾瀹炲凡緇忚浜鴻皥浜嗗ソ澶氬勾浜嗭紝浣嗘槸鍑犱箮鎵鏈変漢閮戒細蹇樿銆?/p> DRY 騫朵笉鏄寚浣犱笉鑳藉鍒朵唬鐮佽繖涔堢畝鍗曠殑銆備笉鑳絩epeat鐨勫叾瀹炴槸淇℃伅錛屼笉鏄唬鐮併傝鍒嗘瀽涓孌典唬鐮侀噷闈㈢殑浠涔堜笢瑗挎椂淇℃伅錛屽氨璺熺粰鐗╃悊棰樺仛鍙楀姏鍒嗘瀽涓鏍鳳紝鎯蟲瘡嬈?閮藉仛瀵瑰叾瀹炰笉澶鏄撱備絾鏄竴浠戒唬鐮佹繪槸瑕佷笉鏂殑淇ˉ鐨勶紝鎵浠ュ湪榪欎箣鍓嶅ぇ瀹惰鍏堝仛濂絋DD錛屼篃灝辨槸Test Driven Development銆傝繖閲屾垜瀵硅嚜宸辯殑瑕佹眰鏄鐩栫巼瑕侀珮杈?5%錛屼笉綆$敤浠涔堟墜孌碉紝鎬諱箣95%鐨勪唬鐮佺殑杈撳嚭閮借鍙楀埌媯楠屻傚綋鏈変簡瓚沖澶氱殑嫻嬭瘯鍋氬悗鐩劇殑鏃?鍊欙紝涓嶇浣犱互鍚庡彂鐢熶簡浠涔堬紝璀璇翠綘鍙戠幇浣燫epeat浜嗕粈涔堜笢瑗胯鏀癸紝浣犳墠鑳芥斁蹇冨ぇ鑳嗙殑鍘繪敼銆傝屼笖浠庨暱榪滅殑瑙掑害鏉ョ湅錛屽仛濂絋DD鍙互灝嗗紑鍙戝嚭鐩稿悓璐ㄩ噺鐨勪唬鐮佺殑鏃墮棿緙╃煭鍒?0%宸﹀彸錛堣繖鏄垜鑷繁鐨勭粡楠屽鹼級 銆?/p> 淇℃伅榪欎釜璇嶄笉澶ソ鐢ㄨ璦涓嬪畾涔夛紝涓嶈繃鎴戝彲浠ヤ婦涓緥瀛愩傝濡傝浣犺鎶婁竴涓厤緗枃浠墮噷闈㈢殑瀛楃涓叉寜鐓у垎闅旂鍒嗚В鎴愬嚑涓瓧絎︿覆錛屼綘澶ф灝變細鍐欏嚭榪欐牱鐨勪唬鐮侊細 榪欐鐭煭鐨勪唬鐮侀噸澶嶄簡澶氬皯淇℃伅錛?/p> 闄や簡DRY浠ュ榪樻湁涓涓棶棰橈紝灝辨槸澶勭悊description鐨勬柟娉曡窡name鍜宲arent涓嶄竴鏍鳳紝鍥犱負浠栧悗闈㈠啀涔熸病鏈夊垎鍙蜂簡銆?/p> 閭h繖孌典唬鐮佽鎬庝箞鏀瑰憿錛熸湁浜涗漢鍙兘浼氭兂鍒幫紝閭f妸閲嶅鐨勪唬鐮佹娊鍙栧嚭涓涓嚱鏁板氨濂戒簡錛?/p> 鏄笉鏄湅璧鋒潵榪樺緢鍒壄錛屽ソ鍍忔妸浠g爜淇敼浜嗕箣鍚庡彧鎶婁簨鎯呮悶寰楁洿涔變簡錛岃屼笖灝辯畻config瀵逛簡鎴戜滑涔熶細鍒涘緩閭d釜up鍙橀噺錛屽氨浠呬粎鏄負浜嗕笉 閲嶅浠g爜銆傝屼笖榪欎喚浠g爜榪樻暎鍙戝嚭浜嗕竴浜涗笉濂界殑鍛抽亾錛屽洜涓哄浜嶯ame銆丳arent鍜孌escription鐨勫鐞嗘柟娉曡繕鏄笉鑳界粺涓錛孭arse閲岄潰閽堝 end鍙橀噺鐨勫鐞嗙湅璧鋒潵涔熸槸寰堥噸澶嶏紝浣嗗疄闄呬笂榪欐槸鏃犳硶鍦ㄨ繖鏍瘋璁$殑鍓嶆彁涓嬫秷闄ょ殑銆傛墍浠ヨ繖涓唬鐮佷篃鏄笉濂界殑錛屽厖鍏墮噺鍙槸姣旂涓浠戒唬鐮佸己涓鐐圭偣銆?br /> 瀹?闄呬笂錛屼唬鐮佷箣鎵浠ヨ鍐欑殑濂斤紝涔嬫墍浠ヤ笉鑳絩epeat涓滆タ錛屾槸鍥犱負浜у搧鐙楁繪槸瑕佹敼闇姹傦紝涓嶆敼浠g爜浣犲氨瑕佹錛屾敼浠g爜浣犲氨瑕佸姞鐝紝鎵浠ヤ負浜嗗噺灝戜慨鏀逛唬鐮佺殑鐥涜嫤錛?鎴戜滑涓嶈兘repeat浠諱綍淇℃伅銆備婦涓緥瀛愶紝鏈変竴澶╀駭鍝佺嫍璇達紝瑕佹妸鍒嗛殧絎︿粠鍒嗗彿鏀規垚絀烘牸錛佷竴涓嬪瓙灝辮鏀逛袱涓湴鏂逛簡銆俤escription鍚庨潰瑕佸姞tag錛?榪欐牱浣犲鐞哾escription鐨勬柟娉曞張瑕佹敼浜嗗洜涓轟粬鏄互絀烘牸緇撳熬涓嶆槸0緇撳熬銆?/p> 鍥犳閽堝榪欎釜鐗囨錛屾垜浠渶瑕佹妸瀹冩敼鎴愯繖鏍鳳細 鎴戜滑鍙互鍙戠幇錛屽垎鍙鳳紙L';'錛夊湪榪欓噷鍙嚭鐜頒簡涓嬈★紝寮傚父鍐呭涔熷彧鍑虹幇浜嗕竴嬈★紝鑰屼笖澶勭悊name銆乸arent鍜?description鐨勪唬鐮佷篃娌℃湁浠涔堝尯鍒簡錛屾鏌ラ敊璇篃鏇寸畝鍗曚簡銆備綘鍦ㄨ繖閲岃繕緇欎綘鐨凩ibrary澧炲姞浜嗕竴涓猄plitString鍑芥暟錛岃涓嶅畾鍦ㄤ互 鍚庝粈涔堝湴鏂瑰氨鐢ㄤ笂浜嗭紝姣擯arse榪欑涓撻棬鐨勫嚱鏁拌寮哄緢澶氬嶃?br /> 澶у鍙互鍙戠幇錛屽湪榪欓噷閲嶅鐨勪笢瑗垮茍涓嶄粎浠呮槸澶嶅埗浜嗕唬鐮侊紝鑰屾槸鐢變簬浣犳妸 鍚屼竴涓俊鎭暎鎾湪浜嗕唬鐮佺殑鍚勪釜閮ㄥ垎瀵艱嚧浜嗘湁寰堝鐩歌繎鐨勪唬鐮佷篃鏁f挱鍦ㄥ悇涓湴鏂癸紝鑰屼笖榪樹笉鏄偅涔堝ソ閫氳繃鎶芥垚鍑芥暟鐨勬柟娉曟潵瑙e喅銆傚洜涓哄湪榪欑鎯呭喌涓嬶紝灝辯畻浣犳妸閲嶅 鐨勪唬鐮佹娊鎴愪簡Parse鍑芥暟錛屼綘鎶婂嚱鏁拌皟鐢ㄤ簡鍑犳瀹為檯涓婁篃絳変簬閲嶅浜嗕俊鎭傚洜姝ゆ紜殑鏂規硶灝辨槸鎶婂仛浜嬫儏鐨勬柟娉曞彉涓涓嬶紝鍐欐垚SplitString銆傝繖涓?SplitString鍑芥暟騫朵笉鏄氳繃鎶婇噸澶嶇殑浠g爜綆鍗曠殑鎶藉彇鎴愬嚱鏁拌屽仛鍑烘潵鐨勩?u>鍘繪帀閲嶅鐨勪俊鎭細璁╀綘鐨勪唬鐮佺殑緇撴瀯鍙戠敓鏈川鐨勫彉鍖?/strong>銆?/p> 榪欎釜闂鍏跺疄涔熸湁寰堝鍙樹綋錛?/p> 淇℃伅涓鏃﹁浣爎epeat浜嗭紝浣犵殑浠g爜灝變細涓嶅悓紼嬪害鐨勫嚭鐜板悇縐嶈厫鐑傛垨鑰呯牬紿楋紝涓婇潰閭d笁鏉″叾瀹炲彧鏄垜鑳芥兂鍒扮殑姣旇緝甯歌鐨勮〃鐜板艦寮忋傝繖浠朵簨鎯呬篃鍛婅瘔鎴戜滑錛屽綋楂樻墜鍛婅瘔浣犱粈涔堜粈涔堜笉鑳藉仛鐨勬椂鍊欙紝寰楁兂涓鎯寵儗鍚庣殑鍘熷洜錛屼笉鐒惰窡灝佸緩榪蜂俊鏈変粈涔堝尯鍒?/p>浠涔堟槸DRY錛圖on't Repeat Yourself錛?
浠涔堟槸淇℃伅
void ReadConfig(const wchar_t* config)
{
auto p = wcschr(config, L';'); // 1
if(!p) throw ArgumentException(L"Illegal config string"); // 2
DoName(wstring(config, p)); // 3
auto q = wcschr(p + 1, L';'); // 4
if(!q) throw ArgumentException(L"Illegal config string"); // 5
DoParent(wstring(p + 1, q); // 6
auto r = wcschr(q + 1, L';'); // 7
if(r) throw ArgumentException(L"Illegal config string"); // 8
DoDescription(q + 1); // 9
}
{
auto next = wcschr(config, L';');
ArgumentException up(L"Illegal config string");
if (next)
{
if (end) throw up;
wstring result(config, next);
config = next + 1;
return result;
}
else
{
if (!end) throw up;
wstring result(config);
config += result.size();
return result;
}
}
// name;parent;description
void ReadConfig(const wchar_t* config)
{
DoName(Parse(config, false));
DoParent(Parse(config, false));
DoDescription(Parse(config, true));
}
{
vector<wstring> fragments;
while(auto next = wcschr(config, delimiter))
{
fragments.push_back(wstring(config, next));
config = next + 1;
}
fragments.push_back(wstring(config));
return fragments; // C++11灝辨槸濂斤紒
}
void ReadConfig(const wchar_t* config)
{
auto fragments = SplitString(config, L';');
if(fragments.size() != 3)
{
throw ArgumentException(L"Illegal config string");
}
DoName(fragments[0]);
DoParent(fragments[1]);
DoDescription(fragments[2]);
}
聽
鐪嬩簡鍓嶉潰鐨勪笁綃囨枃绔狅紝澶у搴旇鍩烘湰瀵筎inymoe鐨勪唬鐮佹湁涓涓垵姝ョ殑鎰熻浜嗐傚湪姝g‘鍒嗘瀽"print sum from 1 to 100"涔嬪墠錛屾垜浠鍏堝緱鍒嗘瀽"phrase sum from (lower bound) to (upper bound)"榪欐牱鐨勫0鏄庛俆inymoe鐨勫嚱鏁板0鏄庡張寰堝鍏充簬block鍜宻entence鐨勯厤緗紝涓嶈繃榪欓噷騫朵笉鎵撶畻灝嗘墍鏈夌粏鑺傦紝鎴戜細灝嗛噸鐐規斁鍦ㄥ浣曞啓涓涓拡瀵規棤姝т箟璇硶鐨勯掑綊涓嬮檷璇硶鍒嗘瀽鍣ㄤ笂銆傛墍浠ユ垜浠繖閲屼笉浼氭秹鍙妔entence鍜宐lock鐨勪粈涔坈ategory鍜宑ps鐨勯厤緗?
聽
铏界劧"print sum from 1 to 100"鏃犳硶鐢ㄦ棤姝т箟鐨勮娉曞垎鏋愮殑鏂規硶鍋氬嚭鏉ワ紝浣嗘槸鎴戜滑鍙互鍊熺敤瀵?phrase sum from (lower bound) to (upper bound)"鐨勮娉曞垎鏋愮殑緇撴灉錛屽姩鎬佹瀯閫犺兘澶熷垎鏋?print sum from 1 to 100"鐨勮娉曞垎鏋愬櫒銆傝繖縐嶈娉曠湅璧鋒潵濂藉儚寰堥珮澶т笂錛屼絾鏄叾瀹炲茍娌℃湁浠涔堢壒鍒毦鐨勬妧宸с傚叧浜?鏋勯?鐨勯棶棰樻垜灝嗗湪涓嬩竴綃囨枃绔犮婅窡vczh鐪嬪疄渚嬪緙栬瘧鍘熺悊鈥斺斾笁錛歍inymoe涓庢湁姝т箟璇硶鍒嗘瀽銆嬭緇嗕粙緇嶃?
聽
鍦ㄦ垜涔嬪墠鐨勫崥瀹㈤噷鎴戞浘緇忓啓榪囥?a href="http://m.shnenglu.com/vczh/archive/2008/06/15/53373.html">濡備綍鎵嬪啓璇硶鍒嗘瀽鍣?/a>銆嬶紝榪欑瘒鏂囩珷璁蹭簡涓浜涚畝鍗曠殑鍐欓掑綊涓嬮檷璇硶鍒嗘瀽鍣ㄧ殑瑙勫垯錛屽敖綆″緢澶氫漢鏉ヤ俊璇磋繖綃囨枃绔犲府浠栦滑瑙e喅浜嗗緢澶氶棶棰橈紝浣嗗疄闄呬笂緇嗚妭榪樹笉澶熶赴瀵岋紝鐢ㄦ潵瀵圭紪紼嬭璦鍋氳娉曞垎鏋愮殑璇濓紝榪樻槸浼氳寰楀鏉傛уお楂樸傝繖綃囨枃绔犱篃鍚屾椂浣滀負銆?a href="http://m.shnenglu.com/vczh/archive/2008/06/15/53373.html">濡備綍鎵嬪啓璇硶鍒嗘瀽鍣?/a>銆嬬殑琛ュ厖銆傚ソ浜嗭紝鎴戜滑寮濮嬭繘鍏ユ棤姝т箟璇硶鍒嗘瀽鐨勪富棰樺惂銆?
聽
鎴戜滑闇瑕佺殑絎竴涓嚱鏁版槸鐢ㄦ潵璇籺oken騫跺垽鏂叾鍐呭鏄笉鏄垜浠笇鏈涚湅鍒扮殑涓滆タ銆傝繖涓嚱鏁版瘮杈冪壒鍒紝鎵浠ュ崟鐙嬁鍑烘潵璁層傚湪璇嶆硶鍒嗘瀽閲岄潰鎴戜滑宸茬粡鎶婃枃浠跺垎琛岋紝姣忎竴琛屼竴涓狢odeToken鐨勫垪琛ㄣ備絾鏄敱浜庝竴涓嚱鏁板0鏄庣嫭鍗犱竴琛岋紝鍥犳鍦ㄨ繖閲屾垜浠彧闇瑕佸姣忎竴琛岃繘琛屽垎鏋愩傛垜浠垽鏂繖涓琛屾槸鍚︿互cps銆乧ategory銆乻ymbol銆乼ype銆乸hrase銆乻entence鎴朾lock寮澶達紝濡傛灉鏄偅Tinymoe灝辮涓鴻繖涓瀹氭槸涓涓0鏄庯紝鍚﹀垯灝辨槸鏅氱殑浠g爜銆傛墍浠ヨ繖閲屽亣璁炬垜浠壘鍒頒簡涓琛屼唬鐮佷互涓婇潰鐨勮繖浜泃oken浣滀負寮澶達紝浜庢槸鎴戜滑灝辮榪涘叆璇硶鍒嗘瀽鐨勭幆鑺傘備綔涓烘暣涓垎鏋愬櫒鐨勫熀紜錛屾垜浠渶瑕佷竴涓狢onsumeToken鐨勫嚱鏁幫細
聽
聽
浣滀負涓涓函綺圭殑C++11鐨勯」鐩紝鎴戜滑搴旇浣跨敤STL鐨勮凱浠e櫒銆傚叾瀹炲湪鍐欒娉曞垎鏋愬櫒鐨勬椂鍊欙紝鍩轟簬榪唬鍣ㄧ殑浠g爜涔熸瘮鍩轟簬"token鍦ㄦ暟緇勯噷鐨勪笅琛?鐨勪唬鐮佽綆鍗曞緱澶氥傝繖涓嚱鏁版墍鍋氱殑鍐呭鏄繖鏍風殑錛屽畠鏌ョ湅it鎸囧悜鐨勯偅涓猼oken錛屽鏋渢oken鐨勭被鍨嬭窡tokenType鎻忚堪鐨勪竴鏍鳳紝浠栧氨it++鐒跺悗榪斿洖true錛涘惁鍒欏氨鏄敤content鍜宱wnerToken鏉ヤ駭鐢熶竴涓敊璇俊鎭姞鍏rrors鍒楄〃閲岋紝鐒跺悗榪斿洖false銆傚綋鐒訛紝濡傛灉浼犺繘鍘葷殑鍙傛暟it鏈韓灝辯瓑浜巈nd錛岄偅鑷劧瑕佷駭鐢熶竴涓敊璇傝嚜鐒訛紝鍑芥暟浣撲篃鍗佸垎綆鍗曪細
聽
閭e浜庢爣璇嗙鍜屾暟瀛楁庝箞鍔炲憿錛熸槑鐪間漢鑲畾涓鐪煎氨鐪嬪嚭鏉ワ紝榪欐槸緇欐鏌ョ鍙風敤鐨勶紝璀宸︽嫭鍙楓佸彸鎷彿銆佸啋鍙峰拰鍏抽敭瀛楃瓑銆傚湪澹版槑閲岄潰鎴戜滑鏄笉闇瑕佸お澶嶆潅鐨勪笢瑗跨殑錛屽洜姝ゆ垜浠繕闇瑕佷袱澶栦竴涓嚱鏁版潵杈撳叆鏍囪瘑絎︺俆inymoe浜嬪疄涓婃湁涓や釜閽堝鏍囪瘑絎︾殑璇硶鍒嗘瀽鍑芥暟錛岀涓涓槸璇誨叆鏍囪瘑絎︼紝絎簩涓笉浠呰璇誨叆鏍囪瘑絎﹁繕瑕佸垽鏂槸鍚﹀埌浜嗚鏈惁鍒欐姤閿欙細
聽
鍦ㄨ繖閲屾垜闇瑕佸己璋冧竴涓噸鐐癸紝鍦ㄥ啓璇硶鍒嗘瀽鍣ㄧ殑鏃跺欙紝鍑芥暟鐨勫悇寮忎竴瀹氳鏁撮綈鍒掍竴銆俆inymoe鐨勮娉曞垎鏋愬嚱鏁版湁涓や釜鏍煎紡錛屽垎鍒槸閽堝parse涓琛岀殑涓涓儴鍒嗭紝鍜宲arse涓涓枃浠剁殑涓浜涜鐨勩侾arseToEnd鍜孭arseToFarest灝卞睘浜巔arse涓琛岀殑涓涓儴鍒嗙殑鍑芥暟銆傝繖縐嶅嚱鏁扮殑鏍煎紡濡備笅錛?
聽
闄や簡鍑芥暟鏍煎紡浠ュ錛屾垜浠繕闇瑕佹墍鏈夌殑鍑芥暟閮介伒寰煇浜涘墠緗潯浠跺拰鍚庣疆鏉′歡銆傚湪璇硶鍒嗘瀽閲岋紝濡傛灉浣犺瘯鍥懼垎鏋愪竴涓粨鏋勪絾鏄笉騫稿嚭鐜頒簡閿欒錛岃繖涓椂鍊欙紝浣犳湁鍙兘鍙互榪斿洖涓涓娉曟爲鐨勮妭鐐癸紝浣犱篃鏈夊彲鑳戒粈涔堥兘榪斿洖涓嶄簡銆備簬鏄繖閲屽氨鏈変袱縐嶆儏鍐碉細
聽
褰撲綘鏍規嵁榪欐牱鐨勬牸寮忓啓浜嗗緢澶氳娉曞垎鏋愬嚱鏁頒箣鍚庯紝浣犱細鍙戠幇浣犲彲浠ュ緢瀹規槗鐢ㄧ畝鍗曠粨鏋勭殑璇硶鍒嗘瀽鍑芥暟錛屾嫾鍑戝嚭涓涓鏉傜殑璇硶鍒嗘瀽鍑芥暟銆備絾鏄敱浜嶵inymoe鐨勫0鏄庡茍娌℃湁涓涓紪紼嬭璦閭d箞澶嶆潅錛屾墍浠ヨ繖縐嶅祵濂楃粨鏋勫嚭鐜扮殑嬈℃暟騫朵笉澶氾紝浜庢槸鎴戜滑榪欓噷鍏堣煩榪囧叧浜庡祵濂楃殑璁ㄨ錛岀瓑鍒板悗闈㈠叿浣撳垎鏋?鍑芥暟鎸囬拡綾誨瀷鐨勫弬鏁?鐨勬椂鍊欒嚜鐒朵細娑夊強鍒般?
聽
璇翠簡榪欎箞澶氾紝鎴戣寰椾篃搴旇涓奝arseToEnd鍜孭arseToFarest鐨勪唬鐮佷簡銆傞鍏堟槸ParseToEnd錛?
聽
鎴戜滑寰堝揩灝卞彲浠ュ彂鐜幫紝鍏跺疄璇硶鍒嗘瀽鍣ㄩ噷闈㈢粷澶у鏁扮瘒騫呯殑浠g爜閮芥槸鍏充簬閿欒澶勭悊鐨勶紝鐪熸澶勭悊姝g‘浠g爜鐨勯儴鍒嗗叾瀹炲緢灝戙侾arseToEnd鍋氱殑浜嬫儏涓嶅錛屼粬灝辨槸浠巌t寮濮嬩竴鐩磋鍒癳nd鐨勪綅緗紝鎶婃墍鏈変笉鏄爣璇嗙鐨則oken閮芥墧鎺夛紝鐒跺悗鎶婃墍鏈夐亣鍒扮殑鏍囪瘑絎oken閮借繛璧鋒潵浣滀負涓涓畬鏁寸殑鏍囪瘑絎︺備篃灝辨槸璇達紝ParseToEnd閬囧埌綾諱技"the real 100 Tinymoe programmer"鐨勬椂鍊欙紝浠栦細榪斿洖"the real Tinymoe programmer"錛岀劧鍚庡湪"100"鐨勫湴鏂規姤涓涓敊璇?
聽
ParseToFarest鐨勯昏緫宸笉澶氾細
聽
鍙槸褰撹繖涓嚱鏁伴亣鍒?the real 100 Tinymoe programmer"鐨勬椂鍊欙紝浼氳繑鍥?the real"錛岀劧鍚庢妸鍏夋爣縐誨姩鍒?100"錛屼絾鏄病鏈夋姤閿欍?
聽
鐪嬩簡榪欏嚑涓熀鏈殑鍑芥暟涔嬪悗錛屾垜浠彲浠ヨ繘鍏ユ棰樹簡銆傚仛璇硶鍒嗘瀽鍣紝褰撶劧榪樻槸浠庢枃娉曞紑濮嬨傝窡涓婁竴綃囨枃绔犱竴鏍鳳紝鎴戜滑鏉ュ皾璇曠洿鎺ユ瀯閫犱竴涓嬫枃娉曘備絾鏄娉曞垎鏋愬櫒璺熻瘝娉曞垎鏋愬櫒鐨勬枃娉曠殑鍖哄埆鏄紝璇嶆硶鍒嗘瀽鍏剁殑鏂囨硶鍙互 "瀹氫箟鍑芥暟"鍜?璋冪敤鍑芥暟"銆?
聽
棣栧厛錛屾垜浠潵鐪媠ymbol鐨勬枃娉曪細
SymbolName ::= <identifier> { <identifier> }
Symbol ::= "symbol" SymbolName
聽
鍏舵錛屽氨鏄痶ype鐨勫0鏄庛倀ype鏄琛岀殑錛屼笉榪囨垜浠繖閲屽彧鍏沖績寮澶寸殑涓鏍鳳細
Type ::= "type" SymbolName [ ":" SymbolName ]
聽
鍦ㄨ繖閲岋紝涓嫭鍙蜂唬琛ㄥ彲鏈夊彲鏃狅紝澶ф嫭鍙蜂唬琛ㄩ噸澶?嬈℃垨浠ヤ笂銆傜幇鍦ㄨ鎴戜滑鏉ョ湅鍑芥暟鐨勫0鏄庛傚嚱鏁扮殑鐢熷懡鐣ヤ負澶嶆潅錛?
聽
Function ::= ("phrase" | "sentence" | "block") { SymbolName | "(" Argument ")" } [ ":" SymbolName ]
Argument ::= ["list" | "expression" | "argument" | "assignable"] SymbolName
Argument ::= SymbolName
Argument ::= Function
聽
Declaration ::= Symbol | Type | Function
聽
鍦ㄨ繖閲屾垜浠湅鍒癋unction閫掑綊浜嗚嚜宸憋紝榪欐槸鍥犱負鍑芥暟鐨勫弬鏁板彲浠ユ槸鍙︿竴涓嚱鏁般備負浜嗚榪欎釜鍙傛暟璋冪敤璧鋒潵鏇村姞婕備寒涓鐐癸紝浣犲彲浠ユ妸鍙傛暟鍐欐垚鍑芥暟鐨勫艦寮忥紝璀璇達細
pharse (the number) is odd : odd numbers
聽聽聽聽return the number % 2 == 1
end
聽
print all (phrase (the number) is wanted) in (numbers)
聽聽聽聽repeat with the number in all numbers
聽聽聽聽聽聽聽聽if the number is wanted
聽聽聽聽聽聽聽聽聽聽聽聽print the number
聽聽聽聽聽聽聽聽end
聽聽聽聽end
end
聽
print main
聽聽聽聽print all odd numbers in array of (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
end
聽
鎴戜滑緇?(the number) is odd"榪欎釜鍒ゆ柇涓涓暟瀛楁槸涓嶆槸濂囨暟鐨勫嚱鏁幫紝璧蜂簡涓涓埆鍚嶅彨"odd numbers"錛岃繖涓埆鍚嶄笉鑳借璋冪敤錛屼絾鏄粬絳変環浜庝竴涓彧璇葷殑鍙橀噺淇濆瓨鐫濂囨暟鍑芥暟鐨勫嚱鏁版寚閽堛備簬鏄垜浠氨鍙互鎶婂畠浼犻掔粰"print all (鈥? in (鈥?"榪欎釜鍑芥暟鐨勭涓涓弬鏁頒簡銆傜涓涓弬鏁板0鏄庢垚鍑芥暟錛屾墍浠ユ垜浠彲浠ュ湪print鍑芥暟鍐呯洿鎺ヨ皟鐢ㄨ繖涓弬鏁版寚鍚戠殑odd numbers鍑芥暟銆?
聽
浜嬪疄涓奣inymoe鐨凷ymbolName鏄彲浠ュ寘鍚叧閿瓧鐨勶紝浣嗘槸鎴戜負浜嗕笉璁╁畠鍐欑殑澶暱錛屼簬鏄垜灝辯畝鍗曠殑鍐欐垚浜嗕笂闈㈢殑閭f潯寮忓瓙銆傞偅Argument鏄惁鍙互鍖呭惈鍏抽敭瀛楀憿錛熺瓟妗堝綋鐒舵槸鍙互鐨勶紝鍙槸褰撳畠浠ist銆乪xpression銆乤rgument銆乤ssignable銆乸hrase銆乻entence銆乥lock寮濮嬬殑鏃跺欙紝鎴戜滑寮鴻璁や負浠栨湁棰濆鐨勬剰涔夈?
聽
鐜板湪涓涓猅inymoe鐨勫0鏄庣殑絎竴琛岄兘鐢盌eclaration鏉ュ畾涔夈傚綋鎴戜滑璇嗗埆鍑轟竴涓紜殑Declaration涔嬪悗錛屾垜浠氨鍙互鏍規嵁鍒嗘瀽鐨勭粨鏋滄潵瀵瑰悗闈㈢殑琛岃繘琛屽垎鏋愩傝濡傝symbol鍚庨潰娌℃湁涓滆タ錛屼簬鏄氨榪欎箞瀹屼簡銆倀ype鍚庨潰閮芥槸鎴愬憳鍑芥暟錛屾墍浠ユ垜浠竴鐩存壘鍒?end"涓烘銆傚嚱鏁扮殑鍑芥暟浣撳氨鏇村鏉備簡錛屾墍浠ユ垜浠細鐩存帴璺沖埌涓嬩竴涓湅璧鋒潵鍍廌eclaration鐨勪笢瑗庫斺斾篃灝辨槸浠ymbol銆乼ype銆乸hrase銆乻entence銆乥lock銆乧ps銆乧ategory寮濮嬬殑琛屻傝繖浜涙楠ら兘寰堢畝鍗曪紝鎵浠ラ棶棰樼殑閲嶇偣灝辨槸錛?strong>濡備綍鏍規嵁Declaration鐨勬枃娉曟潵澶勭悊杈撳叆鐨勫瓧絎︿覆銆?
聽
涓轟簡璁╂枃娉曞彲浠ョ湡姝g殑榪愯錛屾垜浠渶瑕佹妸瀹冨仛鎴愮姸鎬佹満銆傛牴鎹箣鍓嶇殑鎻忚堪錛岃繖涓姸鎬佸強浠嶇劧闇瑕佹湁"瀹氫箟鍑芥暟"鍜?鎵ц鍑芥暟"鐨勮兘鍔涖傛垜浠彲浠ュ厛鍋囪浠栦滑鏄鍒欒〃杈懼紡錛岀劧鍚庢妸鏁翠釜鐘舵佹満鐢誨嚭鏉ャ傝繖涓椂鍊欙紝"鍑芥暟"鏈韓鎴戜滑鎶婂畠鐪嬫垚鏄竴涓窡鏍囪瘑絎︽棤鍏崇殑杈撳叆錛岀劧鍚庡氨鍙互寰楀埌涓嬮潰鐨勭姸鎬佹満錛?
聽
聽
榪欐牱鎴戜滑鐨勭姸鎬佹満灝辨殏鏃跺畬鎴愪簡銆備絾鏄幇鍦ㄨ繕涓嶈兘鐩存帴鎶婂畠杞崲鎴愪唬鐮侊紝鍥犱負褰撴垜浠亣鍒頒竴涓緭鍏ワ紝鑰屾垜浠彲浠ラ夋嫨璋冪敤鍑芥暟錛岃屼笖鍙互鐢ㄧ殑鍑芥暟榪樹笉姝竴涓殑鏃跺欙紝閭e簲璇ユ庝箞鍔炲憿錛熺瓟妗堝氨鏄媯鏌ユ垜浠殑鏂囨硶鏄笉鏄湁姝т箟銆?
聽
鏂囨硶鐨勬涔夋槸涓涓緢鏈夋剰鎬濈殑闂銆傚湪鎴戜滑鐪熺殑瀹炶返涓涓紪璇戝櫒鐨勬椂鍊欙紝鎴戜滑浼氶亣鍒頒笁縐嶆涔夛細
聽
鐪嬩竴鐪兼垜浠垰鎵嶅啓鍑烘潵鐨勬枃娉曪紝鏄庢樉灝辨槸LookAhead=0鐨勬儏鍐碉紝鑰屼笖榪炲乏閫掑綊閮芥病鏈夛紝鍐欒搗鏉ヨ偗瀹氬緢瀹規槗銆傞偅鎺ヤ笅鏉ユ垜浠鍋氱殑灝辨槸緇?鍑芥暟"綆梖irst set銆備竴涓嚱鏁扮殑first set錛岄【鍚嶆濅箟灝辨槸錛屼粬鐨勭涓涓猼oken閮藉彲浠ユ槸浠涔堛係ymbolName銆丼ymbol銆乀ype銆丗unction閮戒笉鐢ㄧ湅浜嗭紝鍥犱負浠栦滑鐨勬枃娉曠涓涓緭鍏ラ兘鏄痶oken錛岄偅灝辨槸浠栦滑鐨刦irst set銆傛渶鍚庡氨鍓╀笅Argument銆侫rgument鐨勭涓涓猼oken闄や簡list銆乪xpression銆乤rgument鍜宎ssignable浠ュ錛岃繕鏈塅unction銆傚洜姝rgument鐨刦irst set灝辨槸榪欎簺token鍔犱笂Function鐨刦irst set銆傚鏋滄枃娉曟湁宸﹂掑綊鐨勮瘽錛屼篃鍙互鐢ㄧ被浼肩殑鏂規硶鍋氾紝鍙鎴戜滑鍦ㄥ嚱鏁癆->B->C->鈥?>A鐨勬椂鍊欙紝鐭ラ亾A姝e湪璁$畻浜庢槸榪斿洖絀洪泦灝卞彲浠ヤ簡銆傚綋鐒訛紝鍙湁宸﹂掑綊鎵嶄細閬囧埌榪欑鎯呭喌銆?
聽
鐒跺悗鎴戜滑媯鏌ヤ竴涓嬫瘡涓涓姸鎬侊紝鍙互鍙戠幇錛屼換浣曚竴涓姸鎬佸嚭鍘葷殑鎵鏈夎竟錛屼粬鎺ュ彈鐨則oken鎴栬呭嚱鏁扮殑first set閮芥槸娌℃湁浜ら泦鐨勩傝濡侫rgument鐨?鐘舵侊紝絎竴鏉¤竟鎺ュ彈鐨則oken銆佺浜屾潯杈規帴鍙楃殑SymbolName鐨刦irst set錛屽拰絎笁鏉¤竟鎺ュ彈鐨凢unction鐨刦irst set錛屾槸娌℃湁浜ら泦鐨勶紝鎵浠ユ垜浠氨鍙互鏂畾錛岃繖涓枃娉曚竴瀹氭病鏈夋涔夈傛寜鐓т笂嬈$姸鎬佹満鍒頒唬鐮佺殑鍐欐硶錛屾垜浠彲浠ユ満姊扮殑鍐欏嚭浠g爜浜嗐傚啓浠g爜鐨勬椂鍊欙紝鎴戜滑鎶婃瘡涓涓枃娉曠殑鍑芥暟錛岄兘鍐欐垚涓涓狢++鐨勫嚱鏁般傛瘡鍒頒竴涓姸鎬佺殑鏃跺欙紝鎴戜滑鐪嬩竴涓嬪綋鍓嶇殑token鏄粈涔堬紝鐒跺悗鍐嶅喅瀹氳蛋鍝潯杈廣傚鏋滈変腑鐨勮竟鏄痶oken杈癸紝閭f垜浠氨璺寵繃涓涓猼oken銆傚鏋滈変腑鐨勮竟鏄嚱鏁拌竟錛岄偅鎴戜滑涓嶈煩榪噒oken錛岃漿鑰岃皟鐢ㄩ偅涓嚱鏁幫紝璁╁嚱鏁拌嚜宸卞幓璺硉oken銆傘?a href="http://m.shnenglu.com/vczh/archive/2008/06/15/53373.html">濡備綍鎵嬪啓璇硶鍒嗘瀽鍣?/a>銆嬬敤鐨勪篃鏄竴鏍風殑鏂規硶錛屽鏋滃榪欎釜榪囩▼涓嶆竻妤氱殑錛屽彲浠ュ啀鐪嬩竴閬嶈繖涓枃绔犮?
聽
浜庢槸鎴戜滑鍒頒簡瀹氫箟璇硶鏍戠殑鏃跺欎簡銆傚垢榪愮殑鏄紝鎴戜滑鍙互鐩存帴浠庢枃娉曚笂鐪嬪埌璇硶鏍戠殑褰㈢姸錛岀劧鍚庣◢寰仛涓鐐瑰井璋冨氨鍙互浜嗐傛垜浠妸姣忎竴涓嚱鏁伴兘鐪嬫垚涓涓被錛岀劧鍚庝嬌鐢ㄤ笅闈㈢殑瑙勫垯錛?
聽
瀵逛簬姣忎竴涓嚱鏁幫紝瑕佷笉瑕佺敤shared_ptr鏉ヨ鍒欒浠佽鏅恒備簬鏄垜浠彲浠ョ洿鎺ラ氳繃涓婇潰鐨勬枃娉曞緱鍒版垜浠墍闇瑕佺殑璇硶鏍戯細
聽
棣栧厛鏄疭ymbolName錛?
聽
鍏舵鏄疭ymbol錛?
聽
鐒跺悗鏄疶ype錛?
聽
鎺ヤ笅鏉ユ槸Argument錛?
聽
鏈鍚庢槸Function錛?
聽
澶у鍙互鐪嬪埌錛屽湪Argument閭i噷錛屽悓鏃跺嚭鍘葷殑涓夋潯杈瑰氨緇勬垚浜嗕笁涓瓙綾伙紝閮界戶鎵胯嚜FunctionFragment銆傚浘涓孩鑹茬殑閮ㄥ垎灝辨槸Tinymoe婧愪唬鐮侀噷鍦ㄤ笂榪扮殑鏂囨硶閲屽嚭鐜扮殑閭i儴鍒嗐傝嚦浜庝負浠涔堣繕鏈夊鍑烘潵鐨勯儴鍒嗭紝鍏跺疄鏄洜涓鴻繖閲岀殑鏂囨硶鏄負浜嗗彊榪版柟渚跨畝鍖栬繃鐨勩傝嚦浜嶵inymoe鍏充簬鍑芥暟澹版槑鐨勬墍鏈夎娉曞彲浠ュ垎鍒湅涓嬮潰鐨勫洓涓猤ithub鐨剋iki page錛?
https://github.com/vczh/tinymoe/wiki/Phrases,-Sentences-and-Blocks
https://github.com/vczh/tinymoe/wiki/Manipulating-Functions
https://github.com/vczh/tinymoe/wiki/Category
https://github.com/vczh/tinymoe/wiki/State-and-Continuation
聽
鍦ㄦ湰绔犵殑鏈熬錛屾垜灝嗗悜澶у灞曠ずTinymoe鍏充簬鍑芥暟澹版槑鐨勯偅涓涓狿arse鍑芥暟銆傛枃绔犲凡緇忔妸鎵鏈夊叧閿殑鐭ヨ瘑鐐歸兘璁蹭簡錛屽叿浣撴庝箞鍋氬ぇ瀹跺彲浠ヤ笂https://github.com/vczh/tinymoe 闃呰婧愪唬鐮佹潵瀛︿範銆?
聽
棣栧厛鏄垜浠殑鍑芥暟澶達細
聽
鍥炴兂涓涓嬫垜浠箣鍓嶈鍒扮殑鍏充簬璇硶鍒嗘瀽鍑芥暟鐨勬牸寮忥細
聽
鎴戜滑鍙互娓呮鍦扮湅鍒拌繖涓嚱鏁版弧瓚充笂鏂囨彁鍑烘潵鐨勪笁涓姹傘傚墿涓嬫潵鐨勫弬鏁版湁涓や釜錛岀涓涓槸decl錛屽鏋滀笉涓虹┖閭d唬琛ㄨ皟鐢ㄥ嚱鏁扮殑浜哄凡緇忓府浣犲惂璇硶鏍戠粰new鍑烘潵浜嗭紝浣犲簲璇ョ洿鎺ヤ嬌鐢ㄥ畠銆傞涓涓弬鏁皁wnerToken鍒欐槸涓轟簡浜х敓璇硶閿欒浣跨敤鐨勩傜劧鍚庢垜浠湅浠g爜錛?
聽
絎竴姝ワ紝鎴戜滑鍒ゆ柇杈撳叆鏄惁涓虹┖錛岀劧鍚庢牴鎹渶瑕佹姤閿欙細
聽
絎簩姝ワ紝鏍規嵁絎竴涓猼oken鏉ョ‘瀹氬嚱鏁扮殑褰㈠紡鏄痯hrase銆乻entence榪樻槸block錛屽茍璁板綍鍦ㄦ垚鍛樺彉閲弔ype閲岋細
聽
絎笁姝ユ槸涓涓驚鐜紝鎴戜滑鏍規嵁褰撳墠鐨則oken錛堣繕璁頒笉璁板緱涔嬪墠璇磋繃錛岃鍏堢湅涓涓媡oken鏄粈涔堬紝鐒跺悗鍐嶅喅瀹氳蛋鍝潯杈癸紵錛夋潵鍐沖畾鎴戜滑鎺ヤ笅鏉ヨ鍒嗘瀽鐨勶紝鏄疉rgumentFragment鐨勪袱涓瓙綾伙紙鍒嗗埆鏄疺ariableArgumentFragment鍜孎unctionArgumentFragment錛夛紝榪樻槸鏅氱殑鍑芥暟鍚嶇殑涓閮ㄥ垎錛岃繕鏄鍑芥暟宸茬粡緇撴潫浜嗭紝閬囧埌浜嗕竴涓啋鍙鳳紝鍥犳寮濮嬪垎鏋愬埆鍚嶏細
聽
鏈鍚庡氨涓嶈創浜嗭紝鏄鏌ユ牸寮忔槸鍚︽弧瓚寵涔夌殑涓浜涗唬鐮侊紝璀璇碽lock鐨勫嚱鏁板悕蹇呴』鐢卞弬鏁板紑濮嬪暒錛屾垨鑰卲hrase鐨勫弬鏁頒笉鑳芥槸argument鍜宎ssignable絳夈?
聽
榪欑瘒鏂囩珷灝卞埌姝ょ粨鏉熶簡錛屽笇鏈涘ぇ瀹跺湪鐪嬩簡榪欑墖鏂囩珷涔嬪悗錛岄厤鍚坵iki鍏充簬璇硶鐨勫叏闈㈡弿榪幫紝宸茬粡鐭ラ亾濡備綍瀵筎inymoe鐨勫0鏄庨儴鍒嗚繘琛岃娉曞垎鏋愩傜揣鎺ョ潃灝辨槸涓嬩竴綃囨枃绔犫斺擳inymoe涓庡甫姝т箟璇硶鍒嗘瀽浜嗭紝浼氳澶у鏄庣櫧錛屾兂瀵硅濡?print sum from 1 to 100"榪欐牱鐨勪唬鐮佸仛璇硶鍒嗘瀽錛屼篃涓嶉渶瑕佸澶嶆潅鐨勬墜孌靛氨鍙互鍋氬嚭鏉ャ?/p>
聽
瀹炵幇Tinymoe鐨勭涓姝ヨ嚜鐒舵槸涓涓瘝娉曞垎鏋愬櫒銆傝瘝娉曞垎鏋愬叾鎵浣滅殑浜嬫儏寰堢畝鍗曪紝灝辨槸鎶婁竴浠戒唬鐮佸垎鍓叉垚鑻ュ共涓猼oken錛岃褰曚笅浠栦滑鎵鍦ㄦ枃浠剁殑浣嶇疆錛屼互鍙婁涪鎺変笉蹇呰鐨勪俊鎭備絾鏄疶inymoe鏄竴涓寜琛屽垎鍓茬殑璇█錛岃嚜鐒秚oken鍒楄〃涔熷氨鏄簩緇寸殑錛岀涓緇存槸琛岋紝絎簩緇存槸姣忎竴琛岀殑token銆傚湪緇х畫璁茶瘝娉曞垎鏋愬櫒涔嬪墠錛屽厛鐪嬬湅Tinymoe鍖呭惈澶氬皯token錛?
聽
Tinymoe瀵逛簬token鏈変竴涓壒孌婄殑瑙勫畾錛屽氨鏄瓧絎︿覆鍜屾敞閲婇兘鏄崟琛岀殑銆傚洜姝ゅ鏋滀竴涓瓧絎︿覆鍦ㄦ病鏈夌粨鏉熶箣鍓嶅氨閬囧埌浜嗘崲琛岋紝閭d箞榪欑鍐欐硶瀹氫箟涓轟綘閬囧埌浜嗕竴涓病鏈夊彸鍙屽紩鍙風殑瀛楃涓詫紝闇瑕佹姤涓敊錛岀劧鍚庝笅涓琛屽氨涓嶆槸榪欎釜瀛楃涓茬殑鍐呭浜嗐?
聽
涓涓瘝娉曞垎鏋愬櫒鎵闇瑕佸仛鐨勪簨鎯咃紝灝辨槸鎶婁竴涓瓧絎︿覆鍒嗚В鎴愭弿榪版娉曠殑鏁版嵁緇撴瀯銆傛棦鐒朵笂闈㈠凡緇忚鍒癟inymoe鐨則oken鍒楄〃鏄簩緇寸殑錛屽洜姝ゆ暟鎹粨鏋勮偗瀹氫細浣撶幇榪欎釜瑙傜偣銆俆inymoe鐨勮瘝娉曞垎鏋愬櫒浠g爜鍙互鍦ㄨ繖閲屾壘鍒幫細https://github.com/vczh/tinymoe/blob/master/Development/Source/Compiler/TinymoeLexicalAnalyzer.h銆?
聽
棣栧厛鏄痶oken錛?
CodeTokenType鏄竴涓灇涓劇被鍨嬶紝鏍囪涓涓猼oken鐨勭被鍨嬨傝繖涓被鍨嬫瘮杈冪粏鍖栵紝姣忎竴涓叧閿瓧鏈夎嚜宸辯殑綾誨瀷錛屾瘡涓涓鍙蜂篃鏈夎嚜宸辯殑綾誨瀷錛屽墿涓嬬殑鎸夌綾繪潵鍒嗐傛垜浠彲浠ョ湅鍒皌oken闇瑕佽褰曠殑鏈鍏抽敭鐨勪笢瑗垮彧鏈変笁涓細綾誨瀷銆佸唴瀹瑰拰浠g爜浣嶇疆銆傚湪token璁板綍浠g爜浣嶇疆鏄崄鍒嗛噸瑕佺殑錛屾紜湴璁板綍浠g爜浣嶇疆鍙互璁╀綘鑳藉鎶ュ憡甯︿綅緗殑閿欒銆佷粠璇硶鏍戠殑鑺傜偣榪樺師鎴愪唬鐮佷綅緗佺敋鑷沖湪璋冭瘯鐨勬椂鍊欏彲浠ユ妸鎸囦護涔熸崲鎴愪綅緗?
聽
榪欓噷闇瑕佹彁鍒扮殑鏄紝string_t鏄竴涓猼ypedef錛屽叿浣撶殑澹版槑鍙互鍦ㄨ繖閲岀湅鍒幫細https://github.com/vczh/tinymoe/blob/master/Development/Source/TinymoeSTL.h銆俆inymoe鏄畬鍏ㄧ敱鏍囧噯鐨凜++11鍜孲TL鍐欐垚鐨勶紝浣嗘槸涓轟簡閫傚簲涓嶅悓鎯呭喌鐨勯渶瑕侊紝Tinymoe鍒嗕負渚濊禆code page鐨勭増鏈拰Unicode鐗堟湰銆傚鏋滅紪璇慣inymoe浠g爜鐨勬椂鍊欏0鏄庝簡鍏ㄥ眬鐨勫畯UNICODE_TINYMOE鐨勮瘽錛岄偅Tinymoe鎵鏈夌殑瀛楃澶勭悊灝嗕嬌鐢╳char_t錛屽惁鍒欎嬌鐢╟har銆俢har鐨勭被鍨嬪拰Tinymoe緙栬瘧鍣ㄥ湪榪愯鐨勬椂鍊欐搷浣滅郴緇熷綋鍓嶇殑code page鏄粦瀹氱殑銆傛墍浠ヨ繖閲屼細鏈夌被浼約tring_t鍟娿乮fstream_t鍟娿乧har_t絳夌被鍨嬶紝浼氬湪涓嶅悓鐨勭紪璇戦夐」鐨勫獎鍝嶄笅鎸囧悜涓嶅悓鐨凷TL綾誨瀷鎴栬呭師鐢熺殑C++綾誨瀷銆俫ithub涓婄殑VC++2013宸ョ▼浣跨敤鐨勬槸wchar_t鐨勭増鏈紝鎵浠tring_t灝辨槸std::wstring銆?
聽
Tinymoe鐨勮瘝娉曞垎鏋愬櫒闄や簡token鐨勭被鍨嬩互澶栵紝鑲畾榪橀渶瑕佸畾涔夋暣涓枃浠剁粨鏋勫湪璇嶆硶鍒嗘瀽鍚庣殑緇撴灉錛?
榪欎釜鏁版嵁緇撴瀯浣撶幇浜?Tinymoe鐨則oken鍒楄〃鏄簩緇寸殑"鐨勮繖涓鐐廣備竴涓枃浠朵細琚瘝娉曞垎鏋愬櫒澶勭悊鎴愪竴涓猻hared_ptr<CodeFIle>瀵硅薄錛孋odeFile::lines璁板綍浜嗘墍鏈夐潪絀虹殑琛岋紝CodeLine::tokens璁板綍浜嗚琛岀殑鎵鏈塼oken銆?
聽
鐜板湪璁╂垜浠潵鐪嬭瘝娉曞垎鏋愮殑鍏蜂綋榪囩▼銆傚叧浜庡浣曚粠姝e垯琛ㄨ揪寮忔瀯閫犺瘝娉曞垎鏋愬櫒鍙互鍦ㄨ繖閲岋紙http://m.shnenglu.com/vczh/archive/2008/05/22/50763.html錛夌湅鍒幫紝涓嶈繃鎴戜滑浠婂ぉ瑕佽涓璁插浣曚漢鑲夋瀯閫犺瘝娉曞垎鏋愬櫒銆傛柟娉曞叾瀹炴槸涓鏍風殑錛岄鍏堜漢鑲夋瀯閫犵姸鎬佹満錛岀劧鍚庢妸鐢ㄧ姸鎬佹満鍒嗘瀽杈撳叆鐨勫瓧絎︿覆鐨勪唬鐮佹妱榪囨潵灝卞彲浠ヤ簡銆備絾鏄緢灝戞湁浜轟細瑙h﹀緱閭d箞寮錛屽洜涓鴻繖鏍峰啓寰堝鏄撶湅涓嶆噦錛屽叾嬈℃湁鍙兘浼氶亣鍒頒竴浜涙瀬绔儏鍐墊槸浣犳棤娉曠敤綰補鐨勬鍒欒〃杈懼紡鏉ュ垎璇嶇殑錛岃濡傝C++鐨剅aw string literal錛歊"tinymoe(榪欓噷鐨勫瓧絎︿覆娌℃湁杞箟)tinymoe"銆備竴涓敤銆怰"<涓浜涘瓧絎?gt;(銆戝紑濮嬬殑瀛楃涓插彧鑳界敱銆?<鍚屾牱鐨勫瓧絎?gt;"銆戞潵緇撴潫錛岃欏哄埄鍒嗘瀽榪欑鎯呭喌錛屽彧鑳介氳繃鍦ㄧ姸鎬佹満閲岄潰鍋歨ack鎵嶈兘瑙e喅銆傝繖灝辨槸涓轟粈涔堟垜浠漢鑲夋瀯閫犺瘝娉曞垎鏋愬櫒鐨勬椂鍊欙紝浼氭妸鐘舵佸拰鍔ㄤ綔閮芥販鍦ㄤ竴璧峰啓錛屽洜涓鴻繖鏍蜂究浜庡鐞嗙壒孌婃儏鍐點?
聽
涓嶈繃騫稿ソ鐨勬槸錛孴inymoe騫舵病鏈夎繖縐嶆儏鍐靛彂鐢熴傛墍浠ユ垜浠彲浠ョ洿鎺ヤ粠鐘舵佹満鍏ユ墜銆備負浜嗙畝鍗曡搗瑙侊紝鎴戝湪涓嬮潰鐨勭姸鎬佹満涓幓鎺夋墍鏈変笉鏄?鍜?鐨勭鍙楓傞鍏堬紝鎴戜滑闇瑕佷竴涓搗濮嬬姸鎬佸拰涓涓粨鏉熺姸鎬侊細
聽
棣栧厛鎴戜滑娣誨姞鏁存暟鍜屾爣璇嗙榪涘幓錛?
聽
鍏舵鏄姞鍑忓拰嫻偣錛?
聽
鏈鍚庢妸瀛楃涓插拰娉ㄩ噴琛ュ叏錛?
聽
榪欐牱鐘舵佹満灝卞凡緇忓畬鎴愪簡銆傝榪囩紪璇戝師鐞嗙殑鍙兘浼氶棶錛屼負浠涔堢粓緇撶姸鎬侀兘鏄敱铏氱嚎鑰屼笉鏄甫鏈夎緭鍏ョ殑瀹炵幇鎸囧悜鐨勶紵鍥犱負铏氱嚎鍦ㄨ繖閲屾湁鐗規畩鐨勬剰涔夛紝涔熷氨鏄瀹冧笉鑳界Щ鍔ㄨ緭鍏ョ殑瀛楃涓茬殑鎸囬拡錛岃屼笖浠栬繕瑕佽礋璐f坊鍔犱竴涓猼oken銆傚綋鐘舵佽煩鍒癊nd涔嬪悗錛岄偅浠栧氨浼氬彉鎴怱tart錛屾墍浠?strong>瀹為檯涓奡tart鍜孍nd鏄悓涓涓姸鎬?/strong>銆傝繖涓姸鎬佹満涔熶笉鏄緭鍏ヤ粈涔堝瓧絎﹂兘鑳借煩杞埌涓嬩竴涓姸鎬佺殑銆傛墍浠?strong>褰撲綘鍙戠幇杈撳叆鐨勫瓧絎﹁浣犳棤璺彲璧扮殑鏃跺欙紝浣犲氨鏄亣鍒頒簡涓涓瘝娉曢敊璇?/strong>銆?
聽
榪欐牱鎴戜滑鐨勮璁″氨綆楀畬鎴愪簡錛屾帴涓嬫潵灝辨槸濡備綍鐢–++鏉ュ疄鐜板畠浜嗐備負浜嗚浠g爜鏇村鏄撻槄璇伙紝鎴戜滑搴旇緇橲tart鍜?-9榪欎箞澶氱姸鎬佽搗鍚嶅瓧錛屽仛娉曞涓嬶細
鍦ㄨ繖閲岀被浼肩姸鎬?榪欐牱鐨勭姸鎬佽鎴戠渷鐣ユ帀浜嗭紝鍥犱負榪欎釜鐘舵佸敮涓鐨勫嚭璺氨鏄櫄綰匡紝鎵浠ヨ煩鍒拌繖涓姸鎬佹剰鍛崇潃浣犺绔嬪埢鎵ц铏氱嚎錛屼篃灝辨槸璇翠綘涓嶉渶瑕佸仛"璺沖埌榪欎釜鐘舵?榪欎釜鍔ㄤ綔銆傚洜姝ゅ畠涓嶉渶瑕佹湁涓涓悕瀛椼?
聽
鐒跺悗浣犲彧瑕佹寜鐓т笅闈㈢殑鍋氭硶緲昏瘧榪欎釜鐘舵佹満灝卞彲浠ヤ簡錛?
聽
鍙鍐欏埌榪欓噷錛岄偅涔堟垜浠氨鍒濇瀹屾垚浜嗚瘝娉曞垎鏋愬櫒浜嗐傚叾瀹炰換浣曠郴緇熺殑涓昏鍔熻兘閮芥槸鐩稿瀹規槗瀹炵幇鐨勶紝寰寰鏄瑕佺殑鍔熻兘鎵嶉渶瑕佽姳璐瑰ぇ閲忕殑綺懼姏鏉ュ畬鎴愶紝鑰屼笖榪樺緢瀹規槗鍑洪敊銆傚湪榪欓噷"嬈¤鐨勫姛鑳?灝辨槸鈥斺旇褰晅oken鐨勮鍒楀彿錛岃繕鏈夌淮鎶odeFile::lines閬垮厤絀鴻鐨勫嚭鐜幫紒
聽
灝界鎴戝凡緇忓仛榪囦簡閭d箞澶氭璇嶆硶鍒嗘瀽鍣紝浣嗘槸鎴戜粛鐒舵棤娉曚竴姘斿懙鎴愬啓瀵癸紝浠嶇劧浼氬嚭涓浜沚ug銆傞潰瀵圭紪璇戝櫒榪欑綰綆楃▼搴忥紝debug鐨勬渶濂芥柟娉曞氨鏄啓鍗曞厓嫻嬭瘯銆備笉榪囧浜庝笉鐔熸倝鍗曞厓嫻嬭瘯鐨勪漢鏉ヨ鍙兘寰堥毦涓涓嬪瓙鎯沖埌瑕佸仛浠涔堟祴璇曪紝鍦ㄨ繖閲屾垜鍙互鎶婃垜緇橳inymoe璋㈢殑涓閮ㄥ垎鍗曞厓嫻嬭瘯鍦ㄨ繖閲岃創涓涓嬨?
聽
絎竴涓紝褰撶劧鏄紶璇翠腑鐨?Hello, world!"嫻嬭瘯浜嗭細
聽
TEST_CASE鍜孴EST_ASSERT錛堣繖閲屾殏鏃舵病鏈夌洿鎺ョ敤鍒癟EST_ASSERT錛夋槸鎴戜負浜嗗紑鍙慣inymoe闅忔墜鎾哥殑涓涓畯錛屽彲浠ュ湪Tinymoe鐨勪唬鐮侀噷鐪嬪埌銆備負浜嗘鏌ユ垜浠湁娌℃湁綺楀績澶ф剰錛屾垜浠湁蹇呰媯鏌ヨ瘝娉曞垎鏋愬櫒鐨勪換浣曚竴涓緭鍑虹殑鏁版嵁錛岃濡傛瘡涓琛屾湁澶氬皯token錛岃濡傛瘡涓涓猼oken鐨勮鍙峰垪濂藉唴瀹瑰拰綾誨瀷銆傛垜涓轟簡璁╄繖浜涙灟鐕ョ殑嫻嬭瘯鐢ㄤ緥瀹規槗鐪嬫噦錛屽湪榪欎釜鏂囦歡錛?a 銆?
聽
絎簩涓祴璇曠敤渚嬮拡瀵圭殑鏄暣鏁板拰嫻偣鐨勮緭鍑哄拰鎶ラ敊涓婏紝閲嶇偣鍦ㄤ簬媯鏌ユ瘡涓涓猼oken鐨勫垪鍙鋒槸涓嶆槸姝g‘鐨勮綆椾簡鍑烘潵錛?
聽
絎笁涓祴璇曠敤渚嬬殑閲嶇偣涓昏鏄?絎﹀彿鍜屸旀敞閲婄殑鍒嗘瀽錛?
聽
絎洓涓祴璇曠敤渚嬪垯鏄祴璇曞瓧絎︿覆鐨別scaping鍜屽湪闈㈠鎹㈣鐨勬椂鍊欐槸鍚︽紜殑澶勭悊錛堜箣鍓嶆彁鍒板瓧絎︿覆涓嶈兘鎹㈣錛岄亣鍒頒竴涓獊鐒剁殑鎹㈣灝嗕細琚湅鎴愮己灝戝弻寮曞彿錛夛細
聽
閴翠簬璇嶆硶鍒嗘瀽鏈潵鍐呭涔熶笉澶氾紝鎵浠ヨ繖綃囨枃绔犱篃涓嶄細澶暱銆傜浉淇℃湁鍓嶉旂殑紼嬪簭鍛樹篃浼氬湪榪欓噷寰楀埌涓浜涚紪璇戝師鐞嗕互澶栫殑鐭ヨ瘑銆備笅涓綃囨枃绔犲皢浼氭弿榪癟inymoe鐨勫嚱鏁板ご鐨勮娉曞垎鏋愰儴鍒嗭紝灝嗕細鎻忚堪涓涓紪璇戝櫒鐨勪笉甯︽涔夌殑璇硶鍒嗘瀽鏄浣曚漢鑲夊嚭鏉ョ殑銆傛暚璇鋒湡寰呫?/p>
聽
#include <functional>
#include <memory>
#include <iostream>
#include <string>
聽
using namespace std;
聽
template<typename TResult, typename ...TArgs>
class YBuilder
{
private:
聽聽聽聽function<TResult(function<TResult(TArgs...)>, TArgs...)> partialLambda;
聽
public:
聽聽聽聽YBuilder(function<TResult(function<TResult(TArgs...)>, TArgs...)> _partialLambda)
聽聽聽聽聽聽聽聽:partialLambda(_partialLambda)
聽聽聽聽{
聽聽聽聽}
聽
聽聽聽聽TResult operator()(TArgs ...args)const
聽聽聽聽{
聽聽聽聽聽聽聽聽return partialLambda(
聽聽聽聽聽聽聽聽聽聽聽聽[this](TArgs ...args)
聽聽聽聽聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽return this->operator()(args...);
聽聽聽聽聽聽聽聽聽聽聽聽}, args...);
聽聽聽聽}
};
聽
template<typename TMethod>
struct PartialLambdaTypeRetriver
{
聽聽聽聽typedef void FunctionType;
聽聽聽聽typedef void LambdaType;
聽聽聽聽typedef void YBuilderType;
};
聽
template<typename TClass, typename TResult, typename ...TArgs>
struct PartialLambdaTypeRetriver<TResult(__thiscall TClass::*)(function<TResult(TArgs...)>, TArgs...)>
{
聽聽聽聽typedef TResult FunctionType(TArgs...);
聽聽聽聽typedef TResult LambdaType(function<TResult(TArgs...)>, TArgs...);
聽聽聽聽typedef YBuilder<TResult, TArgs...> YBuilderType;
};
聽
template<typename TClass, typename TResult, typename ...TArgs>
struct PartialLambdaTypeRetriver<TResult(__thiscall TClass::*)(function<TResult(TArgs...)>, TArgs...)const>
{
聽聽聽聽typedef TResult FunctionType(TArgs...);
聽聽聽聽typedef TResult LambdaType(function<TResult(TArgs...)>, TArgs...);
聽聽聽聽typedef YBuilder<TResult, TArgs...> YBuilderType;
};
聽
template<typename TLambda>
function<typename PartialLambdaTypeRetriver<decltype(&TLambda::operator())>::FunctionType> Y(TLambda partialLambda)
{
聽聽聽聽return typename PartialLambdaTypeRetriver<decltype(&TLambda::operator())>::YBuilderType(partialLambda);
}
聽
int _tmain(int argc, _TCHAR* argv[])
{
聽聽聽聽auto fib = Y([](function<int(int)> self, int index)
聽聽聽聽{
聽聽聽聽聽聽聽聽return index<2
聽聽聽聽聽聽聽聽聽聽聽聽?1
聽聽聽聽聽聽聽聽聽聽聽聽:self(index-1)+self(index-2);
聽聽聽聽});
聽
聽聽聽聽for (int i = 0; i < 10; i++)
聽聽聽聽{
聽聽聽聽聽聽聽聽cout << fib(i) << " ";
聽聽聽聽}
聽聽聽聽cout << endl;
}
浣嗘槸絎竴涓郴鍒楄繕娌″埌寮濮嬪鐞員inymoe婧愪唬鐮佺殑鏃跺欙紝棣栧厛鐨勮窡澶у璁蹭竴璁叉垜璁捐Tinymoe鐨勬晠浜嬨備負浠涔堣繖縐嶄笢瑗胯絳夊埌鐜板湪鎵嶈鍛紝鍥犱負涔嬪墠娌℃湁鏂囨。錛屽皢浜嗕篃鏄櫧璁插晩銆俆inymoe鍦╣ithub鐨剋iki鍒嗕負涓ら儴鍒嗭紝涓閮ㄥ垎鏄粙緇嶈娉曠殑錛屽彟涓閮ㄥ垎鏄粙緇嶄竴涓渶灝忕殑鏍囧噯搴撴槸濡備綍瀹炵幇鍑烘潵鐨勶紝鍦板潃鍦?https://github.com/vczh/tinymoe/wiki 涓嶅甫闂彿鐨勯偅浜涢兘鏄啓瀹屼簡鐨勩?
鍦ㄤ粙緇峊inymoe涔嬪墠錛屽厛璇翠竴涓嬭繖涓郴鍒楁枃绔犵殑鐩爣銆侷deally錛屽彧瑕佷竴涓漢鐪嬪畬浜嗚繖涓郴鍒楋紝浠栧氨鍙互鍦ㄤ笅闈㈣繖浜涘湴鏂瑰緱鍒?strong>鍏ラ棬錛?
褰撶劧錛岃繖騫朵笉鑳借浣犳垚涓轟竴涓ぇ鐗涳紝浣嗘槸鑷沖皯鑷繁鍋氬仛瀹為獙錛屾悶涓鐐歸珮澶т笂鐨勪笢瑗塊獥甯堝浠槸娌℃湁闂浜嗐?
铏界劧鎯蟲硶寰堝騫村墠灝卞凡緇忔湁浜嗭紝浣嗘槸榪欐鎴戞兂鎶婂畠瀹炵幇鍑烘潵錛屾槸涓轟簡瀹屾垚銆婂浣曡璁′竴闂ㄨ璦銆嬬殑鍚庣畫銆傚厜璁插ぇ閬撶悊鏄病鏈夋剰涔夌殑錛岃嚦灝戝緱鏈変竴涓緥瀛愶紝璁╁ぇ瀹剁煡閬撹繖浜涗簨鎯呭埌搴曟槸浠涔堟牱瀛愮殑銆傚洜姝inymoe鏈変竴鐐規暀瀛︾殑鎰忎箟錛屼笉綆℃槸浣跨敤瀹冭繕鏄疄鐜板畠銆?
棣栧厛錛?strong>澶勭悊Tinymoe闇瑕佺殑鐭ヨ瘑鐐瑰錛岀敤浜庣紪璇戝師鐞嗘暀瀛?/strong>銆傛棦鐒舵槸涓轟簡灞曠ず緙栬瘧鍘熺悊鐨勫熀紜鐭ヨ瘑錛屽洜姝よ璦鏈韓涓嶅彲鑳芥槸閭g鐑傚ぇ琛楃殑C緋誨垪鐨勪笢瑗褲傚綋鐒墮櫎浜嗙煡璇嗙偣浠ュ錛岃繕浼氳澶у娣卞埢鐨勭悊瑙e埌錛?strong>闅懼疄鐜板拰闅劇敤錛屾槸瀹屽叏娌℃湁鍏崇郴鐨?/strong>錛乀inymoe鐢ㄨ搗鏉ュ彲鐖戒簡錛屽晩鍝堝搱鍝堝搱鍝堛?
鍏舵錛?strong>Tinymoe瀹規槗宓屽叆鍏朵粬璇█鐨勭▼搴忥紝浣滀負DSL浣跨敤錛屽彲浠ヨ皟鐢ㄥ涓葷▼搴忔彁渚涚殑鍔熻兘銆傝繖涓ユ牸鐨勬潵璁蹭笉綆楄璦鏈韓鐨勫姛鑳斤紝鑰屾槸瀹炵幇鏈韓鐨勫姛鑳姐傚氨綆楁槸C++涔熷彲浠ヨ璁′負宓屽叆寮忥紝lua涔熷彲浠ヨ璁捐涓虹紪璇戞垚exe鐨勩備竴涓璦鏈韓鐨勮璁″茍涓嶄細瀵瑰浣曚嬌鐢ㄥ畠鏈夊澶х殑闄愬埗銆備負浜嗚澶у鐪嬩簡榪欎釜緋誨垪涔嬪悗錛屽彲浠ュ啓鍑鴻嚦灝戝彲鐢ㄧ殑涓滆タ錛岃屼笉浠呬粎鏄啓鐜╁叿錛屽洜姝よ繖涔熸槸璁捐鐨勭洰鏍囦箣涓銆?
絎笁錛?strong>Tinymoe璇硶浼樺寲浜庢弿榪板鏉傜殑閫昏緫錛岃屼笉鏄紭鍖栦笌澶嶆潅鐨勬暟鎹粨鏋勫拰綆楁硶錛堣櫧鐒朵篃鍙互錛夈俆inymoe鏈韓鏄笉瀛樺湪浠諱綍緇嗙矑搴︽帶鍒跺唴瀛樼殑鑳藉姏鐨勶紝鑰屼笖铏界劧鍙互瀹炵幇澶嶆潅鐨勬暟鎹粨鏋勫拰綆楁硶錛屼絾鏄湰韜弿榪拌繖浜涗笢瑗挎渶澶氫篃灝辮窡JavaScript涓鏍峰鏄撯斺斿叾瀹炲氨鏄笉瀹規槗銆備絾鏄疶inymoe璁捐鐨勬椂鍊欙紝鏄負浜嗚澶у鎶奣inymoe褰撴垚鏄竴闂ㄥ彲浠ヨ璁SL鐨勮璦錛屽洜姝ゅ澶嶆潅閫昏緫鐨勬弿榪拌兘鍔涚壒鍒己銆傚敮涓鐨勫墠鎻愬氨鏄紝浣犳噦寰楀浣曠粰Tinymoe鍐欏簱銆傚緢濂界殑浣跨敤鍜屽緢濂藉湴瀹炵幇涓涓笢瑗挎槸鐩歌緟鐩告垚鐨勩傛垜鍦ㄨ璁inymoe涔嬪垵錛屽緢澶歱attern鎴戜篃涓嶇煡閬擄紝鍙槸鍥犱負璁捐Tinymoe閬靛驚浜嗙瀛︾殑鏂規硶錛屽洜姝ゆ渶鍚庢垜鍙戠幇Tinymoe绔熺劧鍏鋒湁濡傛寮哄ぇ鐨勬弿榪拌兘鍔涖傚綋鐒跺浜庤鑰呬滑鏈韓錛屼篃浼氬湪闃呰緋誨垪鏂囩珷鐨勬湁綾諱技鐨勬劅瑙夈?
鏈鍚庯紝Tinymoe鏄竴涓姩鎬佺被鍨嬭璦銆傝繖綰補鏄垜鐨勪釜浜虹埍濂戒簡銆傚涓闂ㄥ姩鎬佺被鍨嬭璦鍋氶潤鎬佸垎鏋愰偅璇ュ鏈夎叮鍟婏紝鍟婂搱鍝堝搱鍝堝搱鍝堛?
褰撶劧鎴戝茍涓嶄細涓轟簡鍐欐枃绔犲氨鏃犵嚎鎻愰珮Tinymoe鐨勫疄鐜伴毦搴︾殑銆備負浜嗘妸浠栨帶鍒跺湪涓涓甯告按騫籌紝鍥犳璁捐Tinymoe鐨勭涓鏉″氨鏄細
涓銆佸皬瑙勬ā鐨勮璦鏍稿績+澶ц妯$殑鏍囧噯搴?
鍏跺疄榪欒窡C++宸笉澶氥備絾鏄疌++鐢變簬鎯沖仛鐨勪簨鎯呭疄鍦ㄦ槸澶浜嗭紝璀璇磋鍥懼寘娑墊墍鏈夎寖寮忕瓑絳夛紝鍥犳灝辯畻榪欎箞鍋氾紝浠嶇劧璁〤++鏈韓鍖呭惈鐨勪笢瑗胯繃浜庡法澶э紙鍏跺疄鎴戣繕鏄寰桟++涓嶉毦鎬庝箞鍔烇級銆?
璇█鏍稿績灝忥紝瀹炵幇璧鋒潵褰撶劧瀹規槗銆?strong>浣嗘槸浣犲茍涓嶈兘涓轟簡璁╄璦鏍稿績灝忓氨鐗虹壊浠涔堝姛鑳?/strong>銆傚洜姝ょ簿蹇冭璁′竴涓牳蹇冩槸蹇呴』鐨勶紝鍥犱負鎵鏈変綘鎯寵浣嗘槸涓嶆兂鍔犲叆璇█鐨勫姛鑳斤紝浠庢灝卞彲浠ョ敤搴撴潵瀹炵幇浜嗐?
璀璇達紝Tinymoe閫氳繃鏈夋潯浠跺湴鏆撮湶continuation錛岃姹傜紪璇戝櫒鍦ㄧ紪璇慣inymoe鐨勬椂鍊欏仛涓嬈″叏鏂嘋PS鍙樻崲銆傝繖涓笢瑗胯瀹規槗涔熶笉鏄偅涔堝鏄擄紝浣嗘槸鑷沖皯姣斾綘鍋氬垎鏀驚鐜紓甯稿鐞嗕粈涔堢殑鍏ㄩ儴鍔犺搗鏉ヨ綆鍗曞浜嗗惂銆傛墍浠ユ垜鍙彁渚沜ontinuation錛屽墿涓嬬殑鎺у埗嫻佸叏閮ㄧ敤搴撴潵鍋氥傝繖鏍鋒湁涓変釜濂藉錛?
璇翠簡榪欎箞澶氾紝閭e埌搴曚粈涔堟槸灝忚妯$殑璇█鏍稿績鍛紵榪欏湪Tinymoe涓婃湁涓ょ偣浣撶幇銆?
絎竴鐐癸紝灝辨槸Tinymoe鐨勮娉曞厓绱犲皯銆備竴涓猅inymoe琛ㄨ揪寮忔棤闈炲氨鍙湁涓夌被錛氬嚱鏁拌皟鐢ㄣ佸瓧闈㈤噺鍜屽彉閲忋佹搷浣滅銆傚瓧闈㈤噺灝辨槸閭d簺鏁板瓧瀛楃涓蹭粈涔堢殑銆傚綋Tinymoe鐨勫嚱鏁扮殑鏌愪竴涓弬鏁版寚瀹氫負涓嶅畾涓暟鐨勬椂鍊欎綘榪樺緱鎻愪緵涓涓猼uple銆傚鎵橈紙鍦ㄨ繖閲屾槸鍑芥暟鎸囬拡鍜岄棴鍖呯殑緇熺О錛夊拰鏁扮粍铏界劧涔熸槸Tinymoe鐨勫師鐢熷姛鑳戒箣涓錛屼絾鏄浠栦滑鐨勬搷浣滈兘鏄氳繃鍑芥暟璋冪敤鏉ュ疄鐜扮殑錛屾病鏈夌壒孌婄殑璇硶銆?
綆鍗曞湴璁詫紝灝辨槸闄や簡涓嬮潰榪欎簺涓滆タ浠ュ浣犱笉浼氳鍒板埆鐨勭綾葷殑琛ㄨ揪寮忎簡錛?
1
"text"
sum from 1 to 100
sum of (1, 2, 3, 4, 5)
(1+2)*(3+4)
true
涓涓猅inymoe璇彞鐨勭綾誨氨鏇村皯浜嗭紝瑕佷箞鏄竴涓嚱鏁拌皟鐢紝瑕佷箞鏄痓lock錛岃涔堟槸榪炲湪涓璧風殑鍑犱釜block錛?
do something bad
repeat with x from 1 to 100
do something bad with x
end
try
do something bad
catch exception
do something worse
end
鏈変漢鍙兘浼氳錛岄偅repeat鍜宼ry-catch灝變笉鏄娉曞厓绱犲悧錛熻繖涓湡涓嶆槸錛屼粬浠槸鏍囧噯搴撳畾涔夊ソ鐨勫嚱鏁幫紝璺熶綘鑷繁澹版槑鐨勫嚱鏁版病鏈変換浣曠壒孌婄殑鍦版柟銆?
榪欓噷鍏跺疄榪樻湁涓涓湁鎰忔濈殑鍦版柟錛?repeat with x from 1 to 100"鐨剎鍏跺疄鏄驚鐜綋鐨勫弬鏁般俆inymoe鏄浣曠粰浣犺嚜瀹氫箟鐨刡lock寮媧炵殑鍛紵涓嶄粎濡傛錛孴inymoe鐨勫嚱鏁拌繕鍙互澹版槑"寮曠敤鍙傛暟"錛屼篃灝辨槸璇磋皟鐢ㄨ繖涓嚱鏁扮殑鏃跺欎綘鍙兘鎶婁竴涓彉閲忔斁榪涘幓錛屽嚱鏁伴噷闈㈠彲浠ヨ鍐欒繖涓彉閲忋傝繖浜涢兘鏄庝箞瀹炵幇鐨勫憿錛熷涓嬪幓灝辯煡閬撲簡錛屽晩鍝堝搱鍝堝搱銆?
Tinymoe鐨勫0鏄庝篃鍙湁涓ょ錛岀涓縐嶆槸鍑芥暟錛岀浜岀鏄鍙楓傚嚱鏁扮殑澹版槑鍙兘浼氱暐寰鏉備竴鐐癸紝涓嶈繃闄や簡鍑芥暟澶翠互澶栵紝鍏朵粬鐨勯兘鏄被浼奸厤緗竴鏍風殑涓滆タ錛屽嚑涔庨兘鏄敤鏉ュ畾涔?catch鍑芥暟鍦ㄤ嬌鐢ㄧ殑鏃跺欏繀欏繪槸榪炲湪try鍑芥暟鍚庨潰"鍟婏紝"break鍙兘鍦╮epeat閲岄潰鐢?鍟婏紝璇稿姝ょ被鐨勪俊鎭?
Tinymoe鐨勭鍙峰崄鍒嗙畝鍗曪紝璀璇翠綘瑕佸畾涔変竴騫村洓瀛g殑絎﹀彿錛屽彧闇瑕佽繖涔堝啓錛?
symbol spring
symbol summer
symbol autumn
symbol winter
symbol鏄竴涓?涓庝紬涓嶅悓鐨勫?錛屼篃灝辨槸璇翠綘鍦ㄤ袱涓猰odule涓嬮潰瀹氫箟鍚屽悕鐨剆ymbol浠栦滑涔熸槸涓嶄竴鏍風殑銆傛墍鏈塻ymbol涔嬮棿閮芥槸涓嶄竴鏍風殑錛屽彲浠ョ敤=鍜?lt;>鏉ュ垽鏂俿ymbol灝辨槸闈?涓嶄竴鏍?鏉ュ畾涔夊叾鑷韓鐨勩?
鑷充簬璇達紝閭d負浠涔堜笉鐢╡num鍛紵鍥犱負Tinymoe鏄姩鎬佺被鍨嬭璦錛宔num鐨勭被鍨嬫湰韜槸鏍規湰娌℃湁鐢ㄦ涔嬪湴鐨勶紝鎵浠ュ共鑴嗗氨璁捐鎴愪簡symbol銆?
絎簩鐐癸紝Tinymoe闄や簡continuation鍜宻elect-case浠ュ錛屾病鏈夊叾浠栧師鐢熺殑鎺у埗嫻佹敮鎸?/strong>銆?
榪欏熀鏈笂褰掑姛浜庡厛杈堝彂鏄巆ontinuation passing style transformation鐨勫姛鍔籌紝緇嗚妭鍦ㄤ互鍚庣殑緋誨垪閲岄潰浼氳銆傚績鎬ョ殑浜哄彲浠ュ厛鐪?https://github.com/vczh/tinymoe/blob/master/Development/Library/StandardLibrary.txt 銆傝繖涓枃浠舵殏鏃跺寘鍚簡Tinymoe鐨勬暣涓爣鍑嗗簱錛岄噷闈㈠畾涔変簡寰堝if-else/repeat/try-catch-finally絳夋帶鍒舵祦錛岀敋鑷寵繛coroutine閮藉彲浠ョ敤continuation銆乻elect-case鍜岄掑綊鏉ュ仛銆?
榪欎篃鏄?strong>灝忚妯$殑璇█鏍稿績+澶ц妯$殑鏍囧噯搴?/strong>鎵瑕佽〃杈劇殑鎰忔濄傚鏋滃彲浠ユ彁渚涗竴涓猣eature A錛岄氳繃浠栨潵瀹屾垚鍏朵粬蹇呰鐨刦eature B0, B1, B2…鐨勫悓鏃訛紝灝嗘潵璇翠笉瀹氳繕鏈変漢鍙互鍑轟簬鑷繁鐨勯渶姹傦紝寮鍙慏SL鐨勬椂鍊欏畾涔塮eature C錛岄偅涔堝彧鏈堿闇瑕佷繚鐣欎笅鏉ワ紝鎵鏈夌殑B鍜孋閮藉皢浣跨敤搴撶殑鏂規硶鏉ュ疄鐜般?
榪欎箞鍋氬茍涓嶆槸瀹屽叏鏈夌泭鏃犲鐨勶紝鍙槸鍧忓寰堝皬錛屽湪"Tinymoe鐨勫疄鐜伴毦鐐?閲岄潰浼氳緇嗚鏄庛?strong>
浜屻佹墿灞曞悗鐨勪笢瑗胯窡鍘熺敓鐨勪笢瑗垮瑙備竴鑷?
榪欐槸寰堥噸瑕佺殑銆傚鏋滄墿灞曞嚭鏉ョ殑涓滆タ璺熷師鐢熺殑涓滆タ闀垮緱涓嶄竴鏍鳳紝鐢ㄨ搗鏉ュ氨瑙夊緱寰堝偦閫箋侸ava鐨剆tring涓嶈兘鐢?=鏉ュ垽鏂唴瀹瑰氨鏄繖鏍風殑涓涓緥瀛愩傝櫧鐒朵粬浠湁鐨勬槸鐞嗙敱璇佹槑==鐨勫弽鐩磋璁捐鏄鐨勨斺斾絾鏄弽鐩磋灝辨槸鍙嶇洿瑙夛紝灝辨槸涓涓ぇ鍧戙?
榪欑渚嬪瓙榪樻湁寰堝錛岃濡傝go鐨勬暟緇勫拰琛ㄧ殑綾誨瀷鍟︼紝go鏈韓濡傛灉涓嶈鏁扮粍鍜岃〃鐨勮瘽錛屾槸鍐欎笉鍑洪暱寰楄窡鍘熺敓鏁扮粍鍜岃〃涓鏍風殑鏁扮粍鍜岃〃鐨勩傚叾瀹炶繖涔熶笉鏄竴涓ぇ闂錛岄棶棰樻槸go緇欐暟緇勫拰琛ㄧ殑鏍峰瓙鎼炵壒孌婂寲錛岃繕鏈夐偅涓弽鐩磋鐨剆lice鐨勮祴鍊奸棶棰橈紙浼氬悎娉曟孩鍑猴紒錛夛紝綾諱技鐨勪笢瑗垮疄鍦ㄦ槸澶浜嗐備竴涓笢瑗跨壒渚嬪お澶氾紝鍧戝氨鏃犳硶閬垮厤銆傛墍浠ュ叾瀹炲湪鎴戠湅鏉ワ紝go榪樹笉濡傜粰C璇█鍔犱笂erlang鐨刟ctor鍔熻兘浜嗕簨銆?
鍙嶈孋++鍦ㄨ繖浠朵簨鎯呬笂灝卞仛寰楀緢濂姐傚鏋滀綘瀵笴++涓嶇啛鎮夌殑璇濓紝鏈夋椂鍊欐牴鏈垎涓嶆竻浠涔堟槸緙栬瘧鍣ㄥ共鐨勶紝浠涔堟槸鏍囧噯搴撳共鐨勩傝濡傝static_cast鍜宒ynamic_cast闀垮緱鍍忎竴涓ā鏉垮嚱鏁幫紝鍥犳boost灝卞彲浠ョ敤綾諱技鐨勬墜娉曞姞鍏exical_cast鍜岄拡瀵箂hared_ptr鐨剆tatic_pointer_cast鍜宒ynamic_pointer_cast錛屾暣涓爣鍑嗗簱鍜岃璦鏈韓嫻戠劧涓浣撱傝繖鏍峰瓙鍋氱殑濂藉鏄紝褰撲綘鍦ㄥ煿鍏誨璇█鏈韓鐨勭洿瑙夌殑鏃跺欙紝浣犱篃鍦ㄥ煿鍏誨鏍囧噯搴撶殑鐩磋錛屽煿鍏葷洿瑙夎繖浠朵簨鎯呬綘涓嶇敤鍋氫袱嬈°備綘瀵逛竴涓笢瑗跨殑鐩磋瓚婂噯錛屽涔犳柊涓滆タ鐨勯熷害灝辮秺蹇傛墍浠++鐨勮璁″垰濂藉彲浠ヨ浣犲湪鐔繃絎竴涓樁孌電殑瀛︿範涔嬪悗錛屽悗闈㈤兘瑙夊緱鏃犳瘮鐨勮交鏉俱?
涓嶈繃鍏蜂綋鍒癟inymoe錛屽洜涓篢inymoe鏈韓鐨勮娉曞厓绱犲お灝戜簡錛屾墍浠ヨ繖涓仛娉曞湪Tinymoe韜笂浣撶幇寰椾笉鏄庢樉銆?
棣栧厛錛?strong>璇硶鍒嗘瀽闇瑕佸Tinymoe紼嬪簭澶勭悊涓夐亶銆俆inymoe瀵逛簬璇彞璁捐浣垮緱瀵逛竴涓猅inymoe紼嬪簭鍋氳娉曞垎鏋愪笉鏄偅涔堢洿鎺ワ紙铏界劧姣擟++浠涔堢殑榪樻槸瀹規槗澶氫簡錛夈備婦涓緥瀛愶細
module hello world
phrase sum from (lower bound) to (upper bound)
…
end
sentence print (message)
…
end
phrase main
print sum from 1 to 100
end
絎竴閬嶅垎鏋愭槸璇嶆硶鍒嗘瀽錛岃繖涓椂鍊欏緱鎶婃瘡涓涓猼oken鐨勮鍙瘋浣忋傜浜岄亶鍒嗘瀽鏄笉甯︽涔夌殑璇硶鍒嗘瀽錛岀洰鏍囨槸鎶婃墍鏈夌殑鍑芥暟澶存娊鍙栧嚭鏉ワ紝鐒跺悗緇勬垚涓涓叏灞絎﹀彿琛ㄣ傜涓夐亶鍒嗘瀽灝辨槸瀵瑰嚱鏁頒綋閲岄潰鐨勮鍙ュ仛甯︽涔夌殑璇硶鍒嗘瀽浜嗐傚洜涓篢inymoe鍏佽浣犲畾涔夊彉閲忥紝鎵浠ョ鍙瘋〃鑲畾鏄竴杈瑰垎鏋愪竴杈逛慨鏀圭殑銆備簬鏄浜?print sum from 1 to 100"榪欎竴鍙ワ紝濡傛灉浣犳病鏈夊彂鐜?phrase sum from (lower bound) to (upper bound)"鍜?sentence print (message)"錛岄偅鏍規湰鏃犱粠涓嬫墜銆?
榪樻湁鍙︿竴涓緥瀛愶細
module exception handling
…
phrase main
try
do something bad
catch
print "bad thing happened"
end
end
褰撹娉曞垎鏋愬仛鍒?try"鐨勬椂鍊欙紝鍥犱負鍙戠幇瀛樺湪try鍑芥暟鐨勫畾涔?/strong>錛屾墍浠inymoe鐭ラ亾鎺ヤ笅鏉ョ殑"do something bad"灞炰簬璋冪敤try榪欎釜鍧楀嚱鏁版墍闇鎻愪緵鐨勪唬鐮佸潡閲岄潰鐨勪唬鐮併傛帴涓嬫潵鏄?catch"錛孴inymoe鎬庝箞鐭ラ亾catch鏄帴鍦╰ry鍚庨潰錛岃屼笉鏄斁鍦╰ry閲岄潰鐨勫憿錛熻繖浠嶇劧鏄敱浜?strong>catch鍑芥暟鐨勫畾涔?/strong>鍛婅瘔鎴戜滑鐨勩傚叧浜庤繖鏂歸潰鐨勮娉曠煡璇嗗彲浠?a >鐐瑰嚮榪欓噷鏌ョ湅銆?
姝e洜涓哄姝わ紝鎴戜滑闇瑕侀鍏堢煡閬撳嚱鏁扮殑瀹氫箟錛岀劧鍚庢墠鑳藉垎鏋愬嚱鏁頒綋閲岄潰鐨勪唬鐮併傝櫧鐒惰繖鍦ㄤ竴瀹氱▼搴︿笂閫犳垚浜員inymoe鐨勮娉曞垎鏋愬鏉傚害鐨勬彁鍗囷紝浣嗘槸鍏跺鏉傚害鏈韓騫朵笉楂樸傛瘮C++綆鍗曞氨涓嶈浜嗭紝灝辯畻鏄疌銆丆#鍜孞ava錛岀敱浜庡叾璇硶鍏冪礌澶錛屽鑷?strong>涓嶉渶瑕佸嬈″垎鏋?/strong>鎵闄嶄綆鐨勫鏉傚害琚畬鍏ㄧ殑鎶墊秷錛岀粨鏋滆窡瀹炵幇Tinymoe鐨勮娉曞垎鏋愬櫒鐨勯毦搴︿笉鐩鎬笂涓嬨?
鍏舵錛?strong>CPS鍙樻崲鍚庣殑浠g爜闇瑕佺壒孌婂鐞嗭紝鍚﹀垯鐩存帴鎵ц瀹規槗瀵艱嚧call stack縐瘡鐨勬病鐢ㄧ殑涓滆タ榪囧銆傚洜涓篢inymoe鍙互鑷畾涔夋搷浣滅錛屾墍浠ユ搷浣滅璺烠++涓鏍峰湪緙栬瘧鐨勬椂鍊欒杞崲鎴愪簡鍑芥暟璋冪敤銆傛瘡涓涓嚱鏁拌皟鐢ㄩ兘鏄細琚獵PS鍙樻崲鐨勩傚敖綆℃瘡涓琛岀殑鍑芥暟璋冪敤嬈℃暟涓嶅錛屼絾鏄鏋滀綘鐨勭▼搴忔補寰幆錛?strong>寰幆鏄氳繃閫掑綊鏉ユ弿榪?/strong>錛堣屼笉鏄疄鐜幫紝鐢變簬CPS鍙樻崲鍚嶵inymoe鍋氫簡浼樺寲錛屾墍浠ヤ笉瀛樺湪瀹為檯涓婄殑閫掑綊錛夌殑錛屽鏋滅洿鎺ユ墽琛孋PS鍙樻崲鍚庣殑浠g爜錛岀畻涓涓?鍔犲埌1000閮戒細瀵艱嚧stack overflow銆傚彲瑙佸叾call stack閲岄潰鍫嗙Н鐨刢losure鏁伴噺涔嬪法澶с?
鎴戝湪鍋歍inymoe浠g爜鐢熸垚鐨勫疄楠岀殑鏃跺欙紝涓轟簡綆鍗曟垜鍦ㄥ崟鍏冩祴璇曢噷闈㈢洿鎺ヤ駭鐢熶簡瀵瑰簲鐨凜#浠g爜銆備竴寮濮嬫病鏈夊鐞咰PS鑰岀洿鎺ヨ皟鐢紝紼嬪簭涓嶄粎鎱紝鑰屼笖瀹規槗stack overflow銆備絾鏄垜浠煡閬擄紙鍏跺疄浣犱滑浠ュ悗鎵嶄細鐭ラ亾錛夛紝CPS鍙樻崲鍚庣殑浠g爜閲岄潰鍑犱箮鎵鏈夌殑call stack欏歸兘鏄氮璐圭殑錛屽洜姝ゆ垜鎶婃暣涓湪鐢熸垚C#浠g爜鐨勬椂鍊欎慨鏀規垚錛屽鏋滈渶瑕佽皟鐢╟ontinuation錛屽氨榪斿洖璋冪敤continuation鐨勮鍙ョ粍鎴愮殑lambda琛ㄨ揪寮?/strong>錛屽湪鏈澶栧眰鐢ㄤ竴涓驚鐜幓椹卞姩浠栫洿鍒拌繑鍥瀗ull涓烘銆傝繖鏍峰仛浜嗕箣鍚庯紝灝辯畻Tinymoe鐨勪唬鐮佹湁閫掑綊錛宑all stack閲岄潰涔熶笉浼氬洜涓洪掑綊鑰岀Н绱痗all stack item浜嗐備簬鏄敓鎴愮殑C#浠g爜鎵ц椋炲揩錛岃屼笖鏃犺浣犳庝箞閫掑綊涔熸案榪滀笉浼氶犳垚stack overflow浜嗐傝繖涓編濡欑殑鐗規у嚑涔庢墍鏈夎璦閮藉仛涓嶅埌錛屽晩鍝堝搱鍝堝搱鍝堛?
褰撶劧榪欎篃鏄湁浠d環鐨勶紝鍥犱負鏈川涓婃垜鍙槸鎶婁繚瀛樺湪stack涓婄殑context杞Щ鍒癶eap涓娿備笉榪囧浜忎簡.net 4.0鐨勫己澶х殑background GC錛岃繖鏍峰仛涓濇娌℃湁澶氫綑鐨勬ц兘涓婄殑鎹熻椼傚綋鐒惰繖涔熸剰鍛崇潃錛屼竴涓珮鎬ц兘鐨凾inymoe铏氭嫙鏈猴紝闇瑕佷竴涓墰閫肩殑鍨冨溇鏀墮泦鍣ㄤ綔涓洪潬灞便俢ontext浜х敓鐨刢losure鍦ㄥ嚱鏁頒綋鐪熺殑琚墽琛屽畬涔嬪悗灝變細琚緢蹇湴鏀墮泦錛屾墍浠PS鍔犱笂榪欑鍋氭硶騫朵笉浼氬GC浜х敓棰濆鐨勫帇鍔涳紝鎵鏈夌殑鍘嬪姏浠嶇劧鏉ユ簮浜庝綘鑷繁鎵鍒涘緩鐨勬暟鎹粨鏋勩?
絎笁錛?strong>Tinymoe闇瑕佸姩鎬佺被鍨嬭璦鐨勭被鍨嬫帹瀵?/strong>銆傚綋鐒朵綘涓嶈繖涔堝仛鑰屾妸Tinymoe鐨勭▼搴忓綋JavaScript閭f牱鐨勭▼搴忓鐞嗕篃娌℃湁闂銆備絾鏄垜浠煡閬擄紝姝f槸鍥犱負V8瀵笿avaScript鐨勪唬鐮佽繘琛屼簡綾誨瀷鎺ㄥ錛屾墠浜х敓浜嗛偅涔堜紭寮傜殑鎬ц兘銆傚洜姝よ繖綆楁槸涓涓紭鍖栦笂鐨勬帾鏂姐?
鏈鍚庯紝Tinymoe榪橀渶瑕佽法榪囩▼鍒嗘瀽鍜屽紼嬪簭鐨勬帶鍒舵祦鐨勫寲綆錛堣濡俢ontinuation杞姸鎬佹満絳夛級銆傜洰鍓嶅叿浣撴庝箞鍋氭垜榪樺湪瀛︿範褰撲腑銆備笉榪囨垜浠兂錛屾棦鐒秗epeat鍑芥暟鏄氳繃閫掑綊鏉ユ弿榪扮殑錛岄偅鎴戜滑鑳戒笉鑳介氳繃瀵規墍鏈変唬鐮佽繘琛宨nter-procedural analyzing錛屼粠鑰屽彂鐜拌濡?
repeat 3 times
do something good
end
灝辨槸涓涓驚鐜紝浠庤岀敓鎴愮敤鐪熸鐨勫驚鐜寚浠わ紙璀璇磄oto錛夊憿錛熻繖涓棶棰樻槸涓緢鏈夋剰鎬濈殑闂錛屾垜瑙夊緱鎴戝鏋滃彲浠ラ氳繃瀛︿範闈欐佸垎鏋愪粠鑰岃В鍐沖畠錛屼笉榪涙垜鐨勮兘鍔涗細寰楀埌鎻愬崌錛屾垜瀵逛綘浠殑縐戞櫘涔熶細鍋氬緱鏇村ソ銆?
铏界劧榪樹笉鍒頒簲鍗冨瓧錛屼絾鏄昏寰楀啓浜嗗ソ澶氱殑鏍峰瓙銆傛諱箣鎴戝笇鏈涜鑰呭湪鐪嬪畬銆婇浂銆嬪拰銆婁竴銆嬩箣鍚庯紝瀵規帴涓嬫潵闇瑕佸涔犵殑涓滆タ鏈変竴涓緝涓烘竻鏅扮殑璁よ瘑銆?/p>
鍟嗕笟緙栬瘧鍣ㄥ鍔熻兘鍜岃川閲忕殑瑕佹眰閮芥槸寰堥珮鐨勶紝閲岄潰澶ч噺鐨勪笢瑗垮叾瀹為兘璺熺紪璇戝師鐞嗘病鍏崇郴銆備竴涓吀鍨嬬殑緙栬瘧鍘熺悊鐨勫師鍨嬫湁浠涔堢壒寰佸憿錛?
絳夌瓑銆俆inymoe灝辨弧瓚充簡涓婇潰鐨?縐嶆儏鍐碉紝鍥犱負鎴戠殑鐩爣涔熷彧鏄兂鍋氫竴涓師鍨嬶紝鍚戝ぇ瀹朵粙緇嶇紪璇戝師鐞嗙殑鍩虹鐭ヨ瘑銆傚綋鐒訛紝鎴戝璇硶鐨勮璁¤繕鏄敖閲忛潬榪戝伐涓氳川閲忕殑錛屽彧鏄疄鐜版病鏈夎姳澶蹇冩濄?
涓轟粈涔堟垜瑕佺敤Tinymoe鏉ヤ綔涓哄疄渚嬪憿錛熷洜涓篢inymoe鏄皯鏈夌殑涓縐嶇敤璧鋒潵綆鍗曪紝鑰屼笖搴撳彲浠ユ湁澶氬鏉傚啓澶氬鏉傜殑璇█錛屽氨璺烠++涓鏍楓侰++11棰濇爣鍑嗗簱鍦ㄤ竴璧風敤綆鐩存槸鎰夊揩鍟婏紝Tinymoe鐨勪唬鐮佷篃鏄繖涔堝啓鐨勩備絾鏄繖騫朵笉濡ㄧ浣犲彲浠ュ湪鍐機++搴撶殑鏃跺欏彂鎸ヤ綘鐨勬兂璞″姏銆俆inymoe涔熸槸涓鏍風殑銆備負浠涔堝憿錛屾垜鏉ヤ婦涓緥瀛愩?
Tinymoe鐨刪ello world紼嬪簭鏄緢綆鍗曠殑錛?
module hello world
using standard library
sentence print (message)
redirect to "printf"
end
phrase main
print "Hello, world!"
end
module鎸囩殑鏄ā鍧楃殑鍚嶅瓧錛屾櫘閫氱殑紼嬪簭涔熸槸涓涓ā鍧椼倁sing鎸囩殑鏄綘瑕佸紩鐢ㄧ殑妯″潡鈥斺攕tandard library灝辨槸Tinymoe鐨凷TL浜嗏斺斿綋鐒惰繖涓▼搴忓茍娌℃湁鐢ㄥ埌浠諱綍standard library鐨勪笢瑗褲傝鍒拌繖閲屽ぇ瀹跺彲鑳芥剰璇嗗埌浜嗭紝Tinymoe鐨勫悕瀛楀彲浠ユ槸涓嶅畾闀跨殑token緇勬垚鐨勶紒娌¢敊錛屽悗闈㈠ぇ瀹朵細鎱㈡參鎰忚瘑鍒拌繖縐嶅仛娉曟湁澶氫箞鐨勫己澶с?
鍚庨潰鏄痯rint鍑芥暟鍜宮ain鍑芥暟銆俆inymoe鏄弗鏍煎尯鍒嗚鍙ュ拰琛ㄨ揪寮忕殑錛屽彧鏈塻entence鍜宐lock寮澶寸殑鍑芥暟鎵嶈兘浣滀負璇彞錛岃屼笖鍚屾椂鍙湁phrase寮澶寸殑鍑芥暟鎵嶈兘浣滀負琛ㄨ揪寮忋傛墍浠ヤ笅闈㈢殑紼嬪簭鏄笉鍚堟硶鐨勶細
phrase main
(print "Hello, world!") + 1
end
鍘熷洜灝辨槸錛宲rint鏄痵entence錛屼笉鑳戒綔涓鴻〃杈懼紡浣跨敤錛屽洜姝や粬涓嶈兘琚?1銆?
Tinymoe鐨勫嚱鏁板弬鏁伴兘琚啓鍦ㄦ嫭鍙烽噷闈紝涓涓弬鏁伴渶瑕佷竴涓嫭鍙楓傚埌浜嗚繖閲屽ぇ瀹跺彲鑳戒細瑙夊緱寰堝鎬紝涓嶈繃寰堝揩灝變細鏈夎В絳斾簡銆備負浠涔堣榪欎箞鍋氾紝涓嬩竴涓緥瀛愬氨浼氬憡璇夋垜浠?
print鍑芥暟鐢ㄧ殑redirect to鏄疶inymoe澹版槑FFI錛團oreign Function Interface錛夌殑鏂規硶錛屼篃灝辨槸璇達紝褰撲綘榪愯浜唒rint錛屼粬灝變細鍘籬ost閲岄潰鎵句竴涓彨鍋歱rintf鐨勫嚱鏁版潵榪愯銆備笉榪囧ぇ瀹朵笉瑕佽浼氾紝Tinymoe騫舵病鏈夎璁捐鎴愬彲浠ョ洿鎺ヨ皟鐢–鍑芥暟錛屾墍浠ヨ繖涓悕瀛楀叾瀹炴槸闅忎究鍐欑殑錛屽彧瑕乭ost鎻愪緵浜嗕竴涓彨鍋歱rintf鐨勫嚱鏁板畬鎴恜rintf璇ュ仛鐨勪簨鎯呭氨琛屼簡銆俶ain鍑芥暟灝變笉鐢ㄨВ閲婁簡錛屽緢鐩寸櫧銆?
榪欎釜渚嬪瓙鍙互鍦═inymoe鐨勪富欏碉紙https://github.com/vczh/tinymoe/錛変笂闈㈢湅鍒幫細
module hello world
using standard library
sentence print (message)
redirect to "printf"
end
phrase sum from (start) to (end)
set the result to 0
repeat with the current number from start to end
add the current number to the result
end
end
phrase main
print "1+ ... +100 = " & sum from 1 to 100
end
涓轟粈涔堝悕瀛楀彲浠ユ槸澶氫釜token錛熶負浠涔堟瘡涓涓弬鏁伴兘瑕佷竴涓嫭鍙鳳紵鐪嬪姞綺楃殑閮ㄥ垎灝辯煡閬撲簡錛佹鏄洜涓篢inymoe鎯寵姣忎竴琛屼唬鐮侀兘鍙互琚康鍑烘潵錛屾墍浠ユ墠榪欎箞璁捐鐨勩傚綋鐒訛紝澶у鑲畾閮界煡閬撴庝箞綆梥tart + (start+1) + … + (end-1) + end浜嗭紝鎵浠ュ簲璇ュ緢瀹規槗灝卞彲浠ョ湅鎳傝繖涓嚱鏁伴噷闈㈢殑浠g爜鍏蜂綋鏄粈涔堟剰鎬濄?
鍦ㄨ繖閲屽彲浠ョ◢寰鍋氫竴涓嬭В閲娿倀he result鏄竴涓瀹氫箟鐨勫彉閲忥紝浠h〃鍑芥暟鐨勮繑鍥炲箋傚彧瑕佷綘寰the result閲岄潰鍐欎笢瑗匡紝鍙鍑芥暟涓緇撴潫錛屼粬灝卞彉鎴愬嚱鏁扮殑榪斿洖鍊間簡銆俆inymoe鐨勬嫭鍙鋒病鏈変粈涔堢壒孌婃剰鎬濓紝灝辨槸鏀瑰彉浼樺厛綰э紝鎵浠ラ偅涓鍙ュ驚鐜垯鍙互閫氳繃娣誨姞鎷彿鐨勬柟娉曞啓鎴愯繖鏍鳳細
repeat with (the current number) from (start) to (end)
澶у鍙兘浼氭兂錛宺epeat with鏄笉鏄叧閿瓧錛熷綋鐒朵笉鏄紒repeat with鏄痵tandard library閲岄潰瀹氫箟鐨勪竴涓猙lock鍑芥暟銆傚ぇ瀹剁煡閬揵lock鍑芥暟鐨勬剰鎬濅簡鍚э紝灝辨槸榪欎釜鍑芥暟鍙互甯︿竴涓猙lock銆俠lock鏈変竴浜涚壒鎬у彲浠ヨ浣犲啓鍑虹被浼紅ry-catch閭f牱鐨勫嚑涓猙lock榪炲湪涓璧風殑澶lock錛岀壒鍒傚悎鍐欏簱銆?
鍒頒簡榪欓噷澶у蹇冧腑鍙兘浼氭湁鐤戦棶錛屽驚鐜負浠涔堝彲浠ュ仛鎴愬簱鍛紵榪樻湁鏇村姞浠や漢闇囨儕鐨勬槸錛宐reak鍜宑ontinue涔熶笉鏄叧閿瓧錛屾槸sentence錛佸洜涓簉epeat with鏄湁浠g爜鐨勶細
category
start REPEAT
closable
block (sentence deal with (item)) repeat with (argument item) from (lower bound) to (upper bound)
set the current number to lower bound
repeat while the current number <= upper bound
deal with the current number
add 1 to the current number
end
end
鍓嶉潰鐨刢ategory鏄敤鏉ュ畾涔変竴浜沚lock鐨勯『搴忓拰鍖呭洿緇撴瀯浠涔堢殑銆俽epeat with鏄睘浜嶳EPEAT鐨勶紝鑰宐reak鍜宑ontinue澹版槑浜嗚嚜宸卞彧鑳界洿鎺ユ垨鑰呴棿鎺ユ柟鍦≧EPEAT閲岄潰錛屽洜姝ゅ鏋滀綘鍦ㄤ竴涓病鏈夊驚鐜殑鍦版柟璋冪敤break鎴栬卌ontinue錛岀紪璇戝櫒灝變細鎶ラ敊浜嗐傝繖鏄竴涓姳杈瑰姛鑳斤紝鐢ㄦ潵闃叉鎵嬭鐨勩?
澶у鍙兘浼氭敞鎰忓埌涓涓柊涓滆タ錛?argument item)銆俛rgument鐨勬剰鎬濇寚鐨勬槸錛屽悗闈㈢殑item鏄痓lock閲岄潰鐨勪唬鐮佺殑涓涓弬鏁幫紝瀵逛簬repeat with鍑芥暟鏈韓浠栦笉鏄竴涓弬鏁般傝繖灝遍氳繃涓涓緢鑷劧鐨勬柟娉曠粰block娣誨姞鍙傛暟浜嗐傚鏋滀綘鐢╮uby鐨勮瘽灝卞緱鍐欐垚榪欎釜鎮插偓鐨勬牱瀛愶細
repeat_with(1, 10) do |item|
xxxx
end
鑰岀敤C++鍐欒搗鏉ュ氨鏇存偛鍌簡錛?
repeat_with(1, 10, [](int item)
{
xxxx
});
block鐨勭涓涓弬鏁皊entence deal with (item)灝辨槸涓涓紩鐢ㄤ簡block涓棿鐨勪唬鐮佺殑濮旀墭銆傛墍浠ヤ綘浼氱湅鍒頒唬鐮侀噷闈細璋冪敤瀹冦?
濂戒簡錛岄偅repeat while鎬繪槸鍏抽敭瀛椾簡鍚р斺斾笉鏄紒鍚庨潰澶у榪樹細鐭ラ亾錛屽氨榪?
if xxx
yyy
else if zzz
www
else if aaa
bbb
else
ccc
end
涔熷彧鏄綘璋冪敤浜唅f銆乪lse if鍜宔lse鐨勪竴緋誨垪鍑芥暟鐒跺悗璁╀粬浠覆璧鋒潵鑰屽凡銆?
閭inymoe鍒板簳鎻愪緵浜嗕粈涔堝熀紜璁炬柦鍛紵鍏跺疄鍙湁select-case鍜岄掑綊銆傜敤榪欎袱涓笢瑗匡紝鍔犱笂鍐呯疆鐨勬暟緇勶紝灝卞浘鐏靛畬澶囦簡銆傚浘鐏靛畬澶囧氨鏄繖涔堝鏄撳晩銆?
璁插埌榪欓噷錛屾垜涓嶅緱涓嶈錛孴inymoe涔熷彲浠ュ啓綾伙紝涔熷彲浠ョ戶鎵匡紝涓嶈繃浠栬窡浼犵粺鐨勮璦涓嶄竴鏍風殑錛岀被鏄病鏈夋瀯閫犲嚱鏁般佹瀽鏋勫嚱鏁板拰鍏朵粬鎴愬憳鍑芥暟鐨勩俆inymoe鎵鏈夌殑鍑芥暟閮芥槸鍏ㄥ眬鍑芥暟錛屼絾鏄綘鍙互浣跨敤澶氶噸鍒嗘淳鏉?鎸戦?綾誨瀷銆傝繖灝遍渶瑕佺涓変釜渚嬪瓙浜嗭紙涔熷彲浠ュ湪涓婚〉涓婃壘鍒幫級錛?
module geometry
using standard library
phrase square root of (number)
redirect to "Sqrt"
end
sentence print (message)
redirect to "Print"
end
type rectangle
width
height
end
type triangle
a
b
c
end
type circle
radius
end
phrase area of (shape)
raise "This is not a shape."
end
phrase area of (shape : rectangle)
set the result to field width of shape * field height of shape
end
phrase area of (shape : triangle)
set a to field a of shape
set b to field b of shape
set c to field c of shape
set p to (a + b + c) / 2
set the result to square root of (p * (p - a) * (p - b) * (p - c))
end
phrase area of (shape : circle)
set r to field radius of shape
set the result to r * r * 3.14
end
phrase (a) and (b) are the same shape
set the result to false
end
phrase (a : rectangle) and (b : rectangle) are the same shape
set the result to true
end
phrase (a : triangle) and (b : triangle) are the same shape
set the result to true
end
phrase (a : circle) and (b : circle) are the same shape
set the result to true
end
phrase main
set shape one to new triangle of (2, 3, 4)
set shape two to new rectangle of (1, 2)
if shape one and shape two are the same shape
print "This world is mad!"
else
print "Triangle and rectangle are not the same shape!"
end
end
榪欎釜渚嬪瓙紼嶅井闀夸簡涓鐐圭偣錛屼笉榪囧ぇ瀹跺彲浠ュ緢娓呮鐨勭湅鍒版垜鏄浣曞畾涔変竴涓被鍨嬨佸垱寤轟粬浠拰璁塊棶鎴愬憳鍙橀噺鐨勩俛rea of鍑芥暟鍙互璁$畻涓涓鉤闈㈠嚑浣曞浘褰㈢殑闈㈢Н錛岃屼笖浼氭牴鎹綘浼犵粰浠栫殑涓嶅悓鐨勫嚑浣曞浘褰㈣屼嬌鐢ㄤ笉鍚岀殑鍏紡銆傚綋鎵鏈夌殑綾誨瀷鍒ゆ柇閮藉け璐ョ殑鏃跺欙紝灝變細鎺夎繘閭d釜娌℃湁浠諱綍綾誨瀷澹版槑鐨勫嚱鏁幫紝浠庤屽紩鍙戜竴鍦恒傚棷錛屽叾瀹瀟ry/catch/finally/raise閮芥槸鍑芥暟鏉ョ殑鈥斺擳inymoe瀵規帶鍒舵祦鐨勬帶鍒跺氨鏄姝ゅ己澶э紝鍟婂搱鍝堝搱鍝堛傚氨榪瀝eturn閮藉彲浠ヨ嚜宸卞仛錛屾墍浠inymoe涔熶笉鎻愪緵棰勫畾涔夌殑return銆?
閭hrase (a) and (b) are the same shape鎬庝箞鍔炲憿錛熸病闂錛孴inymoe鍙互鍚屾椂鎸囧畾澶氫釜鍙傛暟鐨勭被鍨嬨傝屼笖Tinymoe鐨勫疄鐜板叿鏈夎窡C++铏氬嚱鏁頒竴鏍風殑鎬ц川鈥斺旀棤璁轟綘鏈夊灝戜釜鍙傛暟鏍囪浜嗙被鍨嬶紝鎴戦兘鍙互O(n)璺寵漿鍒頒竴涓綘闇瑕佺殑鍑芥暟銆傝繖閲岀殑n鎸囩殑鏄爣璁頒簡綾誨瀷鐨勫弬鏁扮殑涓暟錛岃屼笉鏄嚱鏁板疄渚嬬殑涓暟錛屾墍浠ヨ窡C++鐨勬儏鍐墊槸涓鏍風殑鈥斺斿洜涓簍his鍙兘鏈変竴涓紝鎵浠ュ氨鏄疧(1)銆傝嚦浜嶵inymoe鍒板簳鏄庝箞瀹炵幇鐨勶紝鍙渶瑕佺湅銆婂浣曡璁′竴闂ㄨ璦銆嬬浜旂瘒錛?a href="http://m.shnenglu.com/vczh/archive/2013/05/25/200580.html">http://m.shnenglu.com/vczh/archive/2013/05/25/200580.html錛夊氨鏈夌瓟妗堜簡銆?
涓轟粈涔圱inymoe鐨勬帶鍒舵祦閮藉彲浠ヨ嚜宸卞仛鍛紵鍥犱負Tinymoe鐨勫嚱鏁伴兘鏄啓鎴愪簡CPS榪欑椋庢牸鐨勩傚叾瀹濩PS澶у閮藉緢鐔熸倝錛屽綋浣犵敤jquery鍋氬姩鐢伙紝鐢╪ode.js鍋欼O鐨勬椂鍊欙紝閭d簺宓屽鐨勪竴涓竴涓殑lambda琛ㄨ揪寮忥紝灝辨湁鐐笴PS鐨勫懗閬撱備笉榪囧湪榪欓噷鎴戜滑騫舵病鏈夌湅鍒板祵濂楃殑lambda錛岃繖鏄洜涓篢inymoe鎻愪緵鐨勮娉曪紝璁㏕inymoe鐨勭紪璇戝櫒鍙互鎶婂悓涓涓眰嬈$殑浠g爜錛岃漿鎴愬祵濂楃殑lambda閭f牱鐨勪唬鐮併傝繖涓繃紼嬪氨鍙獵PS鍙樻崲銆俆inymoe铏界劧鐢ㄤ簡寰堝鍑芥暟寮忕紪紼嬬殑鎵嬫錛屼絾鏄粬騫朵笉鏄竴闂ㄥ嚱鏁版槸璇█錛屽彧鏄竴闂ㄦ櫘閫氱殑榪囩▼寮忚璦銆備絾鏄繖璺烠璇█涓嶄竴鏍鳳紝鍥犱負瀹冭繛C#鐨剏ield return閮藉彲浠ュ啓鎴愬嚱鏁幫紒榪欎釜渚嬪瓙灝辨洿闀夸簡錛屽ぇ瀹跺彲浠ュ埌Tinymoe鐨勪富欏典笂鐪嬨傛垜榪欓噷鍙創涓灝忔浠g爜錛?
module enumerable
using standard library
symbol yielding return
symbol yielding break
type enumerable collection
body
end
type collection enumerator
current yielding result
body
continuation
end
鐣ワ紙榪欓噷瀹炵幇浜嗚窡enumerable鐩稿叧鐨勫嚱鏁幫紝鍖呮嫭yield return錛?
block (sentence deal with (item)) repeat with (argument item) in (items : enumerable collection)
set enumerator to new enumerator from items
repeat
move enumerator to the next
deal with current value of enumerator
end
end
sentence print (message)
redirect to "Print"
end
phrase main
create enumerable to numbers
repeat with i from 1 to 10
print "Enumerating " & i
yield return i
end
end
repeat with number in numbers
if number >= 5
break
end
print "Printing " & number
end
end
浠涔堝彨妯℃嫙C#鐨剏ield return鍛紵灝辨槸榪炴儼鎬ц綆椾篃涓璧鋒ā鎷燂紒鍦╩ain鍑芥暟鐨勭涓閮ㄥ垎錛屾垜鍒涘緩浜嗕竴涓猠numerable錛坕terator錛夛紝鍖呭惈1鍒?0鍗佷釜鏁板瓧錛岃屼笖姣忎駭鐢熶竴涓暟瀛楄繕浼氭墦鍗板嚭涓鍙ヨ瘽銆備絾鏄帴涓嬫潵鎴戝湪寰幆閲岄潰鍙彇鍓?涓紝鎵撳嵃鍓?涓紝鍥犳鎵ц緇撴灉灝辨槸
褰擄紒
CPS椋庢牸鐨勫嚱鏁扮殑濞佸姏鍦ㄤ簬錛屾瘡涓涓嚱鏁伴兘鍙互鎺у埗浠栧浣曟墽琛屽嚱鏁扮粨鏉熶箣鍚庡啓鍦ㄥ悗闈㈢殑浠g爜銆備篃灝辨槸璇達紝浣犲彲浠ユ牴鎹綘鐨勯渶瑕侊紝騫茶剢閫夋嫨淇濇姢鐜板満錛岀劧鍚庝互鍚庡啀鍥炲銆傛槸涓嶆槸鍚搗鏉ュ緢鍍弆ua鐨刢oroutine鍛紵鍦═inymoe錛宑oroutine涔熷彲浠ヨ嚜宸卞仛錛?
铏界劧鍑芥暟鏈鍚庤杞崲鎴愪簡CPS椋庢牸鐨刟st錛岃屼笖嫻嬭瘯鐢ㄧ殑鐢熸垚C#浠g爜鐨勭‘涔熸槸鍘熷皝涓嶅姩鐨勮緭鍑轟簡鍑烘潵錛屾墍浠ヨ繍琛岃繖涓▼搴忚楄垂浜嗗ぇ閲忕殑鍑芥暟璋冪敤銆備絾榪欏茍涓嶆剰鍛崇潃Tinymoe鐨勮櫄鎷熸満涔熻榪欎箞鍋氥傚ぇ瀹惰璁頒綇錛屼竴涓璦涔熷ソ錛岀被搴撲篃濂斤紝緇欎綘鐨勬帴鍙g殑姒傚康錛岃窡瀹炵幇鐨勬蹇碉紝鏈夊彲鑳藉畬鍏ㄤ笉鍚屻倅ield return鍐欏嚭鏉ョ殑紜鑺辮垂鐐瑰績鎬濓紝鎵浠ャ婂簭璦銆嬫垜涔熶笉璁茶繖涔堝浜嗭紝鍚庣畫鐨勬枃绔犱細璇︾粏浠嬬粛榪欐柟闈㈢殑鐭ヨ瘑錛屽綋鐒朵簡錛岃繕浼氬憡璇変綘鎬庝箞瀹炵幇鐨勩?
榪欓噷鎴戞寫閫変簡鍥涗釜渚嬪瓙鏉ュ睍紺篢inymoe鏈閲嶈鐨勪竴浜涙蹇點備竴闂ㄨ璦錛岃搴旂敤鐢ㄨ搗鏉ョ畝鍗曪紝搴撳啓璧鋒潵鍙互鍙戞尌鎯寵薄鍔涳紝鎵嶆槸鏈夊墠閫旂殑銆倅ield return渚嬪瓙閲岄潰鐨刴ain鍑芥暟涓鏍鳳紝鐢ㄧ殑鏃跺欏娓呯埥錛屾竻鐖藉埌璁╀綘瀹屽叏蹇樿yield return瀹炵幇鐨勬椂鍊欓噷闈㈢殑鍚勭楹葷儲鐨勭粏鑺傘?
鎵浠ヤ負浠涔堟垜瑕佹寫閫塗inymoe浣滀負瀹炰緥鏉ョ鏅紪璇戝師鐞嗗憿錛熸湁涓や釜鍘熷洜銆傜涓涓師鍥犳槸錛屾兂瑕佸疄鐜癟inymoe錛岄渶瑕佸ぇ閲忕殑鐭ヨ瘑銆傛墍浠ユ棦鐒惰繖涓郴鍒楁兂璁╁ぇ瀹惰兘澶熺湅瀹屽疄鐜頒竴涓猅inymoe鐨勪綆璐ㄩ噺鍘熷瀷錛屽綋鐒朵細璁插緢澶氱煡璇嗙殑銆傜浜屼釜鍘熷洜鏄紝鎴戞兂閫氳繃榪欎釜渚嬪瓙鍚戝ぇ瀹跺皢涓涓亾鐞嗭紝灝辨槸搴撳拰搴旂敤 銆佺紪璇戝櫒鍜岃娉曘佸疄鐜板拰鎺ュ彛錛屽畬鍏ㄥ彲浠ュ仛鍒伴殧紱誨鏉傦紝鍙暀緇欐渶緇堢敤鎴風畝鍗曠殑閮ㄥ垎銆?span style="font-size:14pt">浣犵湅鍒扮殑澶嶆潅鐨勬帴鍙o紝騫朵笉鎰忓懗鐫浠栫殑瀹炵幇鏄噧鑲跨殑銆備綘鐪嬪埌鐨勭畝鍗曠殑鎺ュ彛錛屼篃涓嶆剰鍛崇潃浠栫殑瀹炵幇灝卞緢綆媧?/strong>銆?
Tinymoe鐩墠宸茬粡鍙互杈撳嚭C#浠g爜鏉ユ墽琛屼簡銆傚悗闈㈡垜榪樹細緇橳inymoe鍔犱笂闈欐佸垎鏋愬拰綾誨瀷鎺ㄥ銆傚浜庤繖綾昏璦鍋氶潤鎬佸垎鏋愬拰綾誨瀷鎺ㄥ鍙堝緢澶氶夯鐑︼紝鎴戠幇鍦ㄨ繕娌℃湁瀹屽叏鎼炴槑鐧姐傝濡傝榪欑鍙互鑷繁鎺у埗continuation鐨勫嚱鏁拌鎬庝箞緙栬瘧鎴愮姸鎬佹満鎵嶈兘閬垮厤鎺夊ぇ閲忕殑鍑芥暟璋冪敤錛屽氨涓嶆槸涓涓鏄撶殑闂銆傛墍浠ュ湪緋誨垪涓杈瑰仛鐨勬椂鍊欙紝鎴戣繕浼氫竴杈圭爺絀惰繖涓簨鎯呫傚鏋滃埌鏃跺欑郴鍒楁妸緙栬瘧閮ㄥ垎鍐欏畬鐨勫悓鏃訛紝榪欎簺闂鎴戜篃鎼炴槑鐧界殑璇濓紝閭f垜灝變細璁╄繖涓郴鍒楁墿灞曞埌鍖呭惈闈欐佸垎鏋愬拰綾誨瀷鎺ㄥ錛岀戶緇線涓嬭銆?/p>
Gaclib緇堜簬鍋氬埌瀹夊叏鐨勬敮鎸丆++鐨勫弽灝勩佷粠XML鍔犺澆紿楀彛鍜屾帶浠朵簡銆傜幇鍦ㄥ湪瀹炵幇鐨勪笢瑗垮垯鏄竴涓粰gaclib鐢ㄧ殑workflow灝忚剼鏈紝鐢ㄦ潵鍐欎竴浜涚畝鍗曠殑view鐨勯昏緫銆佸畾涔塿iewmodel鎺ュ彛錛岃繕鏈夎窡WPF宸笉澶氱殑data binding銆?
Tinymoe鏄垜澶т簩鐨勬椂鍊欏氨璁捐鍑烘潵鐨勪笢瑗匡紝鏃犲浠ュ墠瀵硅綆楁満鐨勭悊璁哄熀紜浜嗚В鐨勫お灝戯紝浠ヨ嚦浜庢病娉曞疄鐜幫紝鐩村埌鐜板湪鎵嶈兘鍋氬嚭鏉ャ傛葷殑鏉ヨtinymoe鏄竴涓ā浠胯嫳璇娉曠殑涓ヨ們鐨勭紪紼嬭璦鈥斺斾篃灝辨槸璇村畠鏄笉鍩轟簬NLP鐨勶紝璇硶鏄弗鏍肩殑錛屽啓閿欎竴涓崟璇嶄篃浼氱紪璇戜笉榪囥傚洜姝ゆ墍鏈夌殑鍑芥暟閮借鍐欐垚鐭錛屽寘鎷帶鍒舵祦璇彞涔熸槸銆傛墍浠ユ垜灝辨兂浜嗕竴鎯籌紝鑳戒笉鑳借鍒嗘敮銆佸驚鐜佸紓甯稿鐞嗗拰寮傛澶勭悊絳夌瓑鍏朵粬璇█鐨勫唴緗殑鍔熻兘鍦ㄦ垜榪欓噷閮藉彉鎴愬簱錛熻繖褰撶劧鏄彲浠ョ殑錛屽彧瑕佸仛鍏ㄦ枃鐨刢ps鍙樻崲錛岀劧鍚庤姹傝繖浜涙帶鍒舵祦鍑芥暟涔熷啓鎴恈ps鐨勯鏍煎氨鍙互浜嗐?
鐩墠鐨勭涓涓兂娉曟槸錛岀瓑鎼炲ソ浜嗕箣鍚庡厛鐢熸垚javascript鎴栬匔#鐨勪唬鐮侊紝涓嶅お鎯沖啓鑷繁鐨刅M浜嗭紝鐒跺悗灝卞嚭涓涓郴鍒楁枃绔犲彨鍋氥婄湅瀹炰緥璺熷ぇ鐗涘緙栬瘧鍘熺悊銆嬶紝灝變互榪欎釜tinymoe浣滀負渚嬪瓙錛屾潵鎶娿婂浣曡璁′竴闂ㄨ璦銆嬪歡緇笅鍘伙紝鍟婂搱鍝堝搱鍝堝搱銆?
鍐欏崥瀹㈡槸涓浠跺緢闅劇殑浜嬫儏銆傛垜澶т笁寮濮嬬粡钀ヨ繖涓猚ppblog/cnblogs鐨勫崥瀹㈢殑鏃跺欙紝涓澶╅兘鍙互鍐欎竴綃囷紝鍩烘湰涓婃槸鍦ㄨ褰曟垜瀛﹀埌鐨勪笢瑗垮拰鎴戦犵殑杞瓙銆傜幇鍦ㄩ兘姣旇緝鎳掍簡錛岃寰楁暣澶╄鑷繁鍦ㄥ紑鍙戜粈涔堜篃娌℃剰鎬濅簡錛屼簬鏄兂鍐欎竴浜涘埆鐨勶紝绔熺劧涓嶇煡濡備綍涓嬫墜錛屼簬鏄氨鍑轟簡鍚勭娌″~瀹岀殑緋誨垪銆?
鎴戣寰楁垜瀛︾紪紼嬭繖13騫存潵涔熸槸瀛﹀埌浜嗕笉灝戜笢瑗跨殑錛岄櫎浜嗙函綺圭殑api鍜岃璦鐨勭煡璇嗕互澶栵紝寰堝鏂規硶璁洪兘緇欐垜璧峰埌浜嗗崄鍒嗛噸瑕佺殑浣滅敤銆備竴寮濮嬫槸闈㈠悜瀵硅薄錛岀劧鍚庢槸鏁版嵁緇撴瀯綆楁硶錛岀劧鍚庢槸闈㈠悜鏂歸潰緙栫▼錛岀劧鍚庢槸鍑芥暟寮忕紪紼嬶紝鍚庢潵榪樻帴瑙︿簡鍚勭璺熷嚱鏁板紡緙栫▼鏈夊叧鐨勬蹇碉紝璀璇磖eactive programming鍟婏紝actor鍟婏紝寮傛鍟婏紝continuation絳夌瓑銆傝剳瀛愰噷鍏呮弧浜嗗悇縐嶅悇鏍風殑鏂規硶璁哄拰妯″瀷涔嬪悗錛岀幇鍦ㄦ棤璁哄啓浠涔堢▼搴忥紝鍑犱箮閮藉彲浠ユ嬁榪欎簺涓滆タ寰涓婂錛岀劧鍚庡仛鍑轟竴涓淮鎶や篃寰堝鏄擄紙鍓嶆彁鏄湁榪欎簺鐭ヨ瘑錛夛紝浠g爜涔熷緢綆媧佺殑紼嬪簭浜嗐?
宸ヤ綔鐨勮繖鍥涘勾鍗婇噷錛岃鎴戝涔犲埌浜嗘枃妗e拰鑷姩鍖栨祴璇曠殑閲嶈鎬э紝浜庢槸鍒╃敤榪欏嚑騫存垜鎶婃枃妗e拰嫻嬭瘯鐨勮兘鍔涗篃閿葷偧鐨勫樊涓嶅浜嗐傜幇鍦ㄦ垜瑙夊緱錛屾妧鏈殑璇濆伐浣滃簲浠樿搗鏉ユ槸瓚呯駭綆鍗曪紝浣嗘槸鑷繁瀵規妧鏈殑鐑儏榪樻槸淇冧嬌鎴戜笉鏂殑鐮旂┒涓嬪幓銆?014騫村簲璇ョ爺絀剁殑鎶鑳藉氨鏄槾鐐簡銆?/p>