2013-06-09
/ scala
scopt is a little command line options parsing library.
仿¥ scopt 3.0 ããªãªãŒã¹ãããå®è£
ã®è©³çްã«èå³ãç¡ããã°ãreadme ã«é£ãã§ã»ããã
2010幎3æ4æ¥ããå㯠scopt ã®ã³ããã¿ã«ãªã£ããããã¯å
ã
Aaron Harnly ããã 2008幎ããæžãã scala-options ã®ãã©ãŒã¯ã ã確ããusage text åšãã®å€æŽãš key=value options ãš argument list ãšããæ©èœã远å ãããã£ããã ãšæãããã以éå
šãŠã®ãã°ã¬ããæ
åœããŠããããã®äžã«ã¯ jar ã scala-tools.org ã«å
¬éããŠãããšããã®ããã£ãã2012幎3æ18æ¥ãåã¯åã³ãããžã§ã¯ãã scopt/scopt ã«ãã©ãŒã¯ã㊠immutable parser ã远å ãã scopt 2.0.0 ããªãªãŒã¹ããã
æ°å¹Žã«æž¡ã£ãŠéããããã«ããŠæ©èœã远å ããããããscopt3 ã¯äžããæžãçŽãããšã«ãããçºç«¯ãšãªã£ãã®ã¯ Leif Wickland ããã«ãscopt ã« intArg() ãç¡ãã®ã¯èšèšäžã®çç±ãããã®ãã ãšèãããããšã ã
Ruby ã® OptionParser ã« inspire ãããŠæžãããå
ã® Aaron ããã® scala-options ã«ã¯ãªãã·ã§ã³ã®ããã« 5åã®ã¡ãœããããã£ã: onInt
ã onDouble
ã onBoolean
ã on
ãããããããäžã€ãªãŒããŒããŒãããã on
ãéãªãéçºã®çµæ scopt2 㯠opt
ã®ãªãŒããŒããŒãã 6ã€ãintOpt
ã doubleOpt
ã booleanOpt
ã keyValueOpt
ã keyIntValueOpt
ã keyDoubleValueOpt
ã keyBooleanValueOpt
ããããã« 4ã€ã¥ã€ã®ãªãŒããŒããŒããèç©ããããåèš 34 ãã®ã¡ãœããã ! ãããã®ãªãŒããŒããŒãã¯çç¥å¯èœãªé æåãå€ã®ååã®ããã«åã远å ãããã®ã ãããèªå以å€ã«è²¬ããããç¡ãããã以äžã®æ¡åŒµã¯èããããªãã£ãã
2013-05-11
/ scala
Dispatch 㯠Scala ããããããžã€ãªãããã¡ã¯ãã®æ¹æ³ã§ããç¶ããŠãããæšä»ã®ãã³ããããã³ã°IO ãžã®æµããšæ©èª¿ãåãã㊠@n8han ã¯ã©ã€ãã©ãªã Async Http Client ããŒã¹ã®ãã®ã«æžããªãããReboot ãšåŒãã ãåŸã«ããã¯ãDispatch 0.9 ãšããŠãªãªãŒã¹ããããããã«ãç¬èªã® Promise
ã SIP-14 ã§æšæºåããã Future
ã«çœ®ãæãããã®ã Dispatch 0.10 ã ã
Dispatch Classic åæ§ã« Reboot ã§ã web API ãã©ããã³ã°ãããã©ã°ã€ã³ãäœãããšãã§ãããæ¬çš¿ã§ã¯ãClassic ã§æžããããã©ã°ã€ã³ãç§»æ€ããªãã Dispatch 0.10 ãã©ã°ã€ã³ã®æžãæ¹ã解説ããŠããã
ä»ã®ãã©ã°ã€ã³ãšã®ååã®è¡çªãåé¿ããããã«ãåã®ã¯ dispatch-twitter ã§ã¯ãªã repatch-twitter ãšåŒã¶ããšã«ããã
sbt
ãŸã㯠sbt ã®èšå®ããå§ãã:
repatch-twitter/
+- project/
| +- build.properties
| +- build.scala
+- core/
+- src/
+- main/
+- scala/
+- requests.scala
+- ...
build.properties
ã®äžèº«:
2013-04-02
/ scala / conference
ããäžã¶æçµã€ãã© 2013幎3æ1æ¥ã«æ¥æ¬ã«äžæåž°åœããŠãScala Conference in Japan 2013ãã«åºåžãããããããååã®ã«ã³ãã¡ã¬ã³ã¹ã
ããããã£ã¹ããã
ããæ¥ (2012幎6æ2æ¥ã ãã©) Scala Days 2012 ã§é²é³ããã Scala Types ãèããŠãããšèª°ãã (@timperrett ãã) “I would love to see Scala Days in Asia. We had two in Europe now. It would be wicked to have it in China or Japan, or somewhere like that.” ãšèšã£ãŠããã®ã§ããã®è¶£æšã Twitter ã§äŒãã :
ä» Scala Days 2012 ã§é²é³ããã Scala Types ãèŽããŠãããéå¬å°ã欧米åã«åã£ãŠãããæ¬¡ãããæ¥æ¬ãšãã¢ãžã¢åãªããŠã©ãã ããã£ãŠè©±ãåºãŠããã³ãã¥ããã£ã声åºãã°èªèŽããããããã
äŒè©±ãå§ãŸããš @jsuereth ãããã«æ¯æã®å£°ãäžããŠããã:
@kmizu @eed3si9n_ja If you guys manage to get a Scala conference somewhere in asia, I’ll be there!
2012-12-12
/ scalaz
ãã㯠Scalaz Advent Calendar 2012 12æ¥ç®ã®èšäºã§ãã
次ã
ãš Scala çã®ç¥èœæŽŸãéçµãããŠãã Precog 瀟ã®éçºããŒã ããã®ããã° Precog.Copointed ã仿¥ã¯ blueeyes ãªã©ã®éçºã§ãç¥ããã Kris Nuttycombe (@nuttycom ) ãããæžãã The Abstract Future ã翻蚳ããŸããã翻蚳ã®å
¬éã¯æ¬äººãã蚱諟æžã¿ã§ãã
2012幎11æ27æ¥ Kris Nuttycombe è
2012幎12æ11æ¥ e.e d3si9n èš³
Precog éçºããã°ã®åå ã¯åãã¡ã Cake ãã¿ãŒã³ã䜿ã£ãŠã³ãŒãããŒã¹ãæ§é åããŠãã®ãªã®ãªãŸã§å®è£
åãæœè±¡åããŠããŠããããšã Daniel ãæžããããã®èšäºã§ã®èª¬æã®ãšãããããã¯éåžžã«åŒ·åãªæŠå¿µã ãåãååšåãšããŠä¿ã€ããšã§ããããŠéžæãããåããæèãããŠããªãã¢ãžã¥ãŒã«ããã¯ãããã®åã®å€ã¯äžå¯èŠã§ãããããã«ãã»ã«åã®å¢çã®çªç Žãã³ã³ãã€ã©ã鲿¢ããŠãããã
仿¥ã®èšäºã§ã¯ããã®æŠå¿µãåããããã«é²ããŠåã³ã³ã¹ãã©ã¯ã¿ã«é©çšããŠãèšç®ã¢ãã«ãäžžããšçœ®ãæããæ©æ§ãšããŠäœ¿ããããšã説æããã
Scala ãå°ãã§ã䜿ã£ãããšãããã°ãäœããã®æèã§èª°ãããã¢ããããšããèšèã䜿ã£ãã®ãèããããšãããã ãããäŸãã°ãScala ã® for
ãšããããŒã¯ãŒãã«ããæäŸãããç³è¡£æ§æã«é¢ããè°è«ããOption
åã䜿ãããšã§ null åç
§ãšã©ãŒã®èœãšã穎ãåé¿ã§ãã ããšã説æããããã°èšäºã§èªãã ã®ãããããªããScala ã§ã®ã¢ããã«é¢ããè°è«ã®å€§åããã³ã³ãããåã«çŠç¹ãåœãŠãŠããã®ã«å¯ŸããŠãScala ãšã³ã·ã¹ãã ã§ããèŠãããããã€ãã®åã®äžã«ã¢ããã£ãã¯åæã®ããé¢çœãåŽé¢ã衚ãããã®ããããéå®èšç® (delimited computation) ã ãã©ã®ã¢ããã£ãã¯ãªåãåæããŠããã®åŽé¢ãèŠãããšãã§ãããããããçŽæ¥å©çšããäŸãšããŠæããã䜿ãããŠãã Scala ã§ã®ã¢ããã£ãã¯ãªåã«éåæèšç®ããšã³ã³ãŒããã akka.dispatch.Future
ããã (ãã㯠Scala 2.10 ã«ãããŠçŸè¡ã® Future ã眮ãæããäºå®ã®ãã®ã )ãããã¯èšç®ã®ã¹ããããé åºä»ãããããã®æè»ãªæ¹æ³ãæäŸããããšã§ãæ¬çš¿ã泚ç®ããã¢ããã£ãã¯åæã®äžé¢ãäœçŸããã
ããã§äžèšæã£ãŠãããããã®èšäºã¯ã¢ããã®ãã¥ãŒããªã¢ã«ãšããŠæ©èœããããšãæå³ããŠããªããã¢ãã 㮠解説 ãšãã® Scala ã®ããã°ã©ãã³ã°ãšã®é¢é£ãåãæ±ã£ãèšäºã¯æ¢ã«ãããããã (ããããã ãã!)ããããã®æŠå¿µã«äžæ
£ããªãèªã¿é²ããåã«ãããã®è§£èª¬ãèªããšåœ¹ã«ç«ã€ãããããªããããããæåã«æ³šæããŠããããç¹ãäžã€ãã£ãŠã(ã¢ããã£ãã¯åæã®ããã®ç³è¡£æ§æãšããŠã® for
ã瀺ããšãã) Scala ã§ã¯ã¢ããã¯åºãç¯å²ã§å©çšãããŠããã«ãé¢ããã Scala ã®æšæºã©ã€ãã©ãªã« Monad
åãç¡ããšããã®ã¯ Scala åºæãªç¶æ³ã ãšããããšã ããã®ãããã¢ããåãå¿
èŠãªãã°æšæºã©ã€ãã©ãªå€ã®çŽ æŽããã Scalaz ãããžã§ã¯ãã䜿ããScalaz ã®ã¢ããæœè±¡äœã¯ implicit åã¯ã©ã¹ãã¿ãŒã³ãå©çšããŠããã以äžã«ããŒã¹ã® Monad
åãç°¡ç¥åãããã®ã瀺ã:
2012-12-05
/ scalaz
ãã㯠Scalaz Advent Calendar 2012 5æ¥ç®ã®èšäºã§ãã
12æã®éäžãæ¥æ¬ã®æè¡ç³»ã®ãŒã¯ã¯æ¥æ¿ããã§ããŒãã«æ²¿ã£ãèšäºãå
¬éãã圌ã®åœã§ã¯ãAdvent CalendarããšåŒã°ããŠããããããå»å¹Žã® Scala Advent Calendar 2011 ã§å㯠Eric Torreborre ããã The Essence of Iterator Pattern ãã«ããŒããèšäºã翻蚳 ãããããã¯æ¥æ¬äººã®é¢æ°åããã°ã©ãã³ã°èšäºå¥œããç¥ã£ãäžã§ããçšåºŠçã£ããã®ã ã£ãããã1ã€ã®å©å·±çãªåæ©ã¯ãèšäºãäžèªäžèªèš³ãéçšã«ãããŠæŠå¿µã®ããã€ãã¯åã®é ã«ãæã¿ããã§ãããããããªãããšããæåŸ
ã ã£ããæ¯ãè¿ã£ãŠã¿ããšãäž¡æ¹ã®ç®çãšãäœæŠæåã ã£ããšèšãããJeremy Gibbons ãããBruno Oliveira ãããã㊠Eric äž¡æ¹ã®ä»äºã®ã¯ãªãªãã£ã®ãé°ã ããããã®æã¿èŸŒãã ç¥èãä»å¹Žã«æžããç¬ç¿ Scalaz ã·ãªãŒãºã®é ãå³ã ã£ãããããªãããšæã£ãŠããã
ç¬ç¿ Scalaz 12æ¥ç® ã§ãµãããšãããScalaz 7 ã®åã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ã«ã¯æ¢ã« product
ãš compose
ãå«ãŸããŠããããŸã Traverse
ãå®çŸ©ãããŠãããè«æã«ãã word count ã®äŸé¡ ãŸã§ãããåãæ°ã¥ããã®ã¯ãå€ã¬ãã«ã§ã®åæãç¡ãããšã ããã®è«æã®è峿·±ãç¹ã®1ã€ã«ãapplicative functor ã®åæãããããããã¯ã¢ãžã¥ãŒã«åããã°ã©ãã³ã°çãªãã®ãå¯èœãšããã
Gibbons ãš Oliveira ã®èšããapplicative functorãã¯å®ã¯åã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã ãã§ã¯ãªããapplicative 颿°ã®åæãæããŠãããããã¯è«æããã®ä»¥äžã®æç²ãã¿ãã°æããã :
data (m â n) a = Prod { pfst :: m a, psnd :: n a }
(â ) :: (Functor m, Functor n) â (a â m b) â (a â n b) â (a â (m â n) b)
(f â g) x = Prod (f x)(gx)
代æ°ããŒã¿åã® â
ã¯åã¬ãã«ã®ç©ã ããäžçœ®é¢æ°ã® â
㯠2ã€ã® applicative 颿°ã®å€ã¬ãã«ã®ç©ã§ãa â (m â n)
ãšããåã® applicative 颿°ãè¿ããèšãæãããšãããã°ã©ã㯠applicative functor ãè¿ã颿°ãæ§ç¯ããã ããããŠãåã¬ãã«ã§ã®åæã¯èªåçã«è¡ãããã
2012-08-21
John Wiegley ããã® “Monads in Pictures” ã翻蚳ããŸããã翻蚳ã®å
¬éã¯æ¬äººãã蚱諟æžã¿ã§ãã翻蚳ã®ééãçãããã°é æ
®ãªããææãã ããã
2012幎8æ20æ¥ John Wiegley è
2012幎8æ21æ¥ e.e d3si9n èš³
ããã¯ã¢ããã®ãã¥ãŒããªã¢ã«ã§ã¯ãªãããããã«ã¯æ°åŠçšèªãåºãŠããªããæ¬çš¿ã¯ãæ¢ã«ã¢ãããäžå¿äœ¿ãããããã«ã¯ç¿ã£ã人ã察象ãšãããèŠèŠåããããšã§ãäœã®ããã«äœããã£ãŠããããæããã«ãªãã¯ãã ã
颿°
ã¢ããã«å¯ŸããçŽæãåŸãäžã€ã®æ¹æ³ãšããŠé¢æ°ããã¢ãããžã®æœè±¡åããã©ããšãããã®ãããã颿°ãäœããã£ãŠããã®ããç°¡åãªçµµã§è¡šããŠã¿ãããHaskell ã®é¢æ°ã®åŒã³åºãã®æ§æãäžã«ãåãæŒç®ãèŠèŠåãããã®ãäžã«çœ®ãã:
2012-08-06
Scala ãã¯ãã®äœè
Eugene Burmako ããã«ãããªãã¬ã¯ã·ã§ã³ API ã«é¢ããçºè¡šã®ã¹ã©ã€ãã“Metaprogramming in Scala 2.10” ã翻蚳ããŸããã翻蚳ã®å
¬éã¯æ¬äººãã蚱諟æžã¿ã§ãã翻蚳ã®ééãçãããã°é æ
®ãªããææãã ããã
2012幎4æ28æ¥ Eugene Burmako è
2012幎8æ5æ¥ e.e d3si9n èš³
ã¯ããã«
ã¡ã¿ããã°ã©ãã³ã°
ã¡ã¿ããã°ã©ãã³ã°ãšã¯ãä»ã®ããã°ã©ã ãèªèº«ãããŒã¿ãšããŠæžãããæäœããã³ã³ãã¥ãŒã¿ããã°ã©ã ãæžãããšããâWikipedia
ã³ã³ãã€ã©
å: ã©ããã£ãŠã¡ã¿ããã°ã©ãã³ã°ãå¯èœã«ããããšãã§ãã ãã?
ç: ã³ã³ãã€ã©ãããããã°ã©ã ã«é¢ããŠããŒã¿ãæã€è
ãããã ããã?
ããã°ã©ãã«ã³ã³ãã€ã©ãå
¬éãããã
ãªãã¬ã¯ã·ã§ã³
2.10 ã§ã¯ããã°ã©ã ã«é¢ããããŒã¿ããªãã¬ã¯ã·ã§ã³ API ãšããŠå
¬éããã
ãã® API ã¯ãscala-library.jar (ã€ã³ã¿ãŒãã§ã€ã¹)ãscala-reflect.jar (å®è£
)ãscala-compiler.jar (å®è¡æã³ã³ãã€ã«) ã«ãŸããã£ãŠããã
Martin ã®æ¹ã詳ãã
å
æ¥è¡ããã Martin Odersky å
çã«ããè¬æŒã«ãŠãªãã¬ã¯ã·ã§ã³ API ã®èšèšã詳ãã説æãããŠãã:
å®ç¿
仿¥ã¯ãããã€ãã®å
·äœäŸãéããŠãªãã¬ã¯ã·ã§ã³ API ã®åºç€ãç¿ãããŸãã©ããã£ãŠæŽã«å€ãã®æ
å ±ãåŸãããããç¿ãã
ãã¯ã
å: ã¡ãã£ãš! ãã¯ãã¯ã©ããªã£ãŠãã®?
ç: ãã¯ãã®æ žãšãªãã®ã¯ãªãã¬ã¯ã·ã§ã³ã§ããããªãã¬ã¯ã·ã§ã³ããã¯ãã API ãšããŠæäŸãããªãã¬ã¯ã·ã§ã³ããã¯ããå¯èœãšããã仿¥ã¯ãŸããªãã¬ã¯ã·ã§ã³ãçè§£ããããšã«çŠç¹ãåœãŠãããã¯ãã¯å°ããªåŸä»ãã«ãããªãã
ãã¯ãããã®å²åŠãšå¿çšã«é¢ããŠã¯ãScala Days ã§ã®è¬æŒãåèã«ããŠã»ãã:
ãªãã¬ã¯ã·ã§ã³
ã³ã¢ãšãªãããŒã¿æ§é
æ§ææš (Tree
)
ã·ã³ãã« (Symbol
)
å (Type
)
$ scalac -Xshow-phases
phase name id description
---------- -- -----------
parser 1 ãœãŒã¹ã AST ãžãšããŒã¹ããç°¡åãªç³è¡£æ§æå±é ( desugaring) ãè¡ãã
namer 2 ååã解決ããã·ã³ãã«ãååä»ããããæ§ææšãžãšé¢é£ä»ããã
typer 4 ã¡ã€ã³ã³ãŒã¹: æ§ææšãåä»ãããã
pickler 7 ã·ã³ãã«ããŒãã«ãã·ãªã¢ã©ã€ãºããã
ã§ããéãåããããããããã®æŠå¿µã®èª¬æãããã€ããã ããPaul Phillips 以äžã®èª¬æã¯æãã誰ã«ãã§ããªãã
Inside the Sausage Factory ãšããè¬æŒã¯çµ¶å¯Ÿã«èŠãŠãããã»ããããã
2012-08-01
Scala ãã¯ãã®äœè
Eugene Burmako ããã管çãã scalamacros.org ãã “Getting started” ã翻蚳ããŸããã翻蚳ã®å
¬éã¯æ¬äººãã蚱諟æžã¿ã§ãã翻蚳ã®ééãçãããã°é æ
®ãªããææãã ããã
Eugene Burmako è
2012幎7æ31æ¥ e.e d3si9n èš³
1. Scala 2.10 ãå
¥æãã
ãã¯ã㯠2.10.0-M3 以éã® Scala ã§åºè·ãããŠãããçŸè¡ã®ãã€ã«ã¹ããŒã³ã§ãã 2.10.0-M6 ãªã©ã®ãã¯ããå
¥ã£ãã³ã³ãã€ã©ãçŽæ¥ããŠã³ããŒã ããããMaven ã sbt ãªã©ããåç
§ããã奜ããªæ¹æ³ã䜿ã£ãŠããã
蚳泚: sbt 0.11.3 ã䜿ã£ããããžã§ã¯ãã github ã«çšæããã®ã§ã
git clone -b ja https://github.com/eed3si9n/scalamacros-getting-started.git
ã§ã»ããã¢ããã§ããã
2. ãã¯ããæžã
Macros.scala
ãšãããã¡ã€ã«ãäœã£ãŠä»¥äžã®ã³ãŒããããŒã¹ããã (é¢é£ãã API ãã€ã³ãã©ãªã©ãã¯ãã·ã¹ãã ã«å€§åãªããšãæžãããŠããã®ã§ã³ã¡ã³ãããã£ããèªãã§ã»ãã)ã
import scala.reflect.makro.Context
import collection.mutable.ListBuffer
import collection.mutable.Stack
object Macros {
// ãã¯ãå®çŸ©ã®ã·ã°ããã£ã¯å¥œããªãã©ã¡ãŒã¿ãåãåãæ®éã®é¢æ°ãšåãã ã
// ããããæ¬æã¯å®è£
ãžã®åç
§ã®ã¿ãšãªãã
def printf( format: String , params: Any* ) : Unit = macro printf_impl
// ãã¯ãå®è£
ã®ã·ã°ããã£ã¯ãã¯ãå®çŸ©ã®ãã®ãšå¯Ÿå¿ããå¿
èŠãããã
// äžèŠè€éã«èŠããããå¿é
ããå¿
èŠã¯ãªãã
// ããã³ã³ãã€ã©ãäžæºãªãããšã©ãŒã¡ãã»ãŒãžã§å¿
èŠãªã·ã°ããã£ãæããŠãããã
def printf_impl( c: Context )( format: c.Expr [ String ],
params: c.Expr [ Any ]*) : c.Expr [ Unit ] = {
// ã³ã³ãã€ã© API 㯠scala.reflect.makro.Context ãéããŠå
¬éãããŠããã
// ãã®æãéèŠãªéšåã§ãããªãã¬ã¯ã·ã§ã³ API ã¯
// c.universe ããã¢ã¯ã»ã¹ããããšãã§ããã
// é »ç¹ã«äœ¿ããããã®ã®å€ããå«ãŸããŠããããã
// import c.universe._ ãã€ã³ããŒãããã®ãæ
£äŸã ã
import c.universe._
// ãŸããæž¡ããã format æååãããŒã¹ããã
// ãã¯ãã¯ã³ã³ãã€ã«æã«åäœãããããå€ã§ã¯ãªãæ§ææšã«äœçšããã
// ãã®ããããã®ãã¯ãã«æž¡ããã format ãã©ã¡ãŒã¿ã¯
// ã³ã³ãã€ã«æã®ãªãã©ã«ã§ããã
// java.lang.String åã®ãªããžã§ã¯ãã§ã¯ãªãã
// ããã¯ãŸãã以äžã®ã³ãŒãã§ã¯ printf("%d" + "%d", ...) ã§ã¯
// åäœããªãããšãæå³ããã
// ãªããªããã®å Žå㯠format ã¯æåãªãã©ã«ã§ã¯ãªã
// 2ã€ã®æåãªãã©ã«ã®é£çµã衚ã AST ãšãªãããã ã
// ä»»æã®ãã®ã§åäœããããã«ãã®ãã¯ããæ¹è¯ããã®ã¯èªè
ãžã®ç·Žç¿åé¡ãšãããã
val Literal ( Constant ( s_format: String )) = format. tree
// ããããã³ã³ãã€ã©ã«çªå
¥ããã
// ããäžã®ã³ãŒãã§ã¯äžæç㪠val ãäœã£ãŠãã©ãŒããããããåŒãäºåã«èšç®ããã
// åç㪠Scala ã³ãŒãã®çæã«é¢ããŠãã詳ããç¥ãããå Žåã¯ä»¥äžã®ã¹ã©ã€ããåç
§:
// http://eed3si9n.com/ja/metaprogramming-in-scala-210
val evals = ListBuffer [ ValDef ]()
def precompute( value: Tree , tpe: Type ) : Ident = {
val freshName = newTermName( c. fresh( "eval$" ))
evals += ValDef ( Modifiers (), freshName, TypeTree ( tpe), value)
Ident ( freshName)
}
// ããã¯ãããã¡ãª AST ã«å¯Ÿããæäœã§ãç¹ã«é£ããããšã¯è¡ãªã£ãŠããªãã
// ãã¯ãã®ãã©ã¡ãŒã¿ããæ§ææšãæœåºããåè§£/è§£æããŠå€æããã
// Int ãš String ã«å¯Ÿå¿ãã Scala åãæã«å
¥ããŠããæ¹æ³ã«æ³šæããŠã»ããã
// ããã¯ã³ã¢ãšãªãããäžéšã®åã§ã¯ããŸããããã
// ã»ãšãã©ã®å Žåã¯èªåã§åãäœãå¿
èŠãããã
// åã«é¢ããŠã®è©³çްãäžèšã®ã¹ã©ã€ãåç
§ã
val paramsStack = Stack [ Tree ](( params map ( _ . tree)) : _ * )
val refs = s_format. split( "(?<=%[\\w%])|(?=%[\\w%])" ) map {
case "%d" => precompute( paramsStack. pop, typeOf[ Int ])
case "%s" => precompute( paramsStack. pop, typeOf[ String ])
case "%%" => Literal ( Constant ( "%" ))
case part => Literal ( Constant ( part))
}
// ãããŠæåŸã«çæããã³ãŒãã®å
šãŠã Block ãžãšçµã¿åãããã
// 泚ç®ããŠã»ããã®ã¯ reify ã®åŒã³åºãã ã
// AST ãæã£åãæ©ãäœæããæ¹æ³ãæäŸããŠããã
// reify ã®è©³çްã¯ããã¥ã¡ã³ããŒã·ã§ã³ãåç
§ããŠã»ããã
val stats = evals ++ refs. map( ref => reify( print( c. Expr [ Any ]( ref). splice)). tree)
c. Expr [ Unit ]( Block ( stats. toList, Literal ( Constant (()))))
}
}
3. ãã¯ããã³ã³ãã€ã«ãã
æºåã¯ã§ãã? scalac Macros.scala
ãšæã¡èŸŒãã§ã¿ããã
2012-07-31
ãã¯ãã®äœè
ãšããŠä»æ³šç®ã济ã³ãŠãã Eugene Burmako ãããšããã¯ãã䜿ã£ãŠèšèªçµ±åãããããŒã¿ããŒã¹æ¥ç¶è¡ãã©ã€ãã©ãª SLICK ã®äœè
ã§ãã Jan Christopher Vogt ãããä»å¹Žã® Scala Days ã§è¡ã£ãçºè¡šã®ã¹ã©ã€ãã翻蚳ããŸããã翻蚳ã®å
¬éã¯æ¬äººãã蚱諟æžã¿ã§ãã翻蚳ã®ééãçãããã°é æ
®ãªããææãã ããã
2012幎4æ18æ¥ Eugene BurmakoãJan Christopher Vogt è
2012幎7æ30æ¥ e.e d3si9n èš³
Scala ãã¯ã
(é ãããããããã«) ã³ã³ãã€ã©ãæ¡åŒµããæš©éãéçºè
ã«äžãã!
ããã¯ã³ã³ãã€ã«æã«ä»¥äžãè¡ã:
æ€æ»
åŠç
AST 倿
ã³ãŒãçæ
ã©ã³ã¿ã€ã ãžã® AST ã®é
å
蚳泚: Scala ãã¯ã㯠2.10 ããå°å
¥ãããã³ã³ãã€ã«æã«ã³ãŒãã眮æããæ©æ§ã ãããã«ããä»ãŸã§ãã€ã©ãŒãã¬ãŒããå¿
èŠã ã£ããã®ãèªåçæã§ããããã«ãªããªã©ãããé«ã衚çŸåãæã«ããããšãã§ããã
2012-07-22
ãã㯠Scala ããã°ã©ãã®ããã® C# LINQ æ©èœã®èŠãæžãã ããéãšããŠã䜿ããã¯ãã
åæšè«
C# ã«ã¯åæšè«ããããå人çã«ãããŒã«ã«å€æ°ã§ã¯ã§ããã ã var
ã䜿ãããã«ããŠããã
var x = 1;
Scala ã«ã var
ããããã©ãå¯èœãªãäžå€ (immutable) 㪠val
ã䜿ãã®ã奜ãŸãããšãããŠããã
æ°ãã List ãš Array ã®äœæ
C# ã¯ã€ã³ã©ã€ã³ã§ã³ã¬ã¯ã·ã§ã³ãäœãããšãã§ããã
using System.Collections.Generic;
var list = new List { “Adam”, “Alice”, “Bob”, “Charlie” };
var array = new [] { 0, 1, 2 };
å
šãŠã® Scala ã³ã¬ã¯ã·ã§ã³ã«ãã¡ã¯ããªã¡ãœãããããã
val list = List ( "Adam" , "Alice" , "Bob" , "Charlie" )
val array = Array ( 0 , 1 , 2 )
ã©ã ãåŒã䜿ã£ããã£ã«ã¿
C# ã«ã¯ “enrich-my-library” çãªã¢ã³ããŒãããã³ã°ããããæ®éã® Array ã« Where
ã¡ãœããã远å ãããŠããã
2012-06-08
/ sbt
ã€ãã« final ããªãªãŒã¹ããããsbt 0.12.0 ã®å€æŽç¹ ãèš³ããŸããã
ãã€ããªããŒãžã§ã³ãšããæŠå¿µãå°å
¥ãããããšã§ãScala 2.9.0 ã§å
¥ã£ããã©ããŸã掻çšãããŠããªã Scala ã®åŸæ¹ãã€ããªäºææ§ãããæ£é¢ã«åºãŠããããã«ã±ãšãªããšæããŸãã
äºææ§ã«åœ±é¿ã®ããæ°æ©èœããã°ä¿®æ£ããã®ä»ã®å€æŽç¹
Scala 2.10 以éã® Scala åã³ sbt ãã©ã°ã€ã³ã®ã¯ãã¹ããŒãžã§ã³èŠçŽã®å€æŽã (詳现ã¯ä»¥äžã®é
ç® )
çŽæ¥å®è¡ãããå Žåã匷å¶çã« update
ãå®è¡ããããã«ããã #335
sbt ãã©ã°ã€ã³ãªããžããªããã©ã°ã€ã³ãšãã©ã°ã€ã³ã®å®çŸ©ã«ããã©ã«ãã§å ãã£ãã #380
ãã©ã°ã€ã³èšå®ãã£ã¬ã¯ããªã®åªå
é äœã (詳现ã¯ä»¥äžã®é
ç® )
ãœãŒã¹äŸåæ§ã®ä¿®æ£ã (詳现ã¯ä»¥äžã®é
ç® )
éçŽãããæè»ã«ãªã£ãã (詳现ã¯ä»¥äžã®é
ç® )
ã¿ã¹ã¯è»žã®æ§æã key(for task)
ãã task::key
ãžãšå€æŽãããã (詳现ã¯ä»¥äžã®é
ç® )
sbt ã® organization ã org.scala-sbt
ãžãšå€æŽãããã(å
ã¯ãorg.scala-tools.sbt) ç¹ã«ãscripted ãã©ã°ã€ã³ã®ãŠãŒã¶ã¯ãã®åœ±é¿ãåããã
artifactName
ã®åã (ScalaVersion, ModuleID, Artifact) => String
ãšãªã£ãã
javacOptions
ãã¿ã¹ã¯ãšãªã£ãã
session save
㯠build.sbt
å
ã®èšå®ãïŒé©åãªæã«ïŒäžæžãããããã«ããã#369
æ°æ©èœ
ãã¹ãã®ãã©ãŒã¯ã®ãµããŒãã #415
test-quick
ã (#393 )
ãªããžããªèšå®ã®ã°ããŒãã«ãªãªãŒãã©ã€ãããµããŒãããã #472
åã³ã³ãã€ã«ãããã« unchecked ãš deprecation ã®èŠåã衚瀺ãã print-warnings
ã¿ã¹ã¯ã远å ããã(Scala 2.10+ ã®ã¿)
Ivy èšå®ãã¡ã€ã«ã URL ããèªã¿èŸŒããããã«ããã
projects add/remove
ã§äžæçã«ä»ã®ãã«ããšäœæ¥ã§ããããã«ãªã£ãã
䞊åå®è¡ã®å¶åŸ¡ã®æ¹åã (詳现ã¯ä»¥äžã®é
ç® )
inspect tree
ã§ inspect
ãååž°çã«åŒã¹ãããã«ãªã£ãã#274
ãã°ä¿®æ£
ååž°çã«ãã£ã¬ã¯ããªãåé€ãããšãã«ãã·ã³ããªãã¯ãªã³ã¯ãæãå
ã®ã³ã³ãã³ããåé€ããªãããã«ããã
Java ãœãŒã¹ã®èŠªã®æ€ç¥ã®ä¿®æ£ã
update-sbt-classifiers
ã§çšãããã resolver ã®ä¿®æ£ã#304
ãã©ã°ã€ã³ã®èªåã€ã³ããŒãã®ä¿®æ£ã#412
åŒæ°ã®ã¯ãªãŒã #396
Ctrl+Z ã§åæ¢ããåŸ JLine ãæ£ãããªã»ããããããã«ããã(Unix ã®ã¿) #394
æ¹åç¹
ã©ã³ãã£ãŒã 0.7.0 以éå
šãŠã® sbt ãèµ·åã§ããããã«ãªã£ãã
ã¹ã¿ãã¯ãã¬ãŒã¹ãæå¶ãããå Žåãlast
ãåŒã¶ããã«ããæŽç·Žããããã³ãã衚瀺ãããããã«ãªã£ãã
Java 7 ã® Redirect.INHERIT ãçšããŠåããã»ã¹ã®å
¥åã¹ããªãŒã ãç¶æ¿ããããã«ãªã£ãã #462 , #327 ããã§ã€ã³ã¿ã©ã¯ãã£ããªããã°ã©ã ããã©ãŒã¯ããå Žåã«èµ·ããåé¡ã解決ãããã¯ãã (@vigdorchik)
help
ãš task
ã³ãã³ãã®æ§ã
ãªæ¹åãããã³æ°ã㪠settings
ã³ãã³ãã#315
jsch ããŒãžã§ã³ã 0.1.46 ãžãšæŽæ°ã #403
JLine ããŒãžã§ã³ã 1.0 ãžãšå€æŽã (詳现ã¯ä»¥äžã®é
ç® )
ãã®ä»ã®ä¿®æ£ããã³æ©èœæ¹å: #368 , #377 , #378 , #386 , #387 , #388 , #389
å®éšçããããã¯éçºéäž
å·®åã³ã³ãã€ã«ãçµã¿èŸŒãããã® APIããã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ä»åŸå€æŽããå¯èœæ§ãããããæ¢ã« scala-maven-plugin ã®ãã©ã³ã ã§å©çšãããŠããã
Scala ã³ã³ãã€ã©ã®åžžé§ã®å®éšçãµããŒãã sbt ã« -Dsbt.resident.limit=n
ãæž¡ãããšã§èšå®ãè¡ããn
ã¯åžžé§ãããã³ã³ãã€ã©ã®æå€§æ°ã
æ°ãµã€ã ã® howto ããŒãžãèªã¿ãããããã
倧ããªå€æŽã®è©³çްç¹
## ãã©ã°ã€ã³ã®èšå®ãã£ã¬ã¯ããª
0.11.0 ã«ãããŠãã©ã°ã€ã³ã®èšå®ãã£ã¬ã¯ããªã¯ project/plugins/
ãããã ã® project/
ãžãšç§»è¡ããproject/plugins/
ã¯éæšå¥šãšãªã£ãã0.11.2 ã«ãããŠéæšå¥šã®ã¡ãã»ãŒãžã衚瀺ãããããå
šãŠã® 0.11.x ã«ãããŠã¯æ§ã¹ã¿ã€ã«ã® project/plugins/
ãæ°ããã¹ã¿ã€ã«ãããé«ãåªå
ãããã0.12.0 ã§ã¯æ°ããã¹ã¿ã€ã«ãåªå
ããããæ§ã¹ã¿ã€ã«ã®ãµããŒã㯠0.13.0 ãåºããŸã§å»æ¢ãããªãã
2012-04-11
/ sbt
XML ããŒã¹ã®ãã«ãããŒã«ãšæ¯èŒãããš sbt ã¯ãã«ãå®çŸ©ã (.sbt ãš .scala ã®äž¡æ¹ãšã) Scala ã䜿ã£ãŠæžããšããéãããããããã«ããäžåºŠ sbt ã®ã³ã³ã»ãããæŒç®åãæŒãããŠããŸãã°ããã«ããŠãŒã¶ã sbt ãã©ã°ã€ã³ãæžãå§ããã®ã«ããŸãåŽåããããªãã
æ¢ã«ãã£ã sbt 0.7 ã®ãã©ã°ã€ã³ãç§»æ€ããŠãããããªãªãžãã«ã®ãæžããŠããã®ã§ãŸãšããŠç޹ä»ãããã
sbt-dirty-money
sbt-dirty-money 㯠Ivy ãã£ãã·ã¥ãäœãšãªãéžæçã«æ¶å»ããããã®ãã©ã°ã€ã³ã (~/.ivy2/cache
äžã® organization
ãš name
ãå«ããã®)ããã£ã 25è¡ã®ç°¡åãªå®è£
ã ãã©ãclean-cache
ãš clean-local
ã® 2ã€ã®ã¿ã¹ã¯ã¯åã®åœ¹ã«ç«ã£ãŠããã
äŸãã°ãäœããã©ã°ã€ã³ãéçºããŠããŠããããã¹ãçšã® hello ãããžã§ã¯ãã«ãããŠãã£ãã·ã¥ãããŠãããã©ãããäžæã§ãããšããã
ãã©ã°ã€ã³ãããžã§ã¯ãäžãã clean-cache
ãš clean-local
ã®äž¡æ¹ãèµ°ãããhello ãããžã§ã¯ãã reload ããããšã§ãã©ã°ã€ã³ã解決ã§ããªããã©ããã確èªããã解決ã§ããªããã°ãã©ããç¥ããªãæããåŒã£åŒµã£ãŠããŠãããã§ã¯ãªããšããããšãªã®ã§æåã ã
sbt-buildinfo
sbt-buildinfo ã¯åããæžãããšæã£ãŠãããã©ã°ã€ã³ã®äžã€ã ãããã¯ãã«ãå®çŸ©ãã Scala ã®ãœãŒã¹ãçæãããäž»ãªç®çã¯ããã°ã©ã ãèªèº«ã®ããŒãžã§ã³çªå·ãæèããããšã«ãã (ç¹ã«ãconscript ã䜿ã£ãã¢ããªã®å Žå)ã
sourceGenerators
ã䜿ã£ãŠããŒãžã§ã³çªå·ãå«ããªããžã§ã¯ããçæããã¹ã¯ãªãããã¡ãã¡ãã£ãšæžããããšãäœåããã£ãããä»ã®äººã«ã䜿ã£ãŠããããããã«ããã«ã¯ãã©ã°ã€ã³ã«ããã®ãé©ããŠããšæã£ããstate
ããå€ãæœåºããããšã§ sbt-buildinfo ã¯ä»»æã®è€æ°ã®ããŒãã Scala ãœãŒã¹ãçæããã以äžã build.sbt
ã«å ãã:
buildInfoSettings
sourceGenerators in Compile <+= buildInfo
buildInfoKeys : = Seq [ Scoped ]( name, version, scalaVersion, sbtVersion)
buildInfoPackage : = "hello"
ããã§ä»¥äžãçæããã:
2012-04-02
䞊åã³ã¬ã¯ã·ã§ã³ã©ã€ãã©ãªã®ã¬ã€ãã翻蚳ããŠãdocs.scala-lang.org ã«åã蟌ãã§ããããŸããã
åæã¯ EPFLã®ç ç©¶ã¢ã·ã¹ã¿ã³ãã§ã䞊åã³ã¬ã¯ã·ã§ã³ã®èšèšæžã§ãã A Generic Parallel Collection Framework (pdf) ãšããè«æã®ç¬¬äžèè
ã§ããã Aleksandar Prokopec ãããš
çŸåšã¢ã¡ãªã«ãã EPFL ã«çåŠäžã§ã䞊åãšåæ£ããã°ã©ãã³ã°ã¢ãã«ãç ç©¶ããŠããŠãã³ãã¥ããã£å
ã§ã¯ããã¥ã¡ã³ããŒã·ã§ã³ãã¡ãŒãšããŠãç¥ããã Heather Miller ããã§ãã
2012-01-16
treehugger ã¯ã³ãŒããçšã㊠Scala ã®ãœãŒã¹ã³ãŒããæžãããã®ã©ã€ãã©ãªã ãããã¯ãŸããRefelection API ã«åºã¥ã Scala AST ã®ä»£æ¿å®è£
ã®äžã€ã§ããããgithub ã§ eed3si9n/treehugger ãšããŠå
¬éããŠããã
æŽæ°:
ãã®èšäºãæ¡åŒµããŠæ¬åœãã£ããã n8han/pamflet ã䜿ã£ãŠã¬ã€ãã«ä»äžããŠã¿ãŸããïŒä»ã®ãšããè±èªã ãã§ãïŒ:
2012-01-07
Scala ãšããèšèªã¯ãåã®äœ¿ã£ãããšã®ããäžã§ã¯æããšã¬ã¬ã³ãã§ã衚çŸåã«å¯ã¿ãäžè²«æ§ãããããã€å®å©çãªèšèªã®äžã€ã ãšæãããã¿ãŒã³ãããã³ã°ãçµ±äžåœ¢åŒã¢ã¯ã»ã¹ã®ååãªã©ã¯ããããã®çã®è¯ãã¯ææã«ããšãŸããªãããããŠãScala ãšã³ã·ã¹ãã ãš Scala ã³ãã¥ããã£ãŒã¯ãã®èšèªããã匷åãªãã®ã«ããŠããã
Scala 2.9.1 ã«ãããŠãããŒã«ã«ã§å®£èšããã implicit ã¯ã€ã³ããŒãããããã®ãããåªå
ããããåé¡ã¯ãèšèªä»æ§ã«ã¯ãã®ãããªæ¯ãèãã¯æžãããŠããªãããšã ãåã®åœåã®ä»®èª¬ã¯ãèªåãèšèªä»æ§ãæ£ããçè§£ããŠããªããããããã¯èšèªä»æ§ã«æã穎ããããã®ã©ã¡ããã ãããšãããã®ã ã£ãããšã«ããããã®ä»®èª¬ã«åºã¥ããŠæé»ã®ãã©ã¡ãŒã¿è§£æ±ºã®åªå
é äœã«ã€ããŠè²ã
調ã¹ãçµæãå
鱿žãã ããæªããäŒèª¬ãã§ãããèšãããããã«ãå
šãäºæããŠããªãã£ãçµæãåºãŠãããšããæãé¢çœããã®ãšãªããåŸã§åãã£ãã®ã¯ã仮説ã®äž¡æ¹ãšãééã£ãŠãããšããããšã ã
ã€ãŸããé¢é£éšåã«é¢ããåã®ä»æ§ã®çè§£ã¯æ£ããã仿§ãæ£ãããšããããšã ãSI-5354 ã«ãããšãééã£ãŠããã®ã¯ã³ã³ãã€ã©ã®å®è£
ã ã£ãã
2012-01-02
Northeast Scala Symposium 2012 ãããšæ°ã¶æãšããæã ãã©ã2011幎ããŸãšãããšãã圢ã§å»å¹Žã®ã·ã³ããžãŠã ã§ã®çºè¡šã®äžã€ãåèããŠã¿ããããšã«ãããnescala ã¯æ¬¡ããæ¬¡ãžãšã¯ãªãªãã£ã®é«ãçºè¡šããã£ãããããã®å
šãŠã¯ãããã§èŠãããšãã§ãã ãDaniel ã®é¢æ°åã®ããŒã¿æ§é ãš Janas ã® Akka ãããããäžæéã®ããŒããŒãããã£ãããšããããScala ã³ãã¥ããã£ãŒã®äžã« FP ãšã¢ã¯ã¿ãŒãšããäºã€ã®æœ®æµã圢æããã€ã€ããããšãå°è±¡ã«æ®ã£ãïŒPaul ãã¢ã¯ã¿ãŒã®ã¡ãã»ãŒãžã®éä¿¡ã«ã¯åç
§ééæ§ãç¡ããšå®£èšããã®ããã³ãã ã£ããããããªãïŒããŸããäžå¹Žã®ãã®åŸã®äºå
ãšãèšãã Mark ã® sbt 0.9 ã®ãã¬ãŒã³ã Nermin ã«ãã Scala ã®ããã©ãŒãã³ã¹ã«é¢ããèå¯ããã£ããããããåã®äžã§çŽã¡ã«ã³ãŒãã倿Žããå¿
èŠã«è¿«ãããããªçŽæ¥çãªã€ã³ãã¯ããšããæå³ã§æããåºãçºè¡šã¯ Josh ã®çºè¡šã ã£ã: Implicits without the import tax: How to make clean APIs with implicits. ïŒimport çšã®ããããªã implicit: implict ãçšããŠããã«ã¯ãªãŒã³ãª API ãäœããïŒ
æé»ã®ãã©ã¡ãŒã¿è§£æ±º
Josh ã®çºè¡šã®å€§ããªç¹ã¯ãæé»ã®ãã©ã¡ãŒã¿ (implicit parmeter) ã¯ããã€ãã®ã¬ã€ã€ãŒãé çªã«èŠãŠããããšã§è§£æ±ºãããã¯ã€ã«ãã«ãŒã import
ã¯é«ãåªå
é äœãå ãããããã©ã€ãã©ãªãããã䜿ã£ãŠããŸããšãŠãŒã¶ãããããªãŒããŒã©ã€ãã§ããªããªã£ãŠããŸããšããããšã ã£ãã
ãã®ãã¹ãã«ãããŠãimplicit ã®è§£æ±ºåªå
é äœã Scala Language Specification ãèªãã ãã³ãŒãã§è©ŠããŠããããšã§æ¢æ€ããŠããããããã£ãã¡ãªäººã®ããã«ãæçµçã«å°ãã ãããåªå
é äœã以äžã«ç€ºãã:
Implicits with type T defined in current scope. (relative weight: 3)
Less specific but compatible view of type U defined in current scope. (relative weight: 2)
2-b) Implicits with type T defined in current class X ’s parent trait or class X 2 . (relative weight: 2)
3-b) Implicits with type T defined in X 2 ’s parent trait or class X 3 . (relative weight vs 2-b: 1)
2-c) Implicits with type T defined in outer scope, explicit imports, wildcard imports, and implicits in package object Y . (relative weight: 2)
3-c) Implicits with type T defined in the package object’s parent trait or class Y 2 . (relative weight vs 2-c: 1)
3-d) Less specific but compatible view of type U defined in parent trait or class Z . (relative weight: 1)
4-d) Less specific but compatible view of type U defined in Z ’s parent trait or class Z 2 . (relative weight vs 3-d: 0)
3-e) Less specific but compatible view of type U defined in outer scope, explicit imports, wildcard imports, and implicits in package object W . (relative weight: 1)
4-e) Less specific but compatible view of type U defined in package object W ’s parent class W 2 . (relative weight vs 3-e: 0)
Implicits with type T defined in the package object of T .
Implicits with type T defined in the parent trait Q 2 of package object of T .
Implicits with type T defined in the companion object of T .
Implicits with type T defined in companion object of T ’s parent trait or class T 2 .
Implicits with type T defined in the companion object of type constructor M[_] .
Implicits with type T defined in companion object of M[_] ’s parent trait or class M 2 .
Implicits with type T defined in the companion object of type parameter A .
Implicits with type T defined in companion object of A ’s parent trait or class A 2 .
Implicits with type T defined in the companion object of compound parts R .
Implicits with type T defined in companion object of R ’s parent trait or class R 2 .
Implicits with type T defined in the companion object of outer type p for singleton types p .type
.
Implicits with type T defined in companion object of p ’s parent trait or class p 2 .
Implicits with type T defined in the companion object of outer type S of type projections S #
U .
Implicits with type T defined in companion object of S ’s parent trait or class S 2 .
the Scala Language Specification
the Scala Language Specification (pdf) ã¯ããã«é¢ããŠäœãèšã£ãŠããã ããã? p. 106:
2011-12-17
ãã㯠Scala Advent Calendar 2011 ã® 17æ¥ç®ã®èšäºã§ãã
specs2 ã®äœè
ã§ããã@etorreborre ãšããŠã掻çºã«çºèšãç¶ããã·ãããŒã®åŒ·è±ª Eric Torreborre ãããæžãã “The Essence of the Iterator Pattern” ã翻蚳ããŸããã翻蚳ã®å
¬éã¯æ¬äººãã蚱諟æžã¿ã§ãã翻蚳ã®ééãçãããã°é æ
®ãªããææãã ããã
2011幎6æ24æ¥ Eric Torreborre è
2011幎12æ17æ¥ e.e d3si9n èš³
å»å¹Žèªãã è«æã§äžçªæ°ã«å
¥ã£ãã®ã¯ “The Essence of the Iterator Pattern” ïŒä»¥äžãEIPïŒã ããããèªãã åŸã§ãä»ãŸã§äœå¹Žã䜿ãç¶ããŠãããããã®ã«å¯Ÿããèããã¬ã©ãªãšå€ãã£ããããã¯ãfor
ã«ãŒãã ã
ãã®è«æã®äžããããã€ãã®ã¢ã€ãã£ã¢ã玹ä»ããŠãæžãããŠããè§£æ³ã®å®è£
æ¹æ³ã Scalaz ã£ãœãã³ãŒãã䜿ã£ãŠèª¬æããã以åã«é¢æ°åããã°ã©ãã³ã°ããã¡ã³ã¯ã¿ãã¢ãããªã©ã«å°ãã§ãè§Šããããšãããã°ã圹ç«ã€ãšæã!
for ã«ãŒãã®äžèº«ã¯äœã ?
ããããæ¬åœã«åãããã£ãããã«ã±ã ããfor
ã«ãŒãã®äžèº«ã¯äœã ããšã¯ã©ãããæå³ã ? åãäœå¹Žã䜿ã£ãŠãããã®æ§æã«ãäœãéæ³ã¯å
¥ã£ãŠããªãã ããã?
EIP ã®å°å
¥éšã«ãïŒC ã®ãããªæ·»åã䜿ã£ã for
ã§ã¯ãªãïŒåèŠçŽ ãäžã€ã¥ã€é ã«è¿ãã¿ã€ãã® for
ã«ãŒãã®äŸãã§ãŠãããããã§ã¯ãScala ã«å€èº« ãããŠæžããã©ãèãæ¹ã¯äžç·ã :
val basket: Basket [ Fruit ] = Basket ( orange, apple)
var count = 0
val juices = Basket [ Juice ]()
for ( fruit <- basket) {
count = count + 1
juices. add( fruit. press)
}
ãŸãããã«ãŒãã®ãã³ã³ãããã§ãã Basket
ããå§ãããããã¯ãList
ãTree
ãMap
ãªã©å¥ã«äœã§ããããfor
ã«ãŒãã¯ã次ã«ä»¥äžã® 3ã€ã®ããšãå®è¡ãã:
**åãã圢ã**ãããã³ã³ãããè¿ãïŒãžã¥ãŒã¹ã Basket
ã§ããããïŒã
äœããã®èšæž¬å€ãçŽ¯ç© (accumlate) ãè¡ããããã§ã¯ãcount
倿°ã«ãã«ãŒãã®æ°ã环ç©ãããŠããã
èŠçŽ ãå¥ã®èŠçŽ ã«æå°ãã (map)ãããã§ã¯ããã«ãŒããæœ°ããŠææ±ãåŸãŠããã
ãã® for
ã«ãŒãã¯æãè€éãªãã®ãšããããã§ããªã:
2011-11-20
Scala ã®ããŒã«ã䜿ã£ããæ¥åžžã®ã³ãŒãã£ã³ã°ã§ã®ãã¯ããã¯ã玹ä»ãããã
äŸãã°ãããŒã«ãšãã©ã€ãã©ãªãéçºããŠããšããŠããã°å ±åãåãããšããããŸãåå ã®åæã«å
¥ãåã«åãéäžããããšã¯ããŠãŒã¶ã䜿ã£ãŠããã®ãšåãããŒã¿ã§åé¡ãåçŸããããšã ãåé¡ãåçŸã§ããã°ã次ã«åé¡ãåçŽåããŠå€±æãã spec ãæ©èœãã¹ãã«èœãšãããããšã«ç§»è¡ããããã°ãä¿®æ£ããããåŸã§ãåãã»ããã¢ããã䜿ã£ãŠå®éã®ããŒã¿ã§ããã°ãçŽã£ãŠãããã確èªããããšãã§ããã
2011-11-06
/ sbt
sbt ãããžã§ã¯ãããã€ãã«ãå
¬åŒã¬ã€ããšèšãã Getting Started Guide ãåºãŠããã®ã§ã翻蚳ããŸãããåæã¯ãHeroku ã« Scala ãèŒããããªããããŠããTypesafe 瀟㮠Havoc Pennington æ°ã«ããå
šãŠæžãããŠããŸãã
2011-09-25
/ sbt
version 2.0
2011幎6æ19æ¥ã«æåã®ããŒãžã§ã³ãæžããæç¹ã§ã®åã®åæ©ã¯ãéè¯ã Mark ã«ãã sbt 0.10 ã®ãã¢ãäºåãçã§èŠããããšã«è§ŠçºãããŠïŒæå㯠northeast scala ãæ¬¡ã« scala days 2011 ïŒãsbt 0.7 ãã 0.10 ãžãšçãç§»è¡ããã®ãæå©ããããã£ãããã ã£ãããã©ã°ã€ã³ãããã£ãŠããªããã°ãã«ããŠãŒã¶ã 0.10 ã«ç§»è¡ã§ããªãããããã©ã°ã€ã³ãç§»è¡ãžã®å€§ããªåŠšãã«ãªããšããã®ã倧æ¹ã®èãã ã£ããããã§åãåã£ãæŠç¥ã¯ãç¡ããã©ã°ã€ã³ã¯èªåã§ç§»æ€ããŠãã€ãŸããããã¡ãŒãªã³ã°ãªã¹ãã§è³ªåããŠãçµæãããã§ãŸãšãããšãããã®ã ã£ããããã«ãããå€ãã®ããžãã£ããªåå¿ããã£ãããæ°äººã 0.10 ãžç§»è¡ããæå©ãã«ããªã£ããšæããã ãã©ãåŸã»ã©æããã«ãªã£ãã®ã¯ãåã® sbt 0.10 ã«é¢ããçè§£ã¯å®å
šãªãã®ã§ã¯ãªããæãšããŠå
šãééã£ãŠãã誀解ãäžãããã®ã ã£ããšããããšã ãæè²¬ã¯åã«ããããå€ãå
容ããã®ãŸãŸæ®ããŠããã®ã§ã¯ãªããgithub ã« push ããŠãæ°ããããŒãžã§ã³ãäœã£ãŠãåãžé²ãããšã«ããããã©ã°ã€ã³ã®äœæã«é¢ããææ°ã®ç¥è㯠Plugins Best Practices ã«ãŸãšããããŠããã倧éšå㯠Brian ãš Josh ãã¡ããã£ãšã ãåã«ããæžãããŠããã
æ
ãŠã㪠(don’t panic)
ãã£ã 0.7 ã®äžçããçéžããã°ã£ããã®åãsbt 0.10 ãããŸãã«ãéãã®ã§ããã¯ãªããããšã ãšæãããã£ããæéããããŠæŠå¿µãçè§£ããã°ãå¿
ãåããããã«ãªãããsbt 0.10 ã®äºããã£ãšå€§å¥œãã«ãªãããšãçŽæããã
äžã€ã®è¡šçŸ
sbt 0.10 ãšããåãããã®ã«äžã€ã®æ¹æ³ããããããæåã¯æ··ä¹±ãããããããªãã
sbt 0.10 ãèµ·åæã«çŸããã·ã§ã«ã
build.sbt
ã settings
åã«å
¥ã Quick Configurations DSLã
æ®éã® Scala ã³ãŒããå¥å Full Configurationã
ããããã®è¡šçŸã¯å¥ã
ã®äœ¿çšã¢ãã«ã«æé©åããŠãããsbt ãåã«ãããžã§ã¯ãããã«ãããã®ã«äœ¿ã£ãŠããå Žåã¯ãã»ãšãã©ã®æéã publish-local
ãªã©ã®ã³ãã³ãã䜿ã£ãŠãã·ã§ã«ã®äžã§éããã ãããæ¬¡ã«ã©ã€ãã©ãªã®äŸåæ§ãªã©åºæ¬çãªèšå®ã®å€æŽãè¡ãããå Žåãbuild.sbt
ã® Quick Configurations DSL ã«ç§»è¡ãããæåŸã«ããµããããžã§ã¯ããå®çŸ©ãããããã©ã°ã€ã³ãæžãå Žåã«ã¯ãFull Configuration ã䜿ãããšã§ Scala ã®ãã¯ãŒãçºæ®ããããšãã§ããã
2011-09-18
/ sbt
ãã¹ãã®è©±ãããããäžåºŠãã©ã°ã€ã³ãæžããŠããŸããšãã©ãããŠãé·æçãªãã®ã«ãªã£ãŠããŸããæ°ããæ©èœãå ãç¶ããïŒãããã¯ãã°ãçŽãç¶ããïŒããã«ã¯ãã¹ããæžãã®ãåççã ãã ãã©ããã«ãããŒã«ã®ãã©ã°ã€ã³ã®ãã¹ããªããŠã©ããã£ãŠæžãã°ãããã ããïŒãã¡ããé£ã¶ãã ãã
scripted test framework
sbt ã¯ãscripted test framework ãšãããã®ãä»ããŠããŠããã«ãã®çæžããã¹ã¯ãªããã«æžãããšãã§ãããããã¯ãããšããš å€æŽã®èªåæ€ç¥ããéšåã³ã³ãã€ã«ãªã©ã®è€éãªç¶æ³äžã§ sbt èªäœããã¹ãããããã«æžããããã®ã :
ããã§ã仮㫠B.scala ãåé€ããããA.scala ã«ã¯å€æŽãå ããªããã®ãšãããããã§ãåã³ã³ãã€ã«ãããšãA ããåç
§ããã B ãååšããªãããã«ããšã©ãŒãåŸãããã¯ãã ã
[äžç¥ (éåžžã«è€éãªããšãæžããŠãã)]
scripted test framework ã¯ãsbt ã以äžã«æžããããããªã±ãŒã¹ãç確ã«åŠçããŠãããã確èªããããã«äœ¿ãããŠããã
æ£ç¢ºã«ã¯ããã®ãã¬ãŒã ã¯ãŒã¯ã¯ siasia ãšããŠç¥ããã Artyom Olshevskiy æ° ã«ããç§»æ€ããã scripted-plugin çµç±ã§å©çšå¯èœã ããããã¯æ£åŒãªã³ãŒãããŒã¹ã«åã蟌ãŸããŠããã
ã¹ããã 1: snapshot
scripted-plugin ã¯ãã©ã°ã€ã³ãããŒã«ã«ã« publish ããããããŸã㯠version ã -SNAPSHOT ãªãã®ã«èšå®ãããã
ã¹ããã 2: scripted-plugin
次ã«ãscripted-plugin ããã©ã°ã€ã³ã®ãã«ãã«å ãããproject/scripted.sbt
:
libraryDependencies <+= (sbtVersion) { sv =>
"org.scala-sbt" % "scripted-plugin" % sv
}
以äžã scripted.sbt
ã«å ãã:
ScriptedPlugin.scriptedSettings
scriptedLaunchOpts := { scriptedLaunchOpts.value ++
Seq("-Xmx1024M", "-XX:MaxPermSize=256M", "-Dplugin.version=" + version.value)
}
scriptedBufferLog := false
ã¹ããã 3: src/sbt-test
src/sbt-test/<ãã¹ãã°ã«ãŒã>/<ãã¹ãå>
ãšãããã£ã¬ã¯ããªæ§é ãäœãããšãããããsrc/sbt-test/<ãã©ã°ã€ã³å>/simple
ããå§ãããšããã
2011-08-29
future ã®å®è£
ã«ã¯æ§ã
ãªãã®ããããã©ãæšæºã©ã€ãã©ãªã®äžã«å
±éã®èŠª trait ãããã°ãç¹å®ã®ãã©ãããã©ãŒã ã¹ã¿ãã¯ã«ã³ãŒããäŸåãããã«ãã®æŠå¿µã衚çŸã§ããã®ã«ãšæã£ãŠãããããæã人ãä»ã«ããããã¯åãããªããã©ãã©ã€ãã©ãªã®äœè
ãªããã«ã¯åœ¹ã«ç«ã€ããããªãããªãåãæ¢ããããããsff4s ãæžããåæ©ã ã
future ã£ãŠäœ?
å€åååãããã¯èããããšãããããããªããã©ãäžå¿ããããããããfutureå€ïŒpromise ãšãåŒã°ããïŒã¯æªå®ã®èšç®ã衚çŸããã
futureå€ã¯æªå®ã®èšç®ã衚çŸããã
ããããã䜿ããã説æã ãã©ãããã ãã§ã¯åãããªããããã§èšå€ã«å«ãŸããŠããã®ã¯ããã®èšç®ã¯è£ã§è¡ãããŠãããšããããšã ãããã¯åãã³ã³ãã¥ãŒã¿å
ã®å¥ã®ã¹ã¬ããããå¥ã®ãµãŒãã®äžãããããªãããè¡ååŸ
ã¡ã§ãŸã èšç®ã¯å§ãŸã£ãŠããããªããããããªãããšã«ãããèšç®ã¯çŸåšã®å¶åŸ¡ãããŒã®å€ã§è¡ãããŠãããšããããšã ã
èšç®ã¯ã©ããå¥ã®æã§è¡ãããã
futureå€ã®ããäžã€ã®åŽé¢ã¯ããã®ãã¡ã«èšç®çµæãåŸããããšããããšã ãScala ã®å Žå㯠def apply()
ãåŒã³åºããªã©ã®æç€ºçãªã¹ããããèŠãããèšç®ãæªå®ã®å Žåã¯ããããã¯(block)ãããã€ãŸããèšç®çµæãåŸããããŸã§åŸ
ããããïŒãããã¯ã¿ã€ã ã¢ãŠãããïŒã
futureå€ããèšç®çµæãåŸãããšãã§ããã
æåã« futureå€ã宣èšãããæã«ã¯èšç®çµæã¯æããããããªããããŸã ç¡ããããããªããããŸãããã°ãããæç¹ã§çµæãå°çãããªããžã§ã¯ãã®å
éšæ§é ã倿Žããããããããfutureå€ãã解決ã(resolve)ãããšãããåæã«ç¶æ
ãå€ãããã®ãšããã®ã¯ããã°ã©ãã³ã°ã§ã¯ããŸãèŠãããªãã®ã§ãå°ãäžæ°å³ã§ã¯ããã
èšç®çµæã解決ããããã®è£å£ãããã
ãããŸã§ã§ãæãåçŽãªåœ¢ã® futureå€ãèšè¿°ãããå®éã«åœ¹ã«ç«ã€ã«ã¯ä»ã®æ©èœãå¿
èŠã ãã©ãããã§ã䜿ããªãããšã¯ãªããã¡ãã£ãšäœ¿çšäŸãã¿ãŠã¿ãã:
val factory = sff4s. impl. ActorsFuture
val f = factory future {
Thread . sleep( 1000 )
1
}
f() // => ãã㯠1ç§éãããã¯ããåŸã§ 1 ãè¿ã
现ããäºã¯æ°ã«ããªãã§ãæåŸã®äžè¡ã®æ¯ãèãã ãèŠãŠã»ããããã®ããã«ãèšç®çµæãååŸããããšãã匷èŠ(forcing)ãããšããããæå°éã® API ã¯ä»¥äžã®ããã«ãªãã
Future v0.1
abstract class Future [ +A ] {
/** èšç®çµæã匷èŠããŠç¡æéã«ãããã¯ãã */
def apply() : A
}
Scala ãã䜿çšå¯èœãª futureå€ã®å®è£
ã«ã¯ããã€ããããã©ãã©ããäžããæžãããŠããäžã®ãããªå
±éãªèŠªã¯ã©ã¹ãããã°ãç¹å®ã®ã©ã€ãã©ãªã«äŸåããªãã³ãŒããæžãããšãã§ããã
ãŸã æ¥ãªã?
Future v0.1 ã«å¯ŸããŠå¯äžã§ããäºãèšç®çµæãæ»ã£ãŠãããŸã§ãããã¯ããŠããŸãã®ã§ãããŸãã«ãäžäŸ¿ã ãåŸ
ã€ããšããã§ããªããã future ã䜿ããªãã»ããããããã®ãããå
šãŠã® futureå€ãæäŸããããäžã€ã®æ©èœãšããŠãèšç®çµæã®çšæãã§ãããã確ããããã³ããããã³ã°(non-blocking)ãªæ¹æ³ããããããã¯å®è£
ã«ãã£ãŠ isDone
ãisSet
ãisDefined
ãisCompleted
ãªã©ãšåŒã°ããŠããããå
šãŠåãæå³ã ãä»ã®ãšãããåã®å¥œã¿ãšããŠã¯ def isDefined: Boolean
ããããšæããfuture ãæŠå¿µçã« Option
ã®å€æ°ãšããŠèããããšãã§ããããã ã
2011-05-28
Scalaçã®é¢æ°åããã°ã©ãã³ã°äžæŽŸã代衚ããè«å®¢ã®äžäººã@djspiewak ã 2010å¹Žã«æžãã “Monads Are Not Metaphors” ã翻蚳ããŸããã翻蚳ã®å
¬éã¯æ¬äººãã蚱諟æžã¿ã§ãã翻蚳ã®ééãçãããã°é æ
®ãªããææãã ããã
2010幎12æ27æ¥ Daniel Spiewak è
2011幎5æ29æ¥ e.e d3si9n èš³
åã¯ä»ãçŽæãç Žããšããã ããããäžå¹Žåãåã¯çµ¶å¯Ÿã«ã¢ããã®èšäºã ãã¯æžããªããšèªåã«çŽæãããæ¢ã«ã¢ããã«é¢ããèšäºã¯æãäœã£ãŠãããèšäºã®æ°ãå€ãããŠãã®å€ãã ãã§å€ãã®äººã¯æ··ä¹±ããŠããããããå
šå¡ãã¢ããã«å¯ŸããŠç°ãªãæ±ãæ¹ãããŠãããããã¢ããã®æŠå¿µãåããŠåŠãŒããšããè
ã¯ãããªããŒãå®å®æã象ãç æŒ ã®ãããŠã£ã³ (蚳泚: ã¢ã©ãç³»éç§æ°) ã®å
±éé
ãæ¢ãåªåããããã¡ã«ãªã£ãŠããã
åã¯ããã®æ··ä¹±ããå©ã話ã®ãµãŒã«ã¹ã«ããããããäžã€è¿œå ãããããªããšã¯ããªãããŸããã©ã®å©ã話ãå®å
šã«ã¯æ£ç¢ºã§ã¯ç¡ããã©ã®å©ããå
šäœåãäŒããããŠããªãããããã€ãã¯éèŠãªç¹ã«é¢ããŠé²éªšã«èª€è§£ãæããããªå
容ã«ãªã£ãŠãããã¡ãã·ã³æçãå®å®ïŒããïŒã«æããã¯ããããšã§ã¯ã絶察㫠ã¢ãããçè§£ããããšã¯ã§ããªããã¢ãããçè§£ããå¯äžã®èŠæ¹ã¯ããããããã®ãŸãŸã®å§¿ãã€ãŸãæ°åŠçæŠå¿µãšããŠèŠãããšã ã
2011-04-23
Akka ã®äœè
ãšããŠçã
泚ç®ãéããŠãã Jonas Bonér ã 2008å¹Žã«æžãã “Real-World Scala: Dependency Injection (DI) ” ã翻蚳ããŸããã翻蚳ã®å
¬éã¯æ¬äººãã蚱諟æžã¿ã§ãã翻蚳ã®ééãçãããã°é æ
®ãªããææãã ããã
2008幎10æ6æ¥ Jonas Bonér è
2011幎4æ22æ¥ eed3si9n èš³
ããŠã宿Šã§ã® Scala ã·ãªãŒãºç¬¬äºåŒŸã®ä»åã¯ãScala ãçšãã Depenency Injection (DI) ã®å®è£
ãã¿ãŠãããããScala ã¯ãåãã£ãŠããèšèªæ©æ§ã ããçšããŠãäœéããã® DI ãå®çŸã§ããéåžžã«è±ãã§ãã£ãŒããªèšèªã ããå¿
èŠã«å¿ããŠæ¢åã® Java DI ãã¬ãŒã ã¯ãŒã¯ã䜿ãããšãã§ããã
Triental ã§ã¯ãäžã€ã®æŠç¥ã«èœã¡çããŸã§äžã€ã®ç°ãªãæ¹æ³ã詊ããã以äžã®ããã«è©±ãé²ããŠããããŸããçŸè¡ã® DI ã®å®çŸæ¹æ³ã詳ãã説æããåŸã§ã詊ããä»ã®æ¹æ³ãç°¡åã«ã«ããŒããã
Cake ãã¿ãŒã³ãçšãã
ç§ãã¡ãçšããŠããçŸè¡ã®æŠç¥ã¯ããããã Cake ãã¿ãŒã³ã«åºã¥ããŠããããã®ãã¿ãŒã³ã¯ãMartin Odersky ã®è«æ Scalable Component Abstractions ã«ãããŠãOrdersky ãšåœŒã®ããŒã ã Scala ã®ã³ã³ãã€ã©ãæ§æããæ¹æ³ãšããŠæåã«çºè¡šãããããã®ãã¿ãŒã³ãã©ã®ããã«ã㊠DI ãå®çŸããã®ããšããããšãæ¥æ¬èªã§èª¬æããäºã詊ã¿ãããããïŒç§ãã¡ã®å®éã«äœ¿ã£ãŠããã³ãŒãã«å€§ãŸãã«åºã¥ããïŒæçŽãªãµã³ãã«ã³ãŒããã¿ãŠã¿ããã
泚æ:
é ã远ã£ãŠãæçµããŒãžã§ã³ã«åããŠãªãã¡ã¯ã¿ãªã³ã°ããªãã説æããŠããã®ã§ãæçµããŒãžã§ã³ãèªãã§çè§£ãããŸã§ã¯ãããã¡ããã!ããšå«ã¶ã®ã¯åŸ
ã£ãŠã»ããïŒãã¡ãããèªäºåŸã«ã©ãããŠããšèšããªãæ¹å€ãè³è³ãæèŠãã¢ã€ãã£ã¢ãªã©ãéã£ãŠãããïŒããŸãããã®ãµã³ãã«ã³ãŒãã¯ããã®ãããªãµã³ãã«ã®äŸã«ããããéåžžã«è€éãªæ¹æ³ã§åãã«è¶³ããªãäºãè¡ã£ãŠããããã«ã¿ããããææ
¢ããŠå€§èŠæš¡ã·ã¹ãã ã§ã®å®éã®ãµãŒãã¹ãæ³åããŠãã©ã®ããã«å¿çšã§ããããæ³åããŠæ¬²ããã
ãŸãã¯ãUserRepository
(DAOãData Access Object) ãå®è£
ãããã
// å®éã®æ°žç¶åã¯äœãããŠããªããŠãç»é¢ã«ãŠãŒã¶ã衚瀺ããã ãã®ãããŒã
class UserRepository {
def authenticate( user: User ) : User = {
println( "authenticating user: " + user)
user
}
def create( user: User ) = println( "creating user: " + user)
def delete( user: User ) = println( "deleting user: " + user)
}
trait ã€ã³ã¿ãŒãã§ã€ã¹ãšãã®å®è£
ã«åããŠå®è£
ããããšãã§ãããã話ãç°¡åã«ããããã«ãæ¢ããŠããã§ã¯ããããªãã£ãã
2011-01-03
次ã
ãšã€ããã³ãŒãã玡ãåºã NY Scala ã·ãŒã³ã®äžå¿çååšã§ããç¶ãã @n8han ãäºå¹Žåã«æžãã “Weaving tweed with Scala and Json ” ã翻蚳ããŸããã翻蚳ã®å
¬éã¯æ¬äººãã蚱諟æžã¿ã§ãã翻蚳ã®ééãçãããã°é æ
®ãªããææãã ããã
2009幎5æ27æ¥ n8han è
2011幎1æ2æ¥ eed3si9n èš³
æœåºå ã¯ãProgramming in Scala ã® 24ç« ã«ã®ã¿èšè¿°ãããŠãã Scala ã®ç§å¯æ©èœã§ããã®æ¥ã®å€§ãããã ãä»ãŸã§ã¯ç case Some(thing) => kerpow(thing)
ã§æºè¶³ã ã£ãã®ããä»ã§ã¯æœåºåãæžããªããã° #scala freenode ã«ãå
¥ããŠããããªãããºã«ãããã° Scala ãã£ã³ãã«ã®ç¡¬æŽŸãªåžžé£ãã¡ã¯åã®ã³ã³ãã¥ãŒã¿ãããã¯ããŠé©ãã»ã©éŠ¬é¹¿ããããŒã«ããŠã¹ãé£ç¶åçããŠïŒãã ãæ··æµŽã·ã£ã¯ãŒã·ãŒã³ãé€ãïŒãçªçµã®ãã¢ã¯ãã£ããã®ããã«æå³ã®ããã¿ã€ãã³ã°ã諊ããªããã°ãããªãã
蚳泚ãä»¥äž Draco ããæç²
ãããµã ã»ã³ãŒãã¬ãŒã·ã§ã³ã¯äººéã®äººæ Œãçµéšããã¹ãŠæ¶ããæ°ããäººæ Œãæ€ãä»ããæè¡ãéçºããã圌ãã¯ãã®æè¡ãçšããŠãæŠéçšã®äººåœ¢ã¢ã¯ãã£ããçã¿åºããã
人圢ãã¡ã¯ããŒã«ããŠã¹ãšããæœèšã§ç掻ããŠããã誰ãã®äººæ Œãç§»æ€ãããä»»åã«æãã
ã¢ã¯ãã£ãã®äžäººããšã³ãŒã¯èšæ¶ã®ãªã©ã€ãäžã«ãšã©ãŒãèµ·ãããå®å
šã«ã¯èšæ¶ãæ¶ãããŠããªãã£ãã
ãã®æœåºåã¯ã¡ãã£ãšãã¯ã£ãšããŸãããã
åœããããéãåºããåã¯æœåºåããããšããããç¶æ³ã«é©çšããããåªãããäŸãã°ãJavaScript ã€ã³ã¿ããªã¿ãçè§£ã§ãããæŽèœãªæååãJson ãªããžã§ã¯ãã ãæœåºåã䜿ãã° case
æ§æã§ãã®ããã«åŠçããããšãã§ãã:
import dispatch.json.Js
val echo = Js("""{"acting": "ç¡è¡šæ
ã§åãèŠãŠãã"}""")
object Echo extends Js { val acting = 'acting ? str }
echo match {
case Echo.acting(hmm) => hmm
case _ => "pshaw"
}
res0: String = staring blankly ahead
Symbol
'acting
ã«å¯Ÿã㊠?
ãåŒã³åºãããšã§æœåºåãäœæããããSymbol
ã«ã¯ ?
ã¡ãœããã¯ãªããæé»ã®å€æã§ããããã€ãªããžã§ã¯ãã«å€æãããŠãããEchoãã¯ãã€ãæŒæããŠããšããããšãåãã£ãŠããã®ã§ããã®æœåºåã䜿ã£ãŠçŽæ¥ä»£å
¥ããããšãã§ãã:
2010-12-30
Scala ããããªããä»ã® IDE ã詊ããŸããããçµå± TextMate ã«æ»ã£ãŠããŸãã
ä»åå··ã§è©±é¡ã® IntelliJ IDEA ã«äŸ¿ä¹ããã«ããã£ãŠãTwilight theme ãäœããŸããã
2010-12-07
/ scala / scalaxb
çµå±ã®æïŒscalaxb ã®ãŠãŒã¶ã¯ãšã³ãã£ãã£ã»ãªããžã§ã¯ãã衚çŸããçŸå®ã®åé¡ã«èå³ãããã®ã§ãã£ãŠïŒãããã©ã XML ã«æ°žç¶åãããããšãã£ãããšã§ã¯ãªãïŒã ããïŒãã€ãããŒã¿ãã€ã³ãã£ã³ã°ã®å®è£
ãã·ã³ã°ã«ãã³/ã³ã³ãããªã³ã»ãªããžã§ã¯ããã远ãåºããªããã°ãããªãããšã¯åãã£ãŠããïŒã€ãæè¿ãŸã§ããŒã¿ãã€ã³ãã£ã³ã°ã®å®è£
ã¯ä»¥äžã®ããã«çæãããŠãã:
object Address extends rt. ElemNameParser [ Address ] {
val targetNamespace = "http://www.example.com/IPO"
def parser( node: scala.xml.Node ) : Parser [ Address ] =
...
def toXML( __obj : Address , __namespace : String , __elementLabel : String , __scope : scala.xml.NamespaceBinding ) : scala.xml.NodeSeq =
...
}
ã€ãŸãïŒscalaxb 㯠Address
ãã®ãã®ãšã¯é¢ä¿ã®ç¡ã XML ããŒã¿ãã€ã³ãã£ã³ã°ã®ããã«äžçå°ããã€ãžã£ãã¯ããŠããŸã£ãã®ã ïŒ
adapter
ãŸãæåã«ä»¥äžã®ãã㪠adapter ãªããžã§ã¯ãã«è¿œãåºãããšãèãã:
object DefaultXMLAdapter {
object AddressAdapter extends rt. ElemNameParser [ Address ] {
val targetNamespace = "http://www.example.com/IPO"
def parser( node: scala.xml.Node ) : Parser [ Address ] =
...
def toXML( __obj : Address , __namespace : String , __elementLabel : String , __scope : scala.xml.NamespaceBinding ) : scala.xml.NodeSeq =
...
}
}
ãã®æ¹æ³ã«ã¯ããã€ãã®åé¡ãããïŒãŸãïŒscalaxb ã®ã©ã³ã¿ã€ã ã§ãã DataRecord
ãïŒä»ãŸã§ã¯ã³ã³ãããªã³ã»ãªããžã§ã¯ãã®æé»æ§ã䜿ã£ãŠãã©ã£ãŠãã toXML
ã«ãã©ãçããªããšããããšã ïŒã³ã³ãããªã³ã»ãªããžã§ã¯ãã®è峿·±ãäžé¢ãšããŠãã³ã³ãã€ã©ã¯ïŒæé» (implicit) ã®å®çŸ©ã倿å
ã®åãšå€æå
ã®åã®ã³ã³ãããªã³ã»ãªããžã§ã¯ãã«ãæ¢ãã«ããã(Programming in Scala, p. 441) ãšãããã®ãããïŒ
第äºã®åé¡ã¯ïŒã¢ã€ãã³ãã£ãã£ãŒåé¡ã ïŒãŠãŒã¶ã®ã³ãŒãã®éªéã«ãªããªãããã«ããããšããŠããã®ã«ïŒAddress
ãªããžã§ã¯ãã®ããã«ã¯ DefeaultXMLAdapter.AddressAdapter
ïŒItem
ã®ããã«ã¯ DefeaultXMLAdapter.ItemAdapter
ãªã©ãšïŒãããã£ãŠç®ã«éããã®ãå°å
¥ããŠããŸã£ãïŒãŠãŒã¶ãç¥ã£ãŠããå¿
èŠãããã®ã¯ Address
ã XML ã«å€æã§ãããšããäºå®ã ããã£ãŠïŒãããã©ãè¡ãããŠããããšããã®ã¯äœèšãªè©³çްã§ãããªãïŒ
第äžã®åé¡ãšããŠïŒæ¡åŒµæ§ã®åé¡ãããïŒäŸãã°ïŒAddress
ãå®çŸ©ãã ipo.xsd
ãšïŒAddress
ã䜿ã purchaseReport
èŠçŽ ãå®çŸ©ãã report.xsd
ã®äºã€ã®ã¹ããŒãããããšããïŒåé¡ã¯ïŒreport.DefaultXMLAdapter.PurchaseReportAdapter
㯠ipo.DefaultXMLAdapter.AddressAdapter
ãåç
§ããããïŒipo.DefaultXMLAdapter
ãæ¡åŒµããŠã«ã¹ã¿ã ã®ããŒã¿ãã€ã³ãã£ã³ã°ãããããšãã§ããªããšããããšã ïŒ
2010-11-06
Debasish Ghosh ãã (@debasishg ) ã® “sjson: Now offers Type Class based JSON Serialization in Scala ” ã翻蚳ããŸããïŒ
å
èšäºã¯ãã¡ã: http://debasishg.blogspot.com/2010/07/sjson-now-offers-type-class-based-json.html
(翻蚳ã®å
¬éã¯æ¬äººãã蚱諟æžã¿ã§ã)
翻蚳ã®ééãçãããã°é æ
®ãªããææãã ãã
é·ãé sjson ã®ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ API ã¯ãªãã¬ã¯ã·ã§ã³ã«äŸåãããã®ã ã£ãïŒãã®æ¹æ³ã®é·æãšããŠã¯ïŒçžã®äžã§ã¯ãªãã¬ã¯ã·ã§ã³ã«ããå®è£
ãé 匵ã£ãŠããŠã API ã¯äœ¿ããããããããšãã§ãããšããããšã ïŒ
ãããïŒJSON æ§é ãš Scala ã®ãªããžã§ã¯ãã§ã¯åæ
å ±ã®è±ããã«å€§ããªéããããããšãå¿ããŠã¯ãããªãïŒScala ãã JSON ã«ãããšãã«äœããã®åœ¢ã§åæ
å ±ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãããã³ã«ã®äžéšãšããŠä¿åããªããããïŒå¯é倿ãããã®ã¯å Žåã«ãã£ãŠã¯ãšãŠãããªãããŒã§é£ããããšã«ãªãïŒç¹ã« JVM ã§ã¯ type erasure ã®ããã§ JSONæ§é ã«ã·ãªã¢ã«åãã Scala ãªããžã§ã¯ãã®äžã«ã¯å
ã«æ»ãã®ãã»ãŒäžå¯èœãªãã®ãããã ããïŒ
ver 0.7 ãã sjson ã¯å
ã®ãã®ã«å ããªãã¬ã¯ã·ã§ã³ã䜿ããªã JSON ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãããã³ã«ãçšæããïŒããã¯ãŠãŒã¶ãä»»æã®ãªããžã§ã¯ããã JSON ãžã·ãªã¢ã«åããèªåã®ãããã³ã«ãèŠå®ã§ããããã«ãªã£ãïŒãªãã¬ã¯ã·ã§ã³ã«ãã JSON ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ ã§ã¯ã¢ãããŒã·ã§ã³ã§è¡ã£ãŠãããã®ãã«ã¹ã¿ã ãããã³ã«ãèªåã§å®è£
ããããšã§å®çŸããããšãã§ããïŒ
sjons ã®åã¯ã©ã¹ã«ããã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã¯ David MacIver ã«ããçŽ æŽããã sbinary (çŸåšã¯ Mark Harrah ã«ããã¡ã³ã ãããã) ã«ã€ã³ã¹ãã€ã¢ãããŠããïŒåããããã³ã«ã䜿ããŸãå®è£
ã¬ãã«ã§ãè²ã
ãšçãŸããŠããã£ãïŒ
åã¯ã©ã¹ã®åºç€çæŠå¿µãžã®å
¥éïŒScala ã§ã®å®è£
ïŒãããŠåã¯ã©ã¹ã䜿ã£ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãããã³ã«ã Scala ã§ã©ãèšèšã§ãããã«ã€ããŠã¯ïŒæ°é±éåã«æžãã以äžã® blog èšäºãåç
§ããŠã»ãã:
çµã¿èŸŒã¿åã® JSON ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³
ãã㯠sjson ã§ããã©ã«ãã®ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãããã³ã«ã䜿ã£ã REPL ã»ãã·ã§ã³ã®äžäŸã …
2010-11-03
Debasish Ghosh ãã (@debasishg ) ã® “Scala Implicits : Type Classes Here I Come ” ã翻蚳ããŸããïŒ
å
èšäºã¯ãã¡ã: http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html
(翻蚳ã®å
¬éã¯æ¬äººãã蚱諟æžã¿ã§ã)
翻蚳ã®ééãçãããã°é æ
®ãªããææãã ããïŒ
å
æ¥ Twitter äžã§ Daniel ãš Scala ã§ã®åã¯ã©ã¹ã«ã€ããŠè«è°ããŠãããšïŒçªç¶ãã®ãããã¯ã«é¢ããæžãããã ã£ãèšäºãçºèŠããïŒãããèªãã§ãããªãã¯ç¹ã«ç®æ°ããäºãçºèŠããããã§ã¯ãªããïŒåã¯ã©ã¹ã«åºã¥ããæèã¯ããªãã®èšèšã®å¹
ã«äŸ¡å€ãäžããããšãã§ãããšæãïŒãã®èšäºãæžãå§ããã®ã¯ãã°ããåã«èšèšã®çŽäº€æ§ã«ã€ããŠã®èšäº (åæ) ãå
¬éãããšãã®ããšã ïŒ
ãŸã㯠GoF ã® Adapter ãã¿ãŒã³ããå§ãããïŒå§è²åã® Adapter ã¯ããå§ããããåæ(composition)ãšãããã¯ããã¯çšããŠæœè±¡äœ(abstraction) ã©ããããã€ã³ãããïŒ
èšèšã®çŽäº€æ§ã®ãšããšåãäŸã䜿ããšïŒ
case class Address ( no: Int , street: String , city: String ,
state: String , zip: String )
ããã LabelMaker
ãšããã€ã³ã¿ãŒãã§ã€ã¹ã«é©åãããããšããïŒã€ãŸãïŒæã
㯠Address
ãªããžã§ã¯ãã LabelMaker
ãšããŠäœ¿ãããïŒ
trait LabelMaker [ T ] {
def toLabel( value: T ) : String
}
ã€ã³ã¿ãŒãã§ã€ã¹å€æãè¡ãã¢ããã¿ãŒã¯…
// Adapter ã¯ã©ã¹
case class AddressLabelMaker extends LabelMaker [ Address ] {
def toLabel( address: Address ) = {
import address._
"%d %s, %s, %s - %s" . format( no, street, city, state, zip)
}
}
// ãã® Adapter 㯠Address ãªããžã§ã¯ãã« LabelMaker ã®ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããïŒ
AddressLabelMaker (). toLabel( Address ( 100 , "Monroe Street" , "Denver" , "CO" , "80231" ))
ããŠïŒäžã®èšèšã§æã
ã坿¬¡çã«å°å
¥ããŠããŸã£ãè€éãã¯ãªãã ããïŒ