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