ç§ãã¡ã¯çãMicrosoft Excelãªã©ã®ã¹ãã¬ããã·ãŒãã䜿çšããããšããããŸãã ããŒãã«ã®ã»ã«ã«ããŠãŒã¶ãŒã¯ä»ã®ã»ã«ãåç §ããæ°åŒãèšè¿°ã§ããŸãã ãããã®ããããã®å€ãå€æŽããããšãæ°åŒãåèšç®ãããã»ã«ãèªåçã«æŽæ°ãããŸãã ããã«ãç§ãã¡ã®ã»ã«ãä»ã®æ°åŒã«åå ããŠããå Žåããããã¯èªåçã«åã«ãŠã³ãããããªã©ãé£éåå¿ã®çºçã«äŒŒãããã»ã¹ã«ãªããŸãã ãããã£ãŠãããããªã¢ã¯ãã£ãããã°ã©ãã³ã°ã®äž»ãªã¢ã€ãã¢ã§ãã
ãªã¢ã¯ãã£ãããã°ã©ãã³ã°ã®ãããã¯ã«é¢ããå€ãã®èšäºïŒ 1ã2ã3ã4ãªã©ïŒãæ¢ã«ãããŸãããäž»ã«ãJavaScriptã®bacon.js ãJavaã®JavaRxãªã©ã®ã©ã€ãã©ãªã®åœ¢åŒã§ã FRPããŒãžã§ã³ã®ãªã¢ã¯ãã£ãã説æããŠããŸãã ã ãã®èšäºã§ã¯ã Jancyèšèªã§ã®ãªã¢ã¯ãã£ãããã°ã©ãã³ã°ã®å®è£ ãšã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠèª¬æããŸãã ãã®è³æã¯ãJancyèšèªãèããããšããªããäœãæžããªããŠãèªãã®ãé¢çœãã§ãããããªããªããåŸã»ã©åœä»€åèšèªããã®åå¿æ§ãžã®ããªãçããã¢ãããŒãã瀺ãããã§ãã
ãããã®æ¢åã®ãªã¢ã¯ãã£ãã©ã€ãã©ãªã䜿çšããå Žåã§ãã Observableãã¿ãŒã³ãå®è£ ã®éµãšãªããŸãã å®éãå€æŽããåºãããããã«ã¯ãå°ãªããšããããã«é¢ããéç¥ãåãåãå¿ èŠããããŸãã 芳枬å¯èœãªãšã³ãã£ãã£ã¯ãéåžž2ã€ã®ããªããã£ãã«åå²ãããŸãïŒã©ã€ãã©ãªããšã«ç°ãªãåŒã³åºãæ¹ãè¡ãããŸãïŒã
- ã€ãã³ãã®ã¹ããªãŒã ïŒEventStream / Observable / Event / StreamïŒ;
- ããããã£ïŒããããã£/åäœ/å±æ§ïŒ-æéãšãšãã«å€åããå€ã
FRPã§ã¯ãããã¯ãã¹ãŠé¢æ°ããã°ã©ãã³ã°ã®èŠçŽ ãèŠæ±ããŸã ããã®ãããªããªããã£ãããè€éãªæ§é ãæ§ç¯ããã«ã¯ãmapãreduceãfilterãcombineãªã©ã®é«æ¬¡é¢æ°ã䜿çšãããŸãã ïŒå ã®ãããŒãšã€ãã³ãããå€æŽããã代ããã«ïŒã»ã«ã³ããªãããŒãšã€ãã³ããçæããŸãã ãªãã¶ãŒããã«ãšæ©èœããåŸãããã³ã³ããŒãã¯ãç解ããŠç¿åŸããã®ãããã»ã©é£ãããªããåæã«ã³ã³ããŒãã³ãéã®äŸåé¢ä¿ã宣èšåœ¢åŒã§è¡šçŸã§ããŸãã ããã¯ãè€éãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãåæ£éåæã·ã¹ãã ã®ããã°ã©ãã³ã°ã«æé©ã§ãã æ¹åãã¹ãç¹ã¯ãããŸããïŒ
åé¡
æåã®åé¡ã¯ããã§ãã ã³ã³ãã€ã©ã§ãªãã¶ãŒããã«ã䜿çšããã«ãã©ã€ãã©ãªã¬ãã«ã§åå¿æ§ãå®è£ ãããŠããå ŽåãExcelã§èªåçã«åèšç®ãããåŒã¯éæäžå¯èœãªçæ³ã®ãŸãŸã§ãã 代ããã«ãããã€ãã®ããããæåã§å®è¡ãããªãã¶ãŒããã«ã§çµåããå¿ èŠããããŸã-æ°åŒã®ããžãã¯ãè€éã«ãªãã»ã©ãonValue / assignã§å€ãé©åãªå Žæã«æžã蟌ã¿ãŸãã
ããããããªãŒãã³ãœãŒã¹ã®JavaScriptã³ã³ãã€ã©ã§ããFlapjaxã¯ãExcelã«äŒŒãåŒã«æãè¿ããã®ã«ãªã£ãã§ãããïŒãã®çš®ã®ãããžã§ã¯ããä»ã«ãããå Žåã¯ãã³ã¡ã³ãã«æžããŠãã ããïŒã Flapjaxã§ã¯BehavorãšåŒã°ããã¿ã€ã2ãªãã¶ãŒããã«ã¯ãåŒã§ä»»æã«çµã¿åãããŠãæ°ããBehavorãåºåã§ããŸãã
ãããããªã¢ã¯ãã£ãã©ã€ãã©ãªãšFlapjaxã®äž¡æ¹ã«åºæã®å¥ã®åºæ¬çãªåé¡ããããŸã-ããã¯ããããã調çããªããåé¡ã§ãã ã€ãã³ããããããã£ãããã³çžäºãµãã¹ã¯ãªãã·ã§ã³ã®ãããŒããã€ã³ãã©ã¹ãã©ã¯ãã£ãäœæããåŸãã€ã³ãã©ã¹ãã©ã¯ãã£ã¯ç¬èªã®ç掻ãå§ããŸãã ããŒã¿ã¯æµããå€æãããŸããç§ãã¡ãå°ããããã«ãå¿ èŠãªã¢ã¯ã·ã§ã³ã¯ããŸããŸãªonValueãšonCompletedã§å®è¡ããããã¹ãŠãçŽ æŽãããã§ãã ããã§ãä»ã©ããã£ãŠæ¢ããŸããïŒ ãã¹ãŠã®ã«ãŒããªãã¶ãŒããã«ã調ã¹ãŠãæåã§ã€ãã³ãã®çºè¡ãåæ¢ããŸããïŒ ããŸãçŸãããããŸããã ãããããã¹ãŠãåæ¢ããã®ã§ã¯ãªãããªã¢ã¯ãã£ããã£ãã³ãã³ã·ãŒã°ã©ãã®äžéšã®ã¿ãåæ¢ããå¿ èŠãããå Žåã¯ã©ãã§ããããã ç§ãã¡ã®ãªãã¶ãŒããã«ã®å€§éšåã¯ãæé»çãªããã/çµå/ãã£ã«ã¿ãŒçµæã®åœ¢ã§ååšããŸããïŒ
å°ãç°ãªãæ¹æ³ã§åå®åŒåãããšãæ¢åã®ãªã¢ã¯ãã£ãã©ã€ãã©ãªã®åé¡ã®1ã€ã¯ãïŒäž»ã«æ©èœçãªæ¹åæ§ã®ããã«ïŒèŠ³æž¬å¯èœãªãªããžã§ã¯ãã®1ã¬ãã«æ§é ãçæããããšã§ãïŒ
ãã ããæ¹å€ã¯ãäœããã®ä»£æ¿æ段ãæäŸãããããåžžã«ç°¡åã§ãã ããã§ã¯ãåå¿æ§ã«é¢ããŠãžã£ã³ã·ãŒã«ã¯äœããããŸããïŒ
- ãªãã¶ãŒããã«ã䜿çšããæ°åŒã® Excelã®ãããªèªååèšç® -ããã°ã©ããéžæããå Žåã®ã¿ã
- ãªãã¶ãŒããã«éã§äŸåé¢ä¿ã¯ã©ã¹ã¿ãŒãã°ã«ãŒãåããã¯ã©ã¹ã¿ãŒå ã®ãã¹ãŠã®ãµãã¹ã¯ãªãã·ã§ã³ãäžåºŠã«éå§ããã³åæ¢ããæ©èœã
次ã®ããã«ãªããŸãã
reactor TcpConnectionSession.m_uiReactor () { m_title = $"TCP $(m_addressCombo.m_editText)"; m_isTransmitEnabled = m_state == State.Connected; m_adapterProp.m_isEnabled = m_useLocalAddressProp.m_value; m_localPortProp.m_isEnabled = m_useLocalAddressProp.m_value; m_actionTable [ActionId.Connect].m_text = m_state ? "Disconnect" : "Connect"; m_actionTable [ActionId.Connect].m_icon = m_iconTable [m_state ? IconId.Disconnect : IconId.Connect]; m_statusPaneTable [StatusPaneId.State].m_text = m_stateStringTable [m_state]; m_statusPaneTable [StatusPaneId.RemoteAddress].m_text = m_state > State.Resolving ? m_remoteAddress.getString () : "<peer-address>"; m_statusPaneTable [StatusPaneId.RemoteAddress].m_isVisible = m_state > State.Resolving; }
ããã¯ãTCPæ¥ç¶IOãã³ãžã£ã¿ãŒããã«ã»ãã·ã§ã³ã®ãœãŒã¹ã³ãŒãããã®æç²ã§ãã ãæ³åã®ãšããããã®ã³ãŒãã¯ã¹ããŒã¿ã¹ã®å€æŽãã³ã³ãããã¯ã¹å ã®ããã¹ããªã©ã䜿çšããŠUIãæŽæ°ããŸãã
ãããŠä»ããããã©ã®ããã«æ©èœãããã«ã€ããŠã
äžè¬èšç»
ãŸããæ··ä¹±ãé¿ããããã«ãçšèªã«åæããŸãã
Jancyã®ããããã£ã«ã¯äžè¬çã«åãå ¥ããããŠããïŒéåå¿ïŒå®çŸ©ããããŸã-ããã¯å€æ°/ãã£ãŒã«ãã®ããã«èŠããã®ãºã¢ã§ãããã¢ã¯ã»ãµãŒé¢æ°ã§ã¢ã¯ã·ã§ã³ãå®è¡ã§ããŸãã
ãã«ããã£ã¹ã ïŒãã«ããã£ã¹ãïŒãšã€ãã³ã ïŒã€ãã³ãïŒã¯ãé¢æ°ãžã®ãã€ã³ã¿ãŒãèç©ããããããäžåºŠã«åŒã³åºãããã«äœ¿çšãããŸãïŒãã«ããã£ã¹ããšã€ãã³ãã®éãã«ã€ããŠã¯å°ãåŸã§ïŒã
Jancyã§ã¯ãã³ã³ãã€ã©ã¬ãã«ã§èŠ³å¯ã§ããã®ã¯ããã€ã³ãå¯èœãªããããã£ããã€ãŸã onChangedã€ãã³ããéããŠå€æŽãéç¥ã§ããããããã£ã
Jancyã®åå¿æ§ãšã¯ç°ãªããJancyã®åå¿æ§ã¯ãããµãã¹ã¯ã©ã€ãããæ°ãããªãã¶ãŒããã«ã®æé»çãªçæãªã©ã®å¯äœçšãããããããªãã¶ãŒããã«ã䜿çšãããŠããå Žæã«ãããŸãã«ãã¹ããŒããã«ãªããŸããã 圌女ã¯è§ã«ç«ã£ãŠå°ããŸããã åœä»€åã¹ã¿ã€ã«ã§ãã€ã³ãã£ã³ã°ããããã£ã«ã¢ã¯ã»ã¹ããã®ã¯ãéåžžã®å€æ°ã«ã¢ã¯ã»ã¹ãããããé«ããããŸããã
ããã¯ãäžèšã®Excelã®äºåŸåéèšã«ã©ã®ããã«é©åããŸããïŒ ãªã¢ã¯ãã£ãã³ãŒãã®ç¹å¥ãªãŸãŒã³ãæäŸãããŠãããããJancyã®ãªã¢ã¯ãã£ãããã³åœä»€åã®ååã®ç«¶åã®ãªãå ±åãå¯èœã§ãã ååç äžé£ã®åœä»€ã®ä»£ããã«ããªã¢ã¯ã¿ãŒã¯Excelã®ãããªåŒ-åŒã§æ§æãããŸããåŒã¯ãããããã€ã³ãã£ã³ã°ããããã£ã䜿çšããå¿ èŠããããŸãã ãªã¢ã¯ã¿å ã§ã¯ããã€ã³ãã£ã³ã°ããããã£ã¯ãåå¿çã«ãåäœããŸãã
ãããã£ãŠãJancyã®ãªã¢ã¯ãã£ãããã°ã©ãã³ã°ã®åºæ¬çãªæ§æèŠçŽ ã¯ã ã€ãã³ã ã é¢é£ããããããã£ãããã³ãªã¢ã¯ã¿ãŒã§ãã ãããã®ã¬ã³ã¬ã詳ããèŠãŠã¿ãŸãããã
ãã«ããã£ã¹ããšã€ãã³ã
Jancy ã®ãã«ããã£ã¹ãã¯ãã³ã³ãã€ã©ãŒã«ãã£ãŠçæãããç¹å¥ãªã¯ã©ã¹ã§ãããé¢æ°ãžã®ãã€ã³ã¿ãŒãèç©ããããããäžåºŠã«åŒã³åºãããšãã§ããŸãã ãã«ããã£ã¹ã宣èšã¯é¢æ°å®£èšã«éåžžã«äŒŒãŠããŸããããã®ãã«ããã£ã¹ãã«æ ŒçŽãããé¢æ°ãã€ã³ã¿ãŒã®ã¿ã€ããæ確ã«æ±ºå®ããå¿ èŠããããããé©ãããšã§ã¯ãããŸããã
foo (int x); bar ( int x, int y ); baz () { multicast m (int); // normal (fat) multicast intptr fooCookie = m.add (foo); m += bar ~(, 200); // capture the 2nd argument m (100); // <-- foo (100); bar (100, 200); m -= fooCookie; m (300); // <-- bar (300, 200); m.clear (); }
ãã«ããã£ã¹ãã¯ã©ã¹ã®ã¡ãœããã®è©³çŽ°
ããšãã°ãåçŽãªãã«ããã£ã¹ããå®çŸ©ããŸãã
äžèšã®äŸã§çæããããã«ããã£ã¹ãã¯ã©ã¹ã«ã¯ã次ã®ã¡ãœããããããŸãã
setããã³addã¡ãœããã¯ãremoveã¡ãœããã§äœ¿çšã§ããç¹å®ã®æŽæ°Cookieãè¿ãããã«ããã£ã¹ããããã€ã³ã¿ãŒãå¹æçã«åé€ããŸãã
äžéšã®ã¡ãœããã«ã¯ãæŒç®åã®åœ¢åŒã®ãšã€ãªã¢ã¹ããããŸãã
ãã«ããã£ã¹ãã¯ããã«ããã£ã¹ãã«èç©ããããã¹ãŠã®ãã€ã³ã¿ãŒãåŒã³åºãé¢æ°ãžã®ãã€ã³ã¿ãŒã«ãã£ã¹ãã§ããŸãã ãããããããŸããããããŸããã€ãŸãããã®ãããªãã£ã¹ãã¯ãã©ã€ããïŒã©ã€ãïŒãªã®ãã¹ãããã·ã§ãããªã®ãã ã€ãŸããé¢æ°ãžã®ãã€ã³ã¿ãŒãäœæããåŸã«å ã®ãã«ããã£ã¹ããå€æŽããå Žåããã®ãã€ã³ã¿ãŒã¯å€æŽã確èªããå¿ èŠããããŸããïŒ
ãããŸããã解決ããããã«ããã«ããã£ã¹ãã«ã¯ã¹ãããã·ã§ãããè¿ãgetSnapshotã¡ãœãããçšæãããŠããŸãã åæã«ããã£ã¹ãæŒç®åã¯ã©ã€ããã€ã³ã¿ãŒãæäŸããŸãã
multicast m (int);
äžèšã®äŸã§çæããããã«ããã£ã¹ãã¯ã©ã¹ã«ã¯ã次ã®ã¡ãœããããããŸãã
void clear (); intptr set (function* (int)); // returns cookie intptr add (function* (int)); // returns cookie function* remove (intptr cookie) (int); function* getSnapshot () (int); void call (int);
setããã³addã¡ãœããã¯ãremoveã¡ãœããã§äœ¿çšã§ããç¹å®ã®æŽæ°Cookieãè¿ãããã«ããã£ã¹ããããã€ã³ã¿ãŒãå¹æçã«åé€ããŸãã
äžéšã®ã¡ãœããã«ã¯ãæŒç®åã®åœ¢åŒã®ãšã€ãªã¢ã¹ããããŸãã
multicast m (); m = foo; // same as m.set (foo); m += bar; // same as m.add (bar); m -= cookie; // same as m.remove (cookie); m = null; // same as m.clear (); m (10); // same as m.call (10);
ãã«ããã£ã¹ãã¯ããã«ããã£ã¹ãã«èç©ããããã¹ãŠã®ãã€ã³ã¿ãŒãåŒã³åºãé¢æ°ãžã®ãã€ã³ã¿ãŒã«ãã£ã¹ãã§ããŸãã ãããããããŸããããããŸããã€ãŸãããã®ãããªãã£ã¹ãã¯ãã©ã€ããïŒã©ã€ãïŒãªã®ãã¹ãããã·ã§ãããªã®ãã ã€ãŸããé¢æ°ãžã®ãã€ã³ã¿ãŒãäœæããåŸã«å ã®ãã«ããã£ã¹ããå€æŽããå Žåããã®ãã€ã³ã¿ãŒã¯å€æŽã確èªããå¿ èŠããããŸããïŒ
ãããŸããã解決ããããã«ããã«ããã£ã¹ãã«ã¯ã¹ãããã·ã§ãããè¿ãgetSnapshotã¡ãœãããçšæãããŠããŸãã åæã«ããã£ã¹ãæŒç®åã¯ã©ã€ããã€ã³ã¿ãŒãæäŸããŸãã
foo (); bar (); baz () { multicast m (); m += foo; function* f1 () = m.getSnapshot (); function* f2 () = m; m += bar; f1 (45); // <-- foo (); f2 (55); // <-- foo (); bar (); return 0; }
Jancyã®ã€ãã³ãã¯ãã¢ã¯ã»ã¹å¶éã®ãããã«ããã£ã¹ããžã®ç¹å¥ãªãã€ã³ã¿ãŒã§ããè¿œå ãšåé€ã®ã¿ãå®è¡ã§ããŸãã
foo () { multicast m (int); event* p (int) = m; p += bar; // OK p (100); // <-- error, 'call' is inaccessible }
ãã€ãã³ããã¿ã€ãã®å€æ°ãŸãã¯ãã£ãŒã«ãã宣èšãããšã ãã¥ã¢ã«ã¿ã€ããäœæãããŸããããã¬ã³ããã®å Žåããã®ã¿ã€ãã¯ãã«ããã£ã¹ã修食åã䜿çšããããã®ããã«åäœãããã¹ãã¬ã³ãžã£ãŒãã®å Žåãè¿œå ããã³åé€ãé€ããã¹ãŠã®ã¡ãœããã®åŒã³åºããçŠæ¢ãããã€ãã³ãã§ãã
Jancyã®ãã¥ã¢ã«ã¿ã€ãã®è©³çŽ°
Jancyã®ã¢ã¯ã»ã¹ã¢ãã«ãšä»ã®ã»ãšãã©ã®ãªããžã§ã¯ãæåèšèªã®äž»ãªéãã¯ãã¢ã¯ã»ã¹æå®åã®æ°ã2ã€ã®publicãšprotectedã«åæžãããŠããããšã§ãã
äžæ¹ã§ã¯ãããã«ããéçºè ã¯ã ããäœã«ã¢ã¯ã»ã¹ã§ãããã決å®ããéã®æè»æ§ãå€§å¹ ã«äœäžããŸãã äžæ¹ããã®åçŽåãããã¢ãã«ã䜿çšãããšãå šå¡ããå人ãŸãã¯æµãã«æ確ã«åå²ããããšãã§ããŸããããã«ããã äºé修食åã®å¯èœæ§ãéãããŸãã ãå人ããšãèŠç¥ãã¬äººãã«å¯ŸããŠç°ãªãæå³ãæã€ä¿®é£Ÿåãããã³ãããã®å©ããåããŠäœæããããã¥ã¢ã«ã¿ã€ã ã
ãããã£ãŠãJancyã§ã¯ãåã ã®åå空éAããšã«ãæ®ãã®äžçã¯ãç§ãã¡ããšããšã€ãªã¢ã³ãã®2ã€ã®ã«ããŽãªã«åé¡ãããŸãã åå空éAèªäœã«å ããŠã次ã®ãã®ã¯ãã€ã³ãµã€ããŒãã«å±ããŸãã
æ®ãã¯ãã¹ãŠãèŠç¥ãã¬äººãã§ãã ãææè ãã¯åå空éã®ãããªãã¯ïŒãããªãã¯ïŒã¡ã³ããŒãšä¿è·ïŒä¿è·ïŒã¡ã³ããŒã®äž¡æ¹ã«ã¢ã¯ã»ã¹ã§ããŸããããã¹ãã¬ã³ãžã£ãŒãã¯ãããªãã¯ã¡ã³ããŒã®ã¿ã«ã¢ã¯ã»ã¹ã§ããŸãã ããã«ããå人ããŸãã¯ãèŠç¥ãã¬äººãã®ã°ã«ãŒãã«æå±ãããšããã¥ã¢ã«ãžã£ã³ã·ãŒä¿®é£Ÿåã®æå³ãå€ãããŸãã
èªã¿åãå°çšãã¥ã¢ã«ä¿®é£Ÿåã䜿çšããŠãèªã¿åãå°çšã¢ã¯ã»ã¹ããšã¬ã¬ã³ãã«æŽçã§ããŸãã Jancyã®éçºè ã¯ãã¢ã¯ã»ã¹å¶åŸ¡ãç®çãšããåçŽãªgetterãäœæãã代ããã«ãèªã¿åãå°çšä¿®é£Ÿåã䜿çšããŠãã£ãŒã«ãã宣èšã§ããŸãã ãå人ãã®å Žåãèªã¿åãå°çšä¿®é£Ÿåã¯è¡šç€ºãããŸããããèŠç¥ãã¬äººãã®å Žåãèªã¿åãå°çšã¯constãšããŠæ±ãããŸãã
ãã®ã¢ãããŒãã®äž»ãªå©ç¹ã¯ãã³ãŒããããçããããèªç¶ã«ããããšã§ãã åçŽåããããã£ãŠããããŒã®ã²ãã¿ãŒãåæããŠæšãŠãå¿ èŠã®ãªããªããã£ãã€ã¶ãŒã®å éã¯ãå¯æ¬¡çå¹æãšåŒã¶ããšãã§ããŸãã
Jancyã®2çªç®ã®äºé修食åã¯eventã§ãã ã€ãã³ãã®ææè ã¯ããã¹ãŠã®ãµãã¹ã¯ã©ã€ããŒã«é»è©±ãããããããªã¹ããã¯ãªã¢ãããããæ©èœãªã©ã圌ãå®å šã«å¶åŸ¡ããå¿ èŠããããŸãã ã€ãã³ãã¯ã©ã€ã¢ã³ãã¯ããµãã¹ã¯ã©ã€ããŒã®è¿œå ãŸãã¯åé€ã®ã¿ãå¯èœã§ãã ãå人ãã®å Žåãã€ãã³ã修食åãæã€ãã£ãŒã«ãã¯ã察å¿ããåŒæ°ã®çœ²åãæã€ãã«ããã£ã¹ããšåãããã«æ©èœããŸãã ãã¹ãã¬ã³ãžã£ãŒãã®å Žåããã®ãã£ãŒã«ãã¯ãã«ããã£ã¹ãã¡ãœãããžã®ã¢ã¯ã»ã¹ãå¶éããŸããè¿œå ãšåé€ã®åŒã³åºãã®ã¿ãèš±å¯ãããŸãã åŒã³åºããèšå®ãã¯ãªã¢ãgetSnapshotãããã³é¢æ°ãã€ã³ã¿ãŒãžã®ãã£ã¹ãã¯çŠæ¢ãããŠããŸãã
äžæ¹ã§ã¯ãããã«ããéçºè ã¯ã ããäœã«ã¢ã¯ã»ã¹ã§ãããã決å®ããéã®æè»æ§ãå€§å¹ ã«äœäžããŸãã äžæ¹ããã®åçŽåãããã¢ãã«ã䜿çšãããšãå šå¡ããå人ãŸãã¯æµãã«æ確ã«åå²ããããšãã§ããŸããããã«ããã äºé修食åã®å¯èœæ§ãéãããŸãã ãå人ããšãèŠç¥ãã¬äººãã«å¯ŸããŠç°ãªãæå³ãæã€ä¿®é£Ÿåãããã³ãããã®å©ããåããŠäœæããããã¥ã¢ã«ã¿ã€ã ã
ãããã£ãŠãJancyã§ã¯ãåã ã®åå空éAããšã«ãæ®ãã®äžçã¯ãç§ãã¡ããšããšã€ãªã¢ã³ãã®2ã€ã®ã«ããŽãªã«åé¡ãããŸãã åå空éAèªäœã«å ããŠã次ã®ãã®ã¯ãã€ã³ãµã€ããŒãã«å±ããŸãã
- Aããç¶æ¿ããã¯ã©ã¹ãŸãã¯æ§é ã®åå空éã
- åéãšããŠå®£èšãããåå空é
- Aåå空éã«é¢ããåã
- æ¡åŒµæ©èœïŒæ¡åŒµããŒã ã¹ããŒã¹ïŒA.
æ®ãã¯ãã¹ãŠãèŠç¥ãã¬äººãã§ãã ãææè ãã¯åå空éã®ãããªãã¯ïŒãããªãã¯ïŒã¡ã³ããŒãšä¿è·ïŒä¿è·ïŒã¡ã³ããŒã®äž¡æ¹ã«ã¢ã¯ã»ã¹ã§ããŸããããã¹ãã¬ã³ãžã£ãŒãã¯ãããªãã¯ã¡ã³ããŒã®ã¿ã«ã¢ã¯ã»ã¹ã§ããŸãã ããã«ããå人ããŸãã¯ãèŠç¥ãã¬äººãã®ã°ã«ãŒãã«æå±ãããšããã¥ã¢ã«ãžã£ã³ã·ãŒä¿®é£Ÿåã®æå³ãå€ãããŸãã
èªã¿åãå°çšãã¥ã¢ã«ä¿®é£Ÿåã䜿çšããŠãèªã¿åãå°çšã¢ã¯ã»ã¹ããšã¬ã¬ã³ãã«æŽçã§ããŸãã Jancyã®éçºè ã¯ãã¢ã¯ã»ã¹å¶åŸ¡ãç®çãšããåçŽãªgetterãäœæãã代ããã«ãèªã¿åãå°çšä¿®é£Ÿåã䜿çšããŠãã£ãŒã«ãã宣èšã§ããŸãã ãå人ãã®å Žåãèªã¿åãå°çšä¿®é£Ÿåã¯è¡šç€ºãããŸããããèŠç¥ãã¬äººãã®å Žåãèªã¿åãå°çšã¯constãšããŠæ±ãããŸãã
class C1 { int readonly m_progress; foo () { m_progress += 25; // OK // ... } } bar (C1* c) { c.m_progress = 100; // <-- error, cannot write to 'const' location }
ãã®ã¢ãããŒãã®äž»ãªå©ç¹ã¯ãã³ãŒããããçããããèªç¶ã«ããããšã§ãã åçŽåããããã£ãŠããããŒã®ã²ãã¿ãŒãåæããŠæšãŠãå¿ èŠã®ãªããªããã£ãã€ã¶ãŒã®å éã¯ãå¯æ¬¡çå¹æãšåŒã¶ããšãã§ããŸãã
Jancyã®2çªç®ã®äºé修食åã¯eventã§ãã ã€ãã³ãã®ææè ã¯ããã¹ãŠã®ãµãã¹ã¯ã©ã€ããŒã«é»è©±ãããããããªã¹ããã¯ãªã¢ãããããæ©èœãªã©ã圌ãå®å šã«å¶åŸ¡ããå¿ èŠããããŸãã ã€ãã³ãã¯ã©ã€ã¢ã³ãã¯ããµãã¹ã¯ã©ã€ããŒã®è¿œå ãŸãã¯åé€ã®ã¿ãå¯èœã§ãã ãå人ãã®å Žåãã€ãã³ã修食åãæã€ãã£ãŒã«ãã¯ã察å¿ããåŒæ°ã®çœ²åãæã€ãã«ããã£ã¹ããšåãããã«æ©èœããŸãã ãã¹ãã¬ã³ãžã£ãŒãã®å Žåããã®ãã£ãŒã«ãã¯ãã«ããã£ã¹ãã¡ãœãããžã®ã¢ã¯ã»ã¹ãå¶éããŸããè¿œå ãšåé€ã®åŒã³åºãã®ã¿ãèš±å¯ãããŸãã åŒã³åºããèšå®ãã¯ãªã¢ãgetSnapshotãããã³é¢æ°ãã€ã³ã¿ãŒãžã®ãã£ã¹ãã¯çŠæ¢ãããŠããŸãã
class C1 { event m_onCompleted (); // dual type bool work () { // ... m_onCompleted (); // OK, friends have multicast-access to m_onComplete return true; } } foo () { C1 c; c.m_onCompleted += completionFunc; // ok, aliens have event-access to m_onComplete c.m_onCompleted (); // <-- error, 'call' is inaccessible c.m_onCompleted.clear (); // <-- error, 'clear' is inaccessible }
ããããã£
ããã°ã©ãã³ã°èšèªã®ã³ã³ããã¹ãã§ã¯ã ããããã£ã¯ããŒã¿ã®ããã«èŠããåäœãããã®ã§ãããèªã¿åãããã³æžã蟌ã¿æã«è¿œå ã®ã¢ã¯ã·ã§ã³ãå®è¡ã§ããŸãã åœãã®è¬èããªãã«ãJancyã¯ãããŸã§ã®åœ¢ãè²ããµã€ãºã®ããããã£ã®æãå®å šãªå®è£ ãæäŸããŸãã
詳现ãšäŸ
èªã¿åãããã³æžã蟌ã¿äžã«ã¢ã¯ã·ã§ã³ãå®è¡ããé¢æ°ã¯ã¢ã¯ã»ãµãŒãšåŒã°ããŸã ãããããã£ãèªã¿åãããã®ã¢ã¯ã»ãµãŒã¯ã²ãã¿ãŒãšåŒã°ããã¬ã³ãŒãã¯ã»ãã¿ãŒãšåŒã°ããŸãã
Jancyã®åããããã£ã«ã¯ã1ã€ã®ã²ãã¿ãŒãšããªãã·ã§ã³ã§1ã€ä»¥äžã®ïŒãªãŒããŒããŒããããïŒ ã»ãã¿ãŒããããŸãïŒã€ãŸããJancyã«ã¯æžã蟌ã¿å°çšã®ããããã£ã¯ãããŸããïŒã ã»ãã¿ãŒããªãŒããŒããŒããããŠããå Žåãç¹å®ã®ã»ãã¿ãŒã®éžæã¯ããªãŒããŒããŒããããé¢æ°ãéžæãããã®ãšåãã«ãŒã«ã«åŸã£ãŠãããããã£ãžã®å€ã®å²ãåœãŠäžã«è¡ãããŸãã
ããããã£ã«ã»ãã¿ãŒããªãå ŽåãconstïŒããããã£ïŒãšåŒã°ããŸãã ä»ã®ããã°ã©ãã³ã°èšèªã§ã¯ãã»ãã¿ãŒãªãã®ããããã£ã¯éåžžèªã¿åãå°çšãšåŒã°ããŸãããJancyã«ã¯constãšreadonlyã®æŠå¿µãå ±åããããïŒèªã¿åãå°çšã¯äºé修食åã§ãïŒã確ç«ãããå®çŸ©ãäœããã®æ¹æ³ã§åå®çŸ©ããå¿ èŠããããŸãã ãã®ãããJancyã§ã¯ãã»ãã¿ãŒã®ãªãããããã£ã¯constããããã£ã§ãã
ã»ãã¿ãŒããªãŒããŒããŒããããŠããªãåçŽãªããããã£ïŒã»ãšãã©ã®å®çšçãªã¿ã¹ã¯ã¯èŠçŽïŒã®å Žåãæãèªç¶ãªåœ¢åŒã®å®£èšãææ¡ãããŸãã
ãã®åœ¢åŒã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã®å®£èšã«çæ³çã§ãããŸãã¯ãéçºè ã宣èšãšã¡ãœããã®å®è£ ã®C ++ã¹ã¿ã€ã«ã奜ãå Žåã«æé©ã§ãã
ä»»æã®è€éãã®ããããã£ïŒã€ãŸãããªãŒããŒããŒããããã»ãã¿ãŒãããŒã¿ãã£ãŒã«ããè£å©ã¡ãœãããªã©ã®ããããã£ïŒã«ã¯ãå®å šãªåœ¢åŒã®å®£èšããããŸãã
Jancyã¯ãã€ã³ããã¯ã¹å¯èœãªããããã£ããµããŒãããŠããŸãã é åã®ã»ãã³ãã£ã¯ã¹ãæã€ããããã£ã ãã®ãããªããããã£ã®ã¢ã¯ã»ãµã¯ãè¿œå ã®ã€ã³ããã¯ã¹åŒæ°ãåãå ¥ããŸãã ãã ããå®éã®é åãšã¯ç°ãªããããããã£ã®ã€ã³ããã¯ã¹åŒæ°ã¯æŽæ°ã§ããå¿ èŠã¯ãªããå³å¯ã«èšãã°ããã€ã³ããã¯ã¹ãã®æå³ãæã€å¿ èŠã¯ãããŸããããã®äœ¿çšã¯éçºè ã«ãã£ãŠå®å šã«æ±ºå®ãããŸãã
ã»ãšãã©ã®å Žåãã²ãã¿ãŒã¯ããããã£ã®çŸåšã®å€ãæ ŒçŽãããŠããå€æ°ãŸãã¯ãã£ãŒã«ãã®å€ãè¿ãã ãã§ãããããããã£èªäœã®åäœã®ããžãã¯ã¯ã»ãã¿ãŒã§å ·äœåãããŸãã æããã«ããã®ãããªåãã«è¶³ããªãã²ãã¿ãŒã®äœæã¯ã³ã³ãã€ã©ãŒã«è»¢éã§ããŸã-ãããJancyã®ããããšã§ãã autogetããããã£ã®å Žåãã³ã³ãã€ã©ã¯ããŒã¿ãæ ŒçŽããã²ãã¿ãŒãšãã£ãŒã«ããèªåçã«äœæããŸãã ããã«ãã³ã³ãã€ã©ã¯å¯èœãªéãã²ãã¿ãŒããã€ãã¹ããŠããã£ãŒã«ããžã®çŽæ¥ã¢ã¯ã»ã¹ãçæããŸãã
ããããã£ã®åäœã®ç¹å¥ãªããžãã¯ãã²ãã¿ãŒã«åã蟌ãŸãããããŒã®ã»ãã¿ãŒãããŒã¿ãã¡ã¢ãªã»ã«ã«æ¿å ¥ããã ãã®å Žåã®éã®ç¶æ³ã¯ãŸãã§ãããç¹å¥ãªæ§æã®äœæã«å€ããŸããã
å®çŸ©
èªã¿åãããã³æžã蟌ã¿äžã«ã¢ã¯ã·ã§ã³ãå®è¡ããé¢æ°ã¯ã¢ã¯ã»ãµãŒãšåŒã°ããŸã ãããããã£ãèªã¿åãããã®ã¢ã¯ã»ãµãŒã¯ã²ãã¿ãŒãšåŒã°ããã¬ã³ãŒãã¯ã»ãã¿ãŒãšåŒã°ããŸãã
Jancyã®åããããã£ã«ã¯ã1ã€ã®ã²ãã¿ãŒãšããªãã·ã§ã³ã§1ã€ä»¥äžã®ïŒãªãŒããŒããŒããããïŒ ã»ãã¿ãŒããããŸãïŒã€ãŸããJancyã«ã¯æžã蟌ã¿å°çšã®ããããã£ã¯ãããŸããïŒã ã»ãã¿ãŒããªãŒããŒããŒããããŠããå Žåãç¹å®ã®ã»ãã¿ãŒã®éžæã¯ããªãŒããŒããŒããããé¢æ°ãéžæãããã®ãšåãã«ãŒã«ã«åŸã£ãŠãããããã£ãžã®å€ã®å²ãåœãŠäžã«è¡ãããŸãã
ããããã£ã«ã»ãã¿ãŒããªãå ŽåãconstïŒããããã£ïŒãšåŒã°ããŸãã ä»ã®ããã°ã©ãã³ã°èšèªã§ã¯ãã»ãã¿ãŒãªãã®ããããã£ã¯éåžžèªã¿åãå°çšãšåŒã°ããŸãããJancyã«ã¯constãšreadonlyã®æŠå¿µãå ±åããããïŒèªã¿åãå°çšã¯äºé修食åã§ãïŒã確ç«ãããå®çŸ©ãäœããã®æ¹æ³ã§åå®çŸ©ããå¿ èŠããããŸãã ãã®ãããJancyã§ã¯ãã»ãã¿ãŒã®ãªãããããã£ã¯constããããã£ã§ãã
ã·ã³ãã«ãªããããã£
ã»ãã¿ãŒããªãŒããŒããŒããããŠããªãåçŽãªããããã£ïŒã»ãšãã©ã®å®çšçãªã¿ã¹ã¯ã¯èŠçŽïŒã®å Žåãæãèªç¶ãªåœ¢åŒã®å®£èšãææ¡ãããŸãã
int property g_simpleProp; int const property g_simpleConstProp;
ãã®åœ¢åŒã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã®å®£èšã«çæ³çã§ãããŸãã¯ãéçºè ã宣èšãšã¡ãœããã®å®è£ ã®C ++ã¹ã¿ã€ã«ã奜ãå Žåã«æé©ã§ãã
int g_simpleProp.get () { // ... } g_simpleProp.set (int x) { // ... } int g_simpleConstProp.get () { // ... }
çºè¡šã®å®å šãªåœ¢åŒ
ä»»æã®è€éãã®ããããã£ïŒã€ãŸãããªãŒããŒããŒããããã»ãã¿ãŒãããŒã¿ãã£ãŒã«ããè£å©ã¡ãœãããªã©ã®ããããã£ïŒã«ã¯ãå®å šãªåœ¢åŒã®å®£èšããããŸãã
property g_prop { int m_x = 5; // member field with in-place initializer int get () { return m_x; } set (int x) { m_x = x; update (); } set (double x); // overloaded setter update (); // helper method }
ã€ã³ããã¯ã¹å¯èœãªããããã£
Jancyã¯ãã€ã³ããã¯ã¹å¯èœãªããããã£ããµããŒãããŠããŸãã é åã®ã»ãã³ãã£ã¯ã¹ãæã€ããããã£ã ãã®ãããªããããã£ã®ã¢ã¯ã»ãµã¯ãè¿œå ã®ã€ã³ããã¯ã¹åŒæ°ãåãå ¥ããŸãã ãã ããå®éã®é åãšã¯ç°ãªããããããã£ã®ã€ã³ããã¯ã¹åŒæ°ã¯æŽæ°ã§ããå¿ èŠã¯ãªããå³å¯ã«èšãã°ããã€ã³ããã¯ã¹ãã®æå³ãæã€å¿ èŠã¯ãããŸããããã®äœ¿çšã¯éçºè ã«ãã£ãŠå®å šã«æ±ºå®ãããŸãã
int indexed property g_simpleProp (size_t i); property g_prop { int get ( size_t i, size_t j ); set ( size_t i, size_t j, int x ); set ( size_t i, size_t j, double x ); } foo () { int x = g_simpleProp [10]; g_prop [x] [20] = 100; }
èªåååŸããããã£
ã»ãšãã©ã®å Žåãã²ãã¿ãŒã¯ããããã£ã®çŸåšã®å€ãæ ŒçŽãããŠããå€æ°ãŸãã¯ãã£ãŒã«ãã®å€ãè¿ãã ãã§ãããããããã£èªäœã®åäœã®ããžãã¯ã¯ã»ãã¿ãŒã§å ·äœåãããŸãã æããã«ããã®ãããªåãã«è¶³ããªãã²ãã¿ãŒã®äœæã¯ã³ã³ãã€ã©ãŒã«è»¢éã§ããŸã-ãããJancyã®ããããšã§ãã autogetããããã£ã®å Žåãã³ã³ãã€ã©ã¯ããŒã¿ãæ ŒçŽããã²ãã¿ãŒãšãã£ãŒã«ããèªåçã«äœæããŸãã ããã«ãã³ã³ãã€ã©ã¯å¯èœãªéãã²ãã¿ãŒããã€ãã¹ããŠããã£ãŒã«ããžã®çŽæ¥ã¢ã¯ã»ã¹ãçæããŸãã
int autoget property g_simpleProp; g_simpleProp.set (int x) { m_value = x; // the name of a compiler-generated field is 'm_value' } property g_prop { int autoget m_x; // declaring an autoget field makes the whole property autoget set (int x); set (double x); }
ããããã£ã®åäœã®ç¹å¥ãªããžãã¯ãã²ãã¿ãŒã«åã蟌ãŸãããããŒã®ã»ãã¿ãŒãããŒã¿ãã¡ã¢ãªã»ã«ã«æ¿å ¥ããã ãã®å Žåã®éã®ç¶æ³ã¯ãŸãã§ãããç¹å¥ãªæ§æã®äœæã«å€ããŸããã
ãªã¢ã¯ãã£ãããã°ã©ãã³ã°ã«é©çšãããæãèå³æ·±ãã®ã¯ã é¢é£ããããããã£ã§ãã ãµãã¹ã¯ã©ã€ããŒã«å€æŽãéç¥ã§ããããããã£ã ãæ³åã®ãšãããJancyã¯ãã«ããã£ã¹ã/ã€ãã³ãã¡ã«ããºã ã䜿çšããŠãã€ã³ãã£ã³ã°ããããã£ãå®è£ ããŸãã
int autoget bindable property g_simpleProp; g_simpleProp.set (int x) { if (x == m_value) return; m_value = x; m_onChanged (); // the name of a compiler-generated bindable event is 'm_onChanged' } property g_prop { autoget int m_x; bindable event m_e (); // declaring a bindable event makes the whole property bindable set (int x); set (double x); }
é¢é£ããããããã£ã®å€æŽã«ã€ããŠéç¥ããã€ãã³ãã«ã¢ã¯ã»ã¹ããã«ã¯ã bindingofæŒç®åã䜿çšããŸãã
onSimplePropChanged () { // ... } foo () { bindingof (g_simpleProp) += onSimplePropChanged; g_simpleProp = 100; // bindable event is going to get fired }
Jancyã¯ãå®å šã«ã³ã³ãã€ã©ãŒãçæããã¢ã¯ã»ã¿ãŒïŒã²ãã¿ãŒãšã»ãã¿ãŒã®äž¡æ¹ïŒãšã®ããããã£ãŒã®ãã€ã³ãã£ã³ã°ããµããŒãããŠããŸãã ãããã®å€æ§ããããã£ã¯ããã€ã³ãå¯èœããŒã¿ãšåŒã°ããŸãã ãããã¯åäžã®ç®ç-å€æŽã®ç¬éããã£ãããã-ãæäŸããåçŽãªèŠ³å¯å¯èœãªå€æ°/ãã£ãŒã«ããšããŠæ©èœã§ããŸãïŒ
int bindable g_data; onDataChanged () { // ... } foo () { bindingof (g_data) += onDataChanged; g_data = 100; // onDataChanged will get called g_data = 100; // onDataChanged will NOT get called }
ååç
Jancy ã®ãªã¢ã¯ã¿ãŒã¯ããªã¢ã¯ãã£ãã³ãŒããŸãŒã³ã§ãã ãã¹ãŠã®äºåŸäŸåæ§ãšæé»çãªãµãã¹ã¯ãªãã·ã§ã³ã¯ããªã¢ã¯ã¿ãŒå ã«ããŒã«ã©ã€ãºãããŸãã
å€éšã§ã¯ãreactorã¯éåžžã®é¢æ°ã®ããã«èŠããŸãããåºåããªã¢ã¯ã¿ãŒä¿®é£Ÿåãæå®ããŠããç¹ãç°ãªããŸãã é¢æ°ãšã¯ç°ãªããåãªã¢ã¯ã¿ãŒã¯ããªã¢ã¯ã¿ãŒãéå§ããã³åæ¢ã§ããéå§ãšåæ¢ã®2ã€ã®ãããªãã¯ã¡ãœãããæã€ç¹å¥ãªãªã¢ã¯ã¿ãŒã¯ã©ã¹ã®å€æ°ãŸãã¯ãã£ãŒã«ããäœæããŸãã éåžžã®é¢æ°ã®æ¬äœãæ§æããã¹ããŒãã¡ã³ãïŒã¹ããŒãã¡ã³ãïŒã®ä»£ããã«ããªã¢ã¯ã¿ãŒã®æ¬äœã¯äžé£ã®åŒã§æ§æãããååŒã¯ãã®å³åŽã®é¢é£ããããããã£ã䜿çšããå¿ èŠããããŸãã
State bindable m_state; reactor m_uiReactor () { m_isTransmitEnabled = m_state == State.Connected; m_actionTable [ActionId.Disconnect].m_isEnabled = m_state != State.Closed; // ... }
èµ·åæã«ããªã¢ã¯ã¿ãŒã¯äŸåé¢ä¿ã°ã©ããäœæãããã¹ãŠã®ãå¶åŸ¡ãããããã£ã®ãã¹ãŠã®é¢é£ã€ãã³ãã«ãµãã¹ã¯ã©ã€ãããŸãã ãããã®ãããããå€æŽããããšããã¹ãŠã®äŸååŒãåèšç®ãããŸãïŒãã¡ãããä»ã®ããããã£ã§éªåŽ©ã®ãããªå€æŽãåŒãèµ·ããå¯èœæ§ããããŸãïŒã
埪ç°äŸåé¢ä¿ãã©ãããŸããïŒ
çŸæç¹ã§ã¯ã埪ç°äŸåé¢ä¿ã®æŽæ°ã¯åã«ç¡èŠãããŸããã€ãŸããPã®å¶åŸ¡ããããã£ã®ãããããå€æŽããããªã¢ã¯ã¿ãŒã§åŒã®åèšç®ãè¡ããããã®çµæããã®Pã®ããããã£ã®å€ãå€æŽãããå Žåããã®ç¹°ãè¿ãã®å€æŽã¯ãªã¢ã¯ã¿ãŒã§ã®èšç®ã®ååž°çãªéå§ãåŒãèµ·ãããŸããã
å°æ¥çã«ã¯ããããããæ·±ãããŸã è¶ éããŠããå Žåããªã¢ã¯ã¿ãŒã«ã¯èš±å®¹ãããååž°ã®æ·±ããšå埩æŠç¥ã®èšå®ããããŸãïŒãšã©ãŒã§ãªã¢ã¯ã¿ãŒãç¡èŠ/åæ¢ãã/ã³ãŒã«ããã¯ãåŒã³åºããªã©ïŒ
å°æ¥çã«ã¯ããããããæ·±ãããŸã è¶ éããŠããå Žåããªã¢ã¯ã¿ãŒã«ã¯èš±å®¹ãããååž°ã®æ·±ããšå埩æŠç¥ã®èšå®ããããŸãïŒãšã©ãŒã§ãªã¢ã¯ã¿ãŒãç¡èŠ/åæ¢ãã/ã³ãŒã«ããã¯ãåŒã³åºããªã©ïŒ
ãªã¢ã¯ãã£ãåŒã«å ããŠããªã¢ã¯ã¿ãŒã§ã¯ãçŽæçãªæ§æã§ãä»»æã®ã€ãã³ããšãã®åŠçã³ãŒãããªã³ã¯ã§ããŸãã ãã®ããã«ã ã€ãã³ãã®ãã¶ã€ã³ãæäŸãããŸãã ãã®ã¢ãããŒãã«ãããUIã«å¯ŸããŠåŸæ¥ã®ã€ãã³ãã¢ãããŒãã䜿çšã§ãããšåæã«ãã€ãã³ããæåã§ãµãã¹ã¯ã©ã€ãããå¿ èŠããªããªããŸãã
reactor m_uiReactor () { onevent m_startButton.m_onClicked () { // handle start button click... } onevent (bindingof (m_userEdit.m_text), bindingof (m_passwordEdit.m_text)) () { // handle login change... } // ... }
ã·ã£ããããŠã³ãããšããªã¢ã¯ã¿ãŒã¯ãµãã¹ã¯ã©ã€ããããŠãããã¹ãŠã®ã€ãã³ããããµãã¹ã¯ã©ã€ããããŸããïŒãªã¢ã¯ã¿ãŒãã¯ã©ã¹ã®ã¡ã³ããŒã§ããå Žåãã·ã£ããããŠã³ã¯èŠªãªããžã§ã¯ãã®ç Žå£æã«èªåçã«çºçããŸãïŒã ãããã£ãŠãéçºè ã¯ããªã¢ã¯ãã£ãã¢ãããŒãã䜿çšããå Žæ ïŒãªã¢ã¯ã¿ãŒãŸãŒã³ïŒãšã〠ïŒéå§/åæ¢ïŒã詳现ã«æ±ºå®ããããšãã§ããŸãã æé»ã®ãµãã¹ã¯ãªãã·ã§ã³ã¯ãã¹ãŠãŸãšããããç§è·¡çãªã調çããªããããããäœãã®ã¯éåžžã«ç°¡åã§ã ã
m_uiReactor.stop ();
ãã®å Žåããã¡ãããåããã€ã³ãã£ã³ã°ããããã£ãšä»ã®ã€ãã³ãã䜿çšããè€æ°ã®ãªã¢ã¯ã¿ãŒãååšããå¯èœæ§ããããŸã-äŸåé¢ä¿ãç¹å®ã®ã¯ã©ã¹ã¿ãŒã«è«ççã«ã°ã«ãŒãåããããã«å¿ èŠãªå Žåã
ãã¹ãŠäžç·ã«
ãã®ãããçŸãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãã¬ãŒã ã¯ãŒã¯ãçµã¿ç«ãŠãŠããªã¢ã¯ãã£ãã¹ã¿ã€ã«ã§äœ¿çšããããã«ããã¹ãŠã®ãã¥ãŒãããããŸãã
è€æ°ã®UIã¯ã©ã¹
class Widget { bitflag enum SizePolicyFlag { Grow, Expand, Shrink, Ignore, } enum SizePolicy { Fixed = 0, Minimum = SizePolicyFlag.Grow, Maximum = SizePolicyFlag.Shrink, Preferred = SizePolicyFlag.Grow | SizePolicyFlag.Shrink, MinimumExpanding = SizePolicyFlag.Grow | SizePolicyFlag.Expand, Expanding = SizePolicyFlag.Grow| SizePolicyFlag.Shrink | SizePolicyFlag.Expand, Ignored = SizePolicyFlag.Shrink | SizePolicyFlag.Grow | SizePolicyFlag.Ignore } protected intptr m_handle; SizePolicy readonly m_hsizePolicy; SizePolicy readonly m_vsizePolicy; setSizePolicy ( SizePolicy hpolicy, SizePolicy vpolicy ); bool autoget property m_isVisible; bool autoget property m_isEnabled; } opaque class Label: Widget { bitflag enum Alignment { Left, Right, HCenter, Justify, Absolute, Top, Bottom, VCenter, } char const* autoget property m_text; int autoget property m_color; int autoget property m_backColor; Alignment autoget property m_alignment; Label* operator new (char const* text); } opaque class Button: Widget { char const* autoget property m_text; event m_onClicked (); Button* operator new (char const* text); } opaque class CheckBox: Widget { char const* autoget property m_text; bool bindable property m_isChecked; CheckBox* operator new (char const* text); } opaque class TextEdit: Widget { char const* property m_text; TextEdit* operator new (); } opaque class Slider: Widget { int autoget property m_minimum; int autoget property m_maximum; int bindable property m_value; Slider* operator new ( int minimum = 0, int maximum = 100 ); }
ååçããã®äœ¿çš
Slider* g_redSlider; Slider* g_greenSlider; Slider* g_blueSlider; int bindable g_color; Label* g_colorLabel; CheckBox* g_enablePrintCheckBox; TextEdit* g_textEdit; Button* g_printButton; int calcColorVolume (int color) { return (color & 0xff) + ((color >> 8) & 0xff) + ((color >> 16) & 0xff); } reactor g_uiReactor () { g_color = (g_redSlider.m_value << 16) | (g_greenSlider.m_value << 8) | (g_blueSlider.m_value); g_colorLabel.m_text = $"#$(g_color;06x)"; g_colorLabel.m_backColor = g_color; g_colorLabel.m_color = calcColorVolume (g_color) > 0x180 ? 0x000000 : 0xffffff; g_textEdit.m_isEnabled = g_enablePrintCheckBox.m_isChecked; g_printButton.m_isEnabled = g_enablePrintCheckBox.m_isChecked; onevent g_printButton.m_onClicked () { printf ($"> $(g_textEdit.m_text)\n"); } }
ããããã¹ã¯åžæ°ã®çæ§ã¯ãåœç€Ÿã®ã³ã³ãã€ã©ã®ã©ã€ãããŒãžã«æåŸ ãããããŠã³ããŒããã€ã³ã¹ããŒã«ããŸãã¯ãã«ããè¡ãããšãªããJancyã®äºåŸå¯Ÿå¿èœåããã¹ãã§ããŸãã
Jancyã®ãœãŒã¹ã³ãŒããããŠã³ããŒãããŠåé/調æ»ããã人ã¯ã ããŠã³ããŒãããŒãžãããããè¡ãããšãã§ããŸã ã ã¡ãªã¿ã«ãsamples / 02_dialogãã©ã«ããŒã«ã¯ãããäžã®QTãŠã£ãžã§ããã«åå¿æ§ãæããäŸããããŸãã
ãããŠãJancyã®å®éã®ã¢ããªã±ãŒã·ã§ã³ãšãã®ãªã¢ã¯ãã£ãæ©èœã¯ãããã°ã©ã å¯èœãªã¿ãŒããã«/ã¹ããã¡ãŒIO Ninjaã§èŠãããšãã§ããŸãã