äž»èŠãªã€ã³ã¿ãŒããããããžã§ã¯ãã®èåŸã«ã¯ãèªååãããæ
å ±ã·ã¹ãã ãšãååããµãŒãã¹ã販売ããWebãµã€ãããããŸãã ãããžã§ã¯ãã倧ãããªãã»ã©ããµã€ãã®ããžãã¯ãè€éã«ãªããè² æ
ã倧ãããªããŸãã ãµã€ãã®ããã¯ãŒããé«ããããŒãžã®å¿çæéãççž®ããã¿ã¹ã¯ããããŸãã ãã®ãããªã·ã¹ãã ãäœæãããã¹ãŠã®äººãšåæ§ã«ã
ãµã€ãã®é床ã調æŽããã»ãã·ã§ã³ãå®æçã«å®æœããŠããŸãã ç§ãã¡ã¯å°éå¯èœãªãã¹ãŠãæé©åããŠããŸãã ãã段éã§ã圌ãã¯HTMLãã³ãã¬ãŒããšã³ãžã³ã®é床ã«åºããããŸããããããã¯ããããåæ£ãããæ¹æ³ãããã«ã¯ããããŸããã
ãµããã¿ãŒã³ã®
ãã£ãã·ã¥ã«ãã£ãŠäœããçµãåºãããšãã§ããŸãããè¯å®çãªçµæãåŸãããã«ããããããããã³ãã¬ãŒããšã³ãžã³ã®äœæ¥æéã¯äŸç¶ãšããŠããŒãžçæã®é床ã®åºç€ãšãªããŸããã ããããä»ã®ãã³ãã¬ãŒããšã³ãžã³ã§ãããããæ ¹æ¬çãªå¯Ÿçãå¿
èŠã§ãã...
æéã®ãã³ãã¬ãŒããšã³ãžã³ã®
èæ¯ãèŠã€ãããšããå°é£ãªã¿ã¹ã¯ã«ãããã€ãã·ã¢ããã®1ã€ã®æŽå²ã«ã€ããŠ
㯠ããã®åé¡ã®è§£æ±ºã«é¢äžããDmitry Karasikã«ãã詳现ã¬ããŒãã§ä»¥äžããèªã¿ãã ããã
ãç§ã®æèŠã§ã¯ã誰ããWebéçºã«ãã³ãã¬ãŒããšã³ãžã³ã䜿çšããŠããŸãã 誰ããéžæããããŒã«ã®äžå®å
šãã䜿çšãããã£ãããšèªããŸãã çµå±ã®ãšããããã©ã³ããããžã§ã¯ãã®å¥ã®ãã³ãã¬ãŒããšã³ãžã³ãžã®ç§»è¡ã¯éåžžã«å°é£ãªåé¡ã§ãããããå€ãã®å Žåãå€ãã®ã³ãŒããæªç¥ã®çµæã§æžãçŽãããããæ¢åã®ããã±ãŒãžã§äœããçµäºããæ¹ã奜ãŸããŸãã
ã¬ãžã¹ãã©REG.RUã¯ã
ãã³ãã¬ãŒã::ããŒã«ãããã§èšè¿°ãããWebãµã€ãã®é床ãäžããå¿
èŠã«çŽé¢ãããã®åé¡ã解決ããããã«æ瀺ããŸããã èãããããœãªã¥ãŒã·ã§ã³ãåæãã瀟å
ã®äººã
ãã
Project :: ToolkitïŒä»¥éTTïŒã®å®å
šãªæ§æãç¶æããªããããããžã§ã¯ããå¥ã®ãã³ãã¬ãŒããšã³ãžã³
Text :: Xslateã«ç§»è¡ããããšã«æ±ºããã®ã¯å¬ããé©ãã§ããã
Xslateã«ã€ããŠèããããšããããŸããã以åã¯ååŒããŠããŸããã§ããã ãŠã§ããµã€ãã«èšèŒãããŠããåºåããŒã¿ã«ãããšã圌ã¯TTã158åè¿œãæããŠãããã圌ãèšã£ãããšã®å°ãªããšãååãæ£ãããå ŽåïŒcïŒãããã¯åªããéžæè¢ã®ããã«èŠããŸãã ãã®ãããçãäœå°ã¯ã»ãšãã©ãããŸããã§ãããã»ãšãã©ã®ãããžã§ã¯ãã¯Cã§æžãããŠãããå°ãªããšãçç èªäœãããé«éã§ããã ããã«ãXslateã¯TTæ§æãéšåçã«ãµããŒãããŠããŸãã ã³ãŒããèŠããšããã¹ãŠããOKãã§ããããã«æãããŸãã-ããããèè
ããã³ãã¬ãŒããšã³ãžã³ã«çŠç¹ãåœãŠãŠããããããã®æ¹åã«Xslateãæ¡åŒµããããšã«èå³ããã人ã«ã¯åºæ¬çãªãã³ããæ®ãããããå®å
šãªãµããŒãã¯ãããŸããïŒãããžã§ã¯ãã«åå ããããã®äžçš®ã®æåŸ
ïŒã ããã¯ãã¹ãŠéåžžã«ææã«èŠããã®ã§ãXslateãçµäºããŠTTãå®å
šã«ãµããŒããããã顧客ã«ãšã£ãŠååã«ãµããŒããããŸã§æ±ºããŸãããREG.RUãšç§ã¯åãã§åæããŸããã ãã¹ãŠãåè
ã§ããããã«èŠããŸãã-ã¯ã©ã€ã¢ã³ãã¯158åéãã³ãŒããåãåããXslateã¯æ¹åãããæ§æãšæ°ãããŠãŒã¶ãŒãåãåããã³ãã¥ããã£ã¯TT2ã«ä»£ããåªãã代æ¿æ段ãåãåããŸãã
åé¡ã¯ããã«å§ãŸããŸããã Xslate Goro Fujiã®èè
ïŒalasãalasïŒã¯ãæçŽã«ãIRCã«ãçããŸããã§ããã èè
ã®æå³ãšæãäžèŽããããã«ã¢ãžã¥ãŒã«ãæ¡åŒµããæ¹æ³ã«åæãããšããç§ã®ææ¡ã¯ãå®éã«ã¯å€±æããŸããã ãã¶ãç§ã®æçŽã¯æ¥æ¬ã®ãšãã±ããã®ã«ãŒã«ã«åŸã£ãŠç·šéãããŠããªãã£ãã®ã§ãããã ããŸããŸäŒè°ã§æ¥æ¬ã®ããã°ã©ããŒã«äŒã£ãããšããããŸãããé»è©±ã§ã®ç¬é¡ããããã«ã¡ã¯ãããã掻çºã«é£çµ¡ãåãããšãã§ããªããã°ããããããªã³ã©ã€ã³ã¯ããã«é£ããã§ãããã
çµå±ã®ãšãããRTFSãã³ãã©ã¯æ±ºããŠå€±æããŠããŸããã ã³ãŒããé«å質ã§ããã°ãäœæè
ãå
±åäœæ¥ãæãŸãªãå Žåã§ããããããŸãã¯åå²ãããžã§ã¯ãããã€ã§ãå
¬éã§ããŸãã æåŸã«ãXslateããããžã§ã¯ããšããŠéçºããæ¹æ³ãç解ãããµãã¯ããŸããããããŒã¹ãšããŠé«åºŠã«æé©åããããšã³ãžã³ã®ã¿ã䜿çšããã€ããã§ãã
ãããŠãç§ã¯ã¢ãžã¥ãŒã«ã®å匷ãå§ããŸããã å
¬å¹³ã«èšãã°ãã³ãŒããšXslateã¢ãŒããã¯ãã£ã®äž¡æ¹ãåªããŠãããšèšã䟡å€ããããŸãã åŠçã¯ããããç 究ããå¿
èŠããããçµéšã®ããããã°ã©ããèŠãç®ãè¯ãã§ãããã Xslateã¯ããã³ãã¬ãŒããšã³ãžã³ãåºæ¬çã«ããã¹ãã®ãã£ã³ã¯ãåŸåŸ©ãããšããäºå®ã«åºã¥ããŠæ§ç¯ãããŠãããæé©åã¯ãã§ã«ãã®ã¬ãã«ã§éå§ãããŠããŸã-éåžžã®ããŒã«ãªãªã ã®ã®é£çµã眮ãæãã
$ aã= $ b
Cã§æžãæãããããã®ã¯åãã¢ããã°ã§ãããå¯èœãªéã軜éã§ãã ãŸãããã¹ãŠã®åŠçãCã§è¡ãããŸãããã³ãã¬ãŒããšã³ãžã³ã®ã¢ãããã¯æäœïŒããšãã°ãäžèšã®é£çµãŸãã¯[ïŒ
IFïŒ
]ã[ïŒ
CALLïŒ
]ãªã©ã®TTã«é¢ããæäœïŒã¯ãCã ãã§ãªãããã³ãã¬ãŒããã¡ã€ã«ã®ã«ãŒããµã€ã¯ã«ãæžã蟌ãŸããŸãã ããã¯ãïŒCã§æžãããŠããŠãïŒçç ããæé ãåŒã³åºãã®ã«å¿
èŠãªã¯ããã¯ãµã€ã¯ã«ãç¯çŽãããããšãæå³ããŸã-ããã¯éåžžã«é«äŸ¡ãªæäœã§ãã ããšãã°ãTTã§æžããããããªéåžžã«äžè¬çãªãã³ãã¬ãŒãã¯
[ïŒ
IF aïŒ
]
ããã¹ã
[ïŒ
ELSEïŒ
]
ããã¹ãb
[ïŒ
ENDïŒ
]
Xslateã¯ã次ã®åœ¢åŒã®ç䌌ã¢ã»ã³ãã©ãŒã³ãã³ãã«å€æããŸãã
.if a
.literal "text a"
.printïŒ1
.goto 3
.literal "text b"
.printïŒ2
.end
ãã€ããªã³ã³ãã€ã«æžã¿ãã¡ã€ã«ã«ã ãã³ãã¬ãŒããã³ã³ãã€ã«ããŸããã次ã®ãããªããŒã«ã³ãŒãã«å€æããTTãšã¯ç°ãªããŸãã
ãã³ãã¬ãŒã::ããã¥ã¡ã³ã->æ°èŠïŒ
ãããã¯=> sub {
...
eval {
...
ifïŒ$ aïŒ{
$ outputã= "text a";
} else {
$ outputã= "text b";
}
...
}
}
ïŒ
...
ãããŠãéåžžã®evalãããŒãããŸãã
ãããããã®Xslateäœæè
ã§ããååã«èããŠããŸããã§ããïŒ åã
ã®ãã¢ã»ã³ãã©ãã³ãã³ããå®è¡ããã³ãŒãã¯ãèããããããã«äœæãããŠããŸãããããšãã°ãïŒæŠç¥çã«ïŒïŒ
forïŒi = 0; i <opcodes.length; i ++ïŒ{
opcodes.list [i] .callbackïŒïŒ;
}
ãããã
瞫補ã³ãŒã ïŒ
LABELïŒnoopïŒïŒTXCODE_noopïŒaTHX_ stïŒ; goto *ïŒst-> pc-> exec_codeïŒ;
LABELïŒmove_to_sbïŒïŒTXCODE_move_to_sbïŒaTHX_ stïŒ; goto *ïŒst-> pc-> exec_codeïŒ;
LABELïŒmove_from_sbïŒïŒTXCODE_move_from_sbïŒaTHX_ stïŒ; goto *ïŒst-> pc-> exec_codeïŒ;
LABELïŒsave_to_lvarïŒïŒTXCODE_save_to_lvarïŒaTHX_ stïŒ; goto *ïŒst-> pc-> exec_codeïŒ;
...
LABELïŒçµäºïŒïŒTXCODE_endïŒaTHX_ stïŒ;
å®è¡ã¯ããªãã³ãŒãã®ãçµäºãã«å°éãããŸã§gotoéã§ããžã£ã³ããããŸãã å®éãããšãã°TXCODE_move_to_sbã³ãŒããregister.a = register.bã®ããã«èŠããå ŽåãäžèŠãªé¢æ°åŒã³åºãã¯ãŸã£ãããããŸãããããã«ãããããã»ããµããã£å
šäœãçè«çã«ããã»ããµãã£ãã·ã¥ã«åãŸãããã«ãªããŸãïŒããã¯ããã³ãã¬ãŒããåçŽãªã¢ã¯ã·ã§ã³-åžžã«çç æ©èœã®åŒã³åºããå¿
èŠã§ãïŒã
ããŒãµãŒã®åŽããèŠããšããã¹ãŠãé¢çœããã«èŠããŸããã å人çã«ã¯ãæ§æ解æã®ä»çµã¿ãããããããã®LL / LR / LALRããŒãµãŒã¯ç¹ã«èå³æ·±ããã®ã§ã¯ãããŸããã§ãããããã®ã¢ã€ãã¢ãè©äŸ¡ããããšãã§ããŸãã TTãšXslateã¯ã©ã¡ããå°ããªç¬ç«ããèšèªã§ãããåãªããã£ã¬ã¯ãã£ãã®ã»ããã§ã¯ãããŸããïŒããšãã°ãXslateã§ã¯ã次ã®ããã«ããŽã«ããã§ããŸãïŒ
ããã«ã¡ã¯ã<ïŒ$ lang // "Perl"ïŒ> worldïŒ
ãã ããTTã¯ãParse :: Yappã«ãã£ãŠå®è¡ãããå€ãå®çžŸã®ããlex / yaccã¡ãœããã䜿çšããŸããã Xslateã¯ã
ãããããŠã³ããŒãµãŒã®ããã«äœãããç¬èªã®ããŒãµãŒã䜿çšããŸããã ããã§ã¯è©³ãã説æããŸãããããã®ã¿ã€ãã®ããŒãµãŒã䜿çšããŠæ§æãæ¡åŒµããããšã¯ãç§ã®çµéšããèŠãŠæã楜ããã¿ã¹ã¯ãšã¯ã»ã©é ããšããã ãã§ãã ã»ãšãã©ã®å Žåãã³ãŒãã®å€ãã®éšåãXslateã§ãµããŒããããŠãããã¹ãŠã®æ§æã«å
±éããŠããããããããéšåã«å解ããå¿
èŠããããŸããã
ãã ããå®è¡æã®æ倧ã®åé¡ã¯ãŸã çºçããŠããŸããã§ããã å€æããããã«ãã©ã³ã¿ã€ã ã®Xslateã«ã¯ãTTã®[ïŒ
CALLïŒ
]ã«äŒŒãã¡ã«ããºã ããªããå¥ã®ãã³ãã¬ãŒãã§å®çŸ©ãããé¢æ°ãåŒã³åºãããšãã§ããŸãã ããã§å¯ŸåŠæ¹æ³ãèŠã€ããæ°é±éã®èªç±æéã䜿ã£ãŠæ¬äŒŒã¢ã»ã³ãã©ãŒãéžã³ããã®åçãç解ããããšããŠãçªç¶äœããå£ããªãããã«ããŸããã ãŸããTTã«ã¯[ïŒ
-...ïŒ
]ãªã©ã®é察称ãã©ã±ããã䜿çšããæ©èœããããXslateããŒãµãŒã¯ãã®æ¹æ³ãç¥ããªãããšãå€æããŸããã ããããæ倧ã®é害ã¯ãTTãšXslateãå€æ°ã®ã¹ã³ãŒãå¯èŠæ§ããŸã£ããç°ãªãããšã§ãã TTã§[ïŒ
foo = 'bar'ïŒ
]ãšæžãããã®åŸå€æ°fooããã¹ãŠã®ãµããã¿ãŒã³ã§èŠããå ŽåãXslateã§ã¯ããŒã«ã«å€æ°ã§ãã
ãã¡ããããããã®åé¡ã¯ãã¹ãŠè§£æ±ºã§ããŸããããåªåãšçµæã®ãã©ã³ã¹ããçåãçããŸããããããžã§ã¯ãã®ãã€ãããè©äŸ¡ã«ã¯ããã®ãããªèŠæš¡ã®å€æŽã¯å«ãŸããŸããã§ããã 顧客ãšã®äŒè°ã®åŸãäŒç€Ÿã¯å°ãªããšã2åã®ããã©ãŒãã³ã¹ã®åäžã«é¢å¿ãããããšãå€æããŸããã ãããŠãçç£æ§ãåäžãããããšãå®éã«å¯èœã§ããããšãè©äŸ¡ããããšã«ããŸããããããŸãã«èšã£ãŠããããããã«å€ããã²ãŒã ã§ããã
ããã«ããããã¹ãŠãã·ã³ãã«ã«ãªããŸãã-åªãããããã¡ã€ã©ãŒã§ããDevel :: NYTProfïŒç¹ã«Devel :: DProfã§ã®é·å¹Žã®çµéšåŸïŒã¯ããã³ãã¬ãŒãããã¬ãŒã¹ãããšãã«ãã®ãããªèå³æ·±ãç»åãçæããŸããã

è¡šã¯åã³5åé·ããªããæ確ã«ããããã«ããã€ãã®è¡ãåé€ããŸãããã倧ãŸããªåæã§ãããäž»ãªè² è·ã¯TTã®ããã§ã¯ãªããTTã®ããã§çºçããããšã瀺åããŠããŸãã ãã®çµæãTTãXslateã«çœ®ãæããé床ããŒãã§ããããšã確èªãããšããŠããæã¿ã®2åã®å¢å ã¯åŸãããŸããã ããã«ãããããããå®å
šã«æã¶ãã§åŸéããªãããã«ããããã«ãç§ã¯æ¢ãåãããšã«æ±ºããŸããããããŠãããã¯ç§ãèŠã€ãããã®ã§ãïŒ
â¢main_menu.incãšindex.htmlã§ã次ã®ãããªæ°å³ã®æªãé
ãã³ãŒããèŠã€ããŸãã
[ïŒ
FOR xïŒ
]
[ïŒ
for yïŒ
]
...äœãããã...
[ïŒ
ENDïŒ
]
[ïŒ
ENDïŒ
]
ããã¯ç°¡åã«é«éã®ãã®ã«å¯Ÿå¿ããŸãã ããã ãã§ããå¿
èŠã«å¿ããŠé床ã2åã«ããããšã¯ãã§ã«å¯èœã ãšæããŸãã
â¢ãã®åŸ-ãã³ãã¬ãŒã:: StashãTTã®äžéšã ãã®äž»ãªå®¹çè
ã¯é·ãéãã£ãããšæé©åãããŠããããã³ãã¬ãŒã:: Stash :: XSã«ä»ã«è¡ãå Žæã¯ãããŸãã-æããã«ããã€ãŠãã®é床ã¯èª°ãã«å¹²æžããŠããŸããã ããã«ãé¢ããããåé¡ãšãªã£ãã®ã¯ããŒã«ãªãªã ã®ã®éšåã§ãããç§ã¯å°ãåæžããŸãããã356msãã238msã«äœäžããŸããã å¯äžã®åé¡ã¯ããã®ãã«ãããããã®é¡§å®¢å°çšã«æ©èœãããã®ç¹å®ã®ãããã¡ã€ã«ã§æ©èœããããšã§ããäžè¬çãªäœ¿çšã®ããã®ãããã¯æå³ããããŸããã èšãæããã°ãããŒã«ã«ããã¯ãã©ã®ããã«é©çšã§ãããããããã·ã¹ãã 管çè
ã¯æ¯åããã課ãå¿
èŠããããŸãã äžè¬çã«ãçãããå©ç¹ãåŸãããŸãã 誰ãæ°ã«ããŸãããããã«ãããŸãïŒ
--- Template-Toolkit-2.24 / xs / Stash.xs.0 2012-11-22 23:26ïŒ54.670467300 +0100
+++ Template-Toolkit-2.24 / xs / Stash.xs 2012-11-22 23:26ïŒ39.406594300 +0100
@@ -1198.21 +1198.7 @@
}
ifïŒïŒSvOKïŒRETVALïŒïŒ{
-dSP;
-ENTER;
-SAVETMPS;
-ããã·ã¥ããŒã¯ïŒSPïŒ;
-XPUSHïŒã«ãŒãïŒ;
-XPUSHïŒidentïŒ;
-PUTBACK;
-n = call_methodïŒ "undefined"ãG_SCALARïŒ;
-ã¹ãã€ã³;
-ifïŒnïŒ= 1ïŒ
-croakïŒ "undefinedïŒïŒã¯åäžã®å€ãè¿ããŸããã§ãã\ n"ïŒ;
-RETVAL = SvREFCNT_incïŒPOPïŒ;
-PUTBACK;
-FREETMPS;
-ç«ã¡å»ã;
+ RETVAL = newSVpvïŒ ""ã0ïŒ;
}
ä»ã«
倧ãŸãã«èšããšãundefinedã®åŒã³åºãã¯é«ã³ã¹ãã§ããã空ã®æååãè¿ãã ãã§æžã¿ãŸãã ããããããã6äžåã®åŒã³åºãã«ãªããšãããã«å¿ããŠè²»ããããæéãé·ããªããŸãã
â¢IO :: Uncompress :: *ããã³IO :: Compress :: *ã¯ãå€æãããšãããmemcachedã«é¢é£ããŠããŸã-ãµã€ãºãããã©ã«ãã®ã¡ã¬ãã€ããè¶
ããå ŽåãããŒã¿ãå§çž®ããŸãã ãã®ãªãã·ã§ã³ãè©ŠããŠã¿ãŸããããæ¹åã¯åŸ®èŠçã§ããã
â¢æåŸã«ãTemplate :: Iteratorã180,660åŒã³åºãã éšåçã«XSã«ã³ããŒãã263ãã7ããªç§ã«æžãããŸãããããã¯ããªã¯ãšã¹ãå
šäœã®5ã7ïŒ
ã§ãã çµæã¯
Template :: Iterator :: XSãšããŠCPANã«ã¢ããããŒããããŸããã ããã¯ãã³ãã¥ããã£ã«å©çãããããããšãã§ããå¯äžã®ãã®ã§ãã TTã«æ¢åã®ãããžã§ã¯ããããå Žåã¯ããã®ã¢ãžã¥ãŒã«ãéåžžã«ããŸãæ§ç¯ã§ããŸãã
ãã³ãã¬ãŒãã䜿çšããŸãã
ãã³ãã¬ãŒãã䜿çš::ã€ãã¬ãŒã¿:: XS;
$ãã³ãã¬ãŒã::æ§æ:: ITERATOR = 'ãã³ãã¬ãŒã::ã€ãã¬ãŒã¿ãŒ:: XS';
ãããŠãããäœãããããããèŠãŠãã ãã
çµæã¯èªæ
¢ã§ããªãã»ã©ã§ããã TTããä»ã®äœãã«åãæ¿ããã®ãã©ã®ãããæé©ãïŒãããŠããã䟡å€ããããã©ããïŒã®åé¡ã¯ããããŸã§ã®ãšããç§ã«ã¯æªè§£æ±ºã®ãŸãŸã§ãã ããã«ãTTãéåžžã«æªããšããæ確ãªçµè«ãåºãããšã¯äžå¯èœã§ã-ãããã«ãããå®è¡é床ã«é¢ããŠã¯ãããã¯ãããäžè¬çãªè°è«ã®åé¡ã§ãã
æåŸã«ãèå³æ·±ãã³ãŒããæãäžããæ©äŒãšããã³ãã¬ãŒã::ã€ãã¬ãŒã¿:: XSã¢ãžã¥ãŒã«ã®å
¬éã®æ°žç¶æ§ã«ã€ããŠãREG.RUã«æè¬ããŸãããã®èšäºã®çµæã¯ãç§ã®ã€ãã·ã¢ããã§ã¯ãªãªãŒã¹ããããã«ãããŸããã§ããã éåžžãäŒæ¥ã¯ã泚æã©ããã«äœæãããã³ãŒããã©ãã«ã§ãå
¬éããããšã«ççŽã«é¢å¿ãæã¡ãŸããã ãã®ç¹ã§ãREG.RUã¯å¿«ãäŸå€ã§ãããããŒã«ã³ãã¥ããã£ã代衚ããŠãç§ã¯æè¬ããŠããŸãã