Cyanã®ã½ã¼ã¹ããã¯ã試ã¿ã 2åééæ
Cyanã¯ãã£ããé¢ç½ãã®ã«ãç¾å¨ã®å®è£ ãé ããã¦ã¾ã éã³ã«ããã®ãæ®å¿µã§ããã¨ãã«ãåç´ç¹°ãè¿ãã«ãããå¼±ãã
#1000åã®æ°åããäºä¹ã1ã«ãªããã®ã ãæ½åº(ã¤ã¾ã1ã ã) iota(1000).filter^(x){ x * x == 1 }
ãããèªåã®ãã·ã³ã§ç´8ç§ããããã¾ãããã¹ã¿ãã¯ãã·ã³ãããªãããã¨ãã£ã¦ããLispã®è©ä¾¡æ©ããããªã«é
ãã¯ãããªããã¨ããããã§ã
cyan-1.0.2 - takuto_hの日記
ããã¼ã¹ã«ã½ã¼ã¹ãããã¯ãã¦ã¿ã¾ããã
src/Cyan/Evalutor.cs ã® Evaluor::Run ã¡ã½ãã(ä»®æ³ãã·ã³ã®æå°åä½å½ä»¤ãåãã«ã¼ãã£ã½ã)ã«ãªã«ããæªãããªé¨åãçºè¦ã
while (instructions.Count > 0) { insn = instructions[0]; instructions.RemoveAt(0); //PrintState(insn); GetType().GetMethod(insn.Key).Invoke(this, insn.Value); }
GetMethodãã¦Invokeã¦â¦ãããã°ã©ã ã®æå°åä½ã§æ¯åãªãã¬ã¯ã·ã§ã³ã£ã¦ããããé ããªãããã ãenumã§å ¨ãªãã³ã¼ããå®ç¾©(enum Opcode...)ãã¦ããªãã¬ã¯ã·ã§ã³ã§æ¸ãããé¨åã
switch(insn.Key) { case Opcode.Push: Push((CyBase)insn.Values[0]); break; case Opcode.Pop: Pop(); break; // (ry }
ãããªæãã«ãªãããã«ä½ãå¤ãã¦ã¿ã(ã¤ã³ã¹ãã©ã¯ã·ã§ã³ã®ãªã¹ãã®ãå½ä»¤åãåæã®å¤ã«ãªãããã«å¤æ´ãã)ã¨ããªãã¨ã8ç§ããã£ã¦ãã®ã4ç§ã¡ãã£ã¨åãã¨ããã¾ã§è¡ãã¾ãããã ãã¶éããªã£ããã©ãã¾ã ã¾ã â¦ã
次ã«æªããã®ã¯ãinstructions.RemoveAt(0) ãããã§ãããããC#ã§List(æ®éã®é åã ãããããã)ã®å é ãåãé¤ãã¨ããã®ã¯ã1ããæ«å°¾ã¾ã§ã®è¦ç´ ã1ã¤ã¥ã¤ãããå¿ è¦ãããã®ã§ãã¤ã³ããã¯ã¹ãé²ãããã¨ã«ãã£ã¦ãæ¶ãããã¨ã«ãããããé£éãªã¹ãã«ãã¦ããããã¨ããã§ããã§ããçæã³ã¹ãã¨ã®ãã¬ã¼ããªããèããªãã¨ãã¨æãããã®ãã¼ã¿ã®åºæã調ã¹ã¦ã¿ãã¨â¦ã
src/Cyan/Objects/CyContinuation.cs ã®ã³ã³ã¹ãã©ã¯ã¿ã®
instructions = new List<KeyValuePair<string, object[]>>(insns);
ã£ã¦ã®ããã®ä¸»è¦ãªçºçæºã§ãããCyanã®ç¶ç¶ã¨ããã®ã¯ããå®è¡ãããã¨ãã以éããæ®ã£ã¦ãªã(æªå®è¡ã®)å½ä»¤ãªã¹ãããããã³ãã¼ããã¯ã¢ããããããã®ãããªãã»ã©ããã¯ã·ã³ãã«ãç¶ç¶ã使ãã¨ãã¯ãããã¯ã¢ããããæªå®è¡å½ä»¤ã®ãªã¹ãã復å ããã ããããé£ã«ã¯ããªã«ããã¹ã¿ãã¯ã®ã³ãã¼ãåã£ã¦ãã¨ãããããã¾ããã
ã£ã¦ãå°ã éãã¦ãé »åº¦ãå°ãªããããã¨æãããããªãªãªãã¨ãCyContinuationã£ã¦ãçæåæ°ãå°å¸¸ãããªããããå¤ããã§ãããã2åã®æ´æ°ãå ç®ããã ãã§3åã3ã¤ã®æ´æ°ã®å ç®ã§6åã®CyContinuationãçæããã¾ãããã¤ã¾ãã1000åã«ã¼ãã§æ¼ç®å2åã ã¨ã軽ãè¦ç©ãã£ã¦6000åCyContinuationã³ã³ã¹ãã©ã¯ã¿ãéããã¨ã«ãªãã¾ããããã6000åã®newãåé¡ã©ããã®é¨ããããªãã¦ãå½ä»¤ãªã¹ãã¨ã¹ã¿ãã¯ã®ã³ãã¼ã¨å¾©å ã®éãããâ¦ã
Cyanã®æ§æã¯Cyanã®ãã¯ããé¢æ°ã§å®ç¾©ããã¦ã¦ããã¤ãCyanã®returnã¯ç¶ç¶ã§å®ç¾ããã¦ãããã¨ãããã¨ãèããã¨ããã£ã±ããç¶ç¶ã®çæã¨å½ä»¤ãªã¹ãã®ã³ãã¼/復å ã«ã¯ãæé©åã®å¹æãæå¾ ã§ãããã§ãã
é£éãªã¹ãã®ãã¼ãã次ã®ãã¼ãã«é²ãããããªæãã§å½ä»¤ãæ¶åããããã¯ã¢ãããåãã¨ãã¯ç¾å¨ãã¼ãã¸ã®ãã¤ã³ã¿ãåãããã«ããã°ã©ãã ãã?ãã¹ã¿ãã¯ãã³ãã¼ãåãããã©ãã«ããã¤ã³ã¿åãæ¿ãã«ãªããªãã ãããâ¦ããã¨ã¯ã大éã«newãã¦ããªãµã¤ã¯ã«ãæå¾ ã§ãããªãã¸ã§ã¯ããããªãã¨ã
ã£ã¦ãèããã¨ããã¾ã§ã§éçãã©ããç¬èªã®ã³ã¬ã¯ã·ã§ã³ã¯ã©ã¹ãè¦ãããã ããç¶ãã¯ããã¨ãæãªã¨ãã«èãããããã ãããã§ç¢ºãã«ãªã£ãã®ã¯ãç¾ãã¼ã¸ã§ã³ã®Cyanã®å®è£ ã¯ãã¾ã åºããæ§è½ãåºãåã£ã¦ããªãã£ã¦ãã¨ã§ããããé¢ç½ãã
ãã¼ããæ«å°¾å帰(ã¨ããããå½ä»¤ãªã¹ã空ç¶æ ã§ã®ç¶ç¶çºçãã)ã®æé©åãã§ãããã ããªãã¨ãªãã