ä»å¹´ï¼2011å¹´ï¼ã®8ææ«ã«ã1å¹´ãã£ã¦ãææ¸ãããèªåæç»ã¸ãã¨ããè¨äºãæ¸ãã¾ãããã¿ã¤ãã«ã®ã¨ããã1å¹´åã®æ§æ³ããªãã¨ãå½¢ã«ãªã£ã¦ãããã¨ã®å ±åã§ãã
1å¹´åã©ãããã2年以ä¸ãåã®2009å¹´10æã®è¨äºãããã¼ãã£ã¼ããããã¾ã»ãã¹ãã¾ã§ãã§ã¯ããã¾ã»ãã¹ãã®æ§æ³ãè¿°ã¹ã¦ãã¾ããããã¾ã»ãã¹ããã£ã¦å¼ã³æ¹ã¯ã¢ã³ããªãªãã§ãæè¿ã¯ã¤ã³ã¹ã¿ã³ããã¡ã¸ã³ã°ã¨å¼ã¶ãã¨ã«ãã¦ãã¾ãããWebã¢ããªã±ã¼ã·ã§ã³ãã¬ã¼ã ã¯ã¼ã¯Catyã®ç¾ç¶ã¨ä»å¾ãã§ç´¹ä»ãã100åéãããã¿ã¤ãã³ã°ã§ãããã¤ã³ã¹ã¿ã³ãã¢ãã¯ã¢ãããã¨ãã¢ã«ãªãæ¦å¿µã§ãã
ã¤ã³ã¹ã¿ã³ããã¡ã¸ã³ã°ãè¡ãã«ã¯ãCatyScriptãç¡éã«ï¼å®éã¯é常ã«é·ãæéï¼èµ°ãããå¿ è¦ãããã¾ãããããããã¤ã³ã¿ããªã¿ã®ãããã¬ãã«ã«ã¼ãï¼REPL)ãæ¸ãã«ãç¡éã«ã¼ããå¿ è¦ã§ããç¡éã«ã¼ãæ§æã«ã¯begin/repeatãäºå®ãã¦ãã¾ãããã®ãã¨ã¯ããã¯ã1å¹´ã»ã©åã®è¨äºãCatyScriptã§è¨è¿°ããCatyã·ã§ã«ãã§æ¸ãã¦ãã¾ãã
ãã®é ï¼2010å¹´11æï¼ã¯ç¡éã«ã¼ãã¯ã§ããªãã£ãã®ã§ãæºä¸ã®ï¼ãããã¯è³å ã®ï¼ã³ã¼ãããç¡éFizzBuzzãCatyã¹ã¯ãªããã§æ¸ãã¦ã¿ããã«ã¡ã¢ãã¦ããã¾ããã
ãã¦ãå®ã¯begin/repeatã¯ã¾ã åºæ¥ã¦ã¾ãããã§ããbegin/repeatã¨åããã¨ãã§ããforwardã¨ããå¶å¾¡æ§é ã¯æ¢ã«åãã¾ããforwardã使ã£ã¦ç¡éã«åãç¶ããFizzBuzzãæ¸ãã¦ã¿ã¾ããã
// -*- coding: utf-8 -*-
/** FizzBuzz
* see [[http://d.hatena.ne.jp/m-hiyama-memo/20101109/1289265674 ]].
*/
module fb;/** å ¥åã1å¢ããã¦åºåãã */
command inc :: integer -> integer
refers python:fb.Inc;/** å ¥åããå¼æ°ã§æå®ãããæ°ã§å²ãåãããã©ãããå¤å®ãã */
command dividable-by [integer] :: integer -> (@True integer | @False integer)
refers python:fb.Dividable;/** coutã®ä»£æ¿ãå ¥åã« number ãå¯è½ */
command say :: number | string -> void
refers python:fb.Say;
/** å ¥åå¤ãéå§ã®æ°ã¨ãã¦ãFizzBuzzãæ°¸é ã«ç¶ããã
* åºåãçæãããã¨ã¯ãªãã®ã§ãåºåã®åã¯neverã§ããã
*/
command forever :: integer -> never {
pass > in | dividable-by 15 |
when {
True => ("Fizz Buzz" | cout), // 15ã®åæ°
False => dividable-by 3 |
when {
True => ("Fizz" | cout), // 3ã®åæ°
False => dividable-by 5 |
when {
True => ("Buzz" | cout), // 5ã®åæ°
False => fb:say, // ãã®ä»
}
}
};
sleep 200;
%in | inc | forward fb:forever
};/** FizzBuzz forever ãã®2
*/
command forever2 :: integer -> never {
dividable-by 15 |
when {
True => [pass, ("Fizz Buzz" | cout)] | nth 1, // 15ã®åæ°
False => dividable-by 3 |
when {
True => [pass, ("Fizz" | cout)] | nth 1, // 3ã®åæ°
False => dividable-by 5 |
when {
True => [pass, ("Buzz" | cout)] | nth 1, // 5ã®åæ°
False => [pass, fb:say ] | nth 1, // ãã®ä»
}
}
} | sleep 200 | inc | forward fb:forever2
};
åºæ¬ã³ãã³ããè¨è¿°ããPythonã³ã¼ãã®é¨åã¯ãç¡éFizzBuzzãCatyã¹ã¯ãªããã§æ¸ãã¦ã¿ããã¨ã¾ã£ããåããªã®ã§çç¥ãã¾ãã
foreverã³ãã³ãã¯ãinã¨ããå¤æ°ã¸ã®ä»£å ¥ï¼> in ï¼ã¨åç §ï¼%inï¼ã使ã£ã¦ãã¾ãã2010å¹´ã«æ¸ããæºä¸ã³ã¼ãã§ã¯å¤æ°ã使ã£ã¦ãã¾ãããå½æã¯ã¾ã å¤æ°æ©è½ãå ¥ãã¦ãªãã£ãããããªï¼ forever2ã®ã»ãã¯2010å¹´çå¤æ°ãªãã®ã¹ã¯ãªããã§ãï¼ä»ã¯åãã¾ãï¼ãããã°ãã°å¤æ°ãè¦ããªããã¨ãCatyScriptã®ç¹å¾´ãªã®ã§ãå¤æ°ãªãã®ãã¼ã¸ã§ã³ãè¼ãã¦ããã¾ããã
å®è¡ããã¨æ¬¡ã®ããã«ãªãã¾ãã
caty:sample> 1 | fb:forever
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz Buzz
16
17
Fizz
19
Buzz
Fizz
22
ç¡éã«ã¼ãï¼é·æéã®ç¹°ãè¿ãï¼ãã§ããããã«ãªã£ã¦ããã¾ã»ãã¹ãæ¹ãã¤ã³ã¹ã¿ã³ããã¡ã¸ã³ã°ã«å°ãè¿ä»ããã¨æãã¾ãã