è¯ãããã°ã©ãã³ã°èšèªãšã¯äœã§ããïŒ åœŒã¯ã©ã®ãããªè³è³ªãšç¹åŸŽãæã£ãŠããã¹ãã§ããïŒ çããåºãã®ã¯é£ããã§ãã èããããå®çŸ©ã®1ã€ã次ã«ç€ºããŸããåªããPLã¯ãããã«å²ãåœãŠãããã¿ã¹ã¯ãé©åã«è§£æ±ºããå¿ èŠããããŸãã çµå±ã®ãšãããYPã¯ããã°ã©ããŒã®æã«ããåãªãããŒã«ã§ãã ããŒã«ã¯ç§ãã¡ã®ä»äºãå©ããŠãããªããã°ãªããŸããã æåŸã«ããããäœæã®çç±ã§ãã ããŸããŸãªPLãããŸããŸãªåé¡ã解決ããããšããŸãïŒæåã¯ããŸããŸã§ãïŒã Clojureã®èšèšæã«èšå®ãããç®æšã¯ãäœæããããã°ã©ã ãåçŽã«ããããšã§ããã ãããŠãçµæãšããŠãäœæããã¹ããå éããŸãã ãããŠæãéèŠãªããšã¯ã圌ãã®ç解ãå€æŽãä¿å®ã®ããã®æéãççž®ããããšã§ãã
ã¯ããŒãžã¥ã¢å²©ïŒ
ããã«èŠåããŸã-Clojureã®ã¯ãŒã«ãã瀺ãã³ãŒãã¹ããããã¯ãããŸããã ãXèšèªã§ã¯5è¡ããããClojureã§ã¯4è¡ããããããªãã£ãããšãã£ããã¬ãŒãºã¯ãããŸããã ããã¯ãèšèªã®å質ã«é¢ããå«ãªåºæºã§ãïŒ æçµçã«ã
qsort
ã2è¡ã§èšè¿°ã§ãããã©ããã¯æ°ã«ããŸããããŸãã¯ã5æ¬ãæã
qsort
ãªããã°ãªããŸãããå®éã«ã¯ãã©ã€ãã©ãªé¢æ°ã䜿çšããŸãã
ã©ã ããæã£ãŠãã人ãé©ãããããšã¯ãããŸããããããã¯ã©ãã«ã§ããããŸãïŒéåžžãã»ãšãã©ã®å Žåã8çªç®ã®ããŒãžã§ã³ã§ã¯ã©ãã«ã§ã衚瀺ãããŸãïŒã ã³ã¬ã¯ã·ã§ã³ïŒäžŠåãå«ãïŒããªã¹ãåŒãããŸããŸãªæ§æç³ã®åŠç-å€ãã®èšèªã§ããã§ååã§ãã å®ã®ãšãããç§ã¯ãã®ãããªèšäºããã åŽæããŠããŸãã ãããããã®ãããªæ¯èŒã¯ãèšèªã®å質ãæ¯èŒããã®ã«ã¯ãŸã£ããäžé©åã§ãïŒ ããã¯ãããã°ã©ã ããHelloãworldïŒããšè¡šç€ºããéãã«ãã£ãŠYPã®é床ã枬å®ããæ¹æ³ã§ãã ããŠã HQ9 +ã®é床ã枬å®ããªãéãã èããŠã¿ããšããã®ãããªè©³çŽ°ã¯å€§èŠæš¡ãªã·ã¹ãã ã«ãšã£ãŠããã»ã©éèŠã§ã¯ãããŸããã ãããžã§ã¯ããæé·ããã«ã€ããŠãæ¬åŒ§ãã€ã³ãã³ãã䜿çšããããäžçœ®èšæ³ãæ¥é èŸèšæ³ã®ã©ã¡ãã䜿çšãããã«ã€ããŠãç§ãã¡ã¯ãŸããŸãå¿é ããªããªããŸãã é åã®åèšãèŠã€ãããšãã®äœåãªè¡ã¯ããã§ã«ãã¹ãŠã®äººãæ©ãŸãããšããããŸã-ãããããç°ãªãçš®é¡ã®åé¡ãåºãŠããŸãã
é£æ床
ç§ãã¡ãäœæããã·ã¹ãã ã¯æ¬è³ªçã«æ®çºæ§ã§ãã èŠä»¶ãå€æŽãããªããã°ãéåžžã«è¯ãã§ãããã éçºã®æåã®æ®µéã§ãã¹ãŠã®ç¶æ³ãäºåã«äºæž¬ã§ãããšããããããã¯çŽ æŽãããããšã§ãã æ²ããããªãå®éã«ã¯ãç§ãã¡ã¯åžžã«ä»äžããæ¹é ãæ¹åãæžãæãã亀æãæé©åããå¿ èŠããããŸã...æãäžå¿«ãªããšã¯ãæéãçµã€ã«ã€ããŠã·ã¹ãã ã®è€éããå¢ãããšã§ãã 絶ãããç¶ç¶çã«ã éçºã®åæ段éã§ã¯ããã¹ãŠãã·ã³ãã«ã§ééçã§ãããå€æŽã¯ãã¹ãŠãã¯ã©ã³ãããªãã§è¿ éã«è¡ãããŸãã çŸäºº æéãçµã€ã«ã€ããŠãç¶æ³ã¯ãšãŠããã©è²ã§éœæ°ã«ãªããŸãã ã³ãŒãã®ããããªç·šéã§ããã·ã¹ãã ã®åäœã«éªåŽ©ã®ãããªå€åãçããå¯èœæ§ããããŸãã æ éã«ç 究ããã³ãŒããåæããåå€æŽã«ããå¯äœçšãäºæž¬ããå¿ èŠããããŸãã æ£ç¢ºã«èšãã°ãæéãçµã€ã«ã€ããŠãæåéããå€æŽã®ãã¹ãŠã®å¯èœãªçµæãââå®å šã«åæããããšã¯ã§ããŸããã
人ã¯æ¬æ¥ãéãããéã®æ å ±ããäžåºŠã«ç¥èŠã§ããŸããã ãããžã§ã¯ããæé·ããã«ã€ããŠãå éšæ¥ç¶ã®æ°ãå¢å ããŸãã ããã«ãã»ãšãã©ã®æ¥ç¶ã¯æé»çã§ãã é ã®äžã§å¿ èŠãªãã®ãç¶æããããšããŸããŸãå°é£ã«ãªã£ãŠããŸãã ãããŠçŸæç¹ã§ã¯ãããŒã ã¯æé·ããŠãããããŒã ã¯å€åããŠããŸã-æ°ãã人ã ã¯ãããžã§ã¯ãå šäœããã¯ãç¥ããŸããã 責任ãåé¢ãããŠãããããããã«æ··ä¹±ããå¯èœæ§ããããŸãã åŸã ã«ãã·ã¹ãã ãè€éã«ãªããŸãã
ããã«å¯ŸåŠããæ¹æ³ã¯ïŒ ååž°ãã¹ãã®æ倧ã«ãã¬ããžãšåå€æŽåŸã«ããããå®è¡ããŸããïŒ ãã¹ãã¯éåžžã«äŸ¿å©ã§ãããå®å šããŒãã«ãããŸããã ãã¹ãã¯ãã¹ããŸããã§ãã-äœããæ£ãããããŸãããåé¡ããããŸãã ããã¯çç¶ã®æ²»çã§ããããã¹ãã¯åé¡ã®æ¬è³ªã解決ããŸããã å³æ Œãªã¬ã€ãã©ã€ã³ãšãã¿ãŒã³ã®åºç¯ãªäœ¿çšïŒ ããããåé¡ã¯å°å ã®åé¡ã§ã¯ãããŸããã ã³ãŒãå ã§ã³ã³ããŒãã³ããã©ã®ããã«çžäºäœçšããããç解ããã®ããããã ãã§ããæé»çãªãªã³ã¯ãå€ãããŸãã ãã¶ãäžå®ã®ãªãã¡ã¯ã¿ãªã³ã°ã§ããïŒ ããã¯äžèœè¬ã§ã¯ãããŸãã;äœã¬ãã«ã®ãœãªã¥ãŒã·ã§ã³ããè€éãã¯å¢ããŸããã å®éãåé¡ã¯å æ¬çã«å¯ŸåŠããå¿ èŠããããŸãã ãããŠãéèŠãªããŒã«ã®1ã€ã¯é©åãªããŒã«ã§ãã åªããããã°ã©ãã³ã°èšèªã¯ãã·ã³ãã«ã§ééçãªããã°ã©ã ãäœæããã®ã«åœ¹ç«ã¡ãŸãã
ã·ã³ãã«ã§ç°¡å
ãããããã·ã³ãã«ããšã¯ãç°¡åããšããæå³ã§ã¯ãããŸããã ãããã¯ç°ãªãæŠå¿µã§ãã ãã®ããŒãã§ãRich HickeyïŒClojureã®èè ïŒã¯æåãªã¬ããŒãSimple Made EasyãäœæããŸãã ã ã¹ã©ã€ãã®ç¿»èš³ã¯ Habr ã§å ¬éãããŠããŸãã ã·ã³ãã«ãã¯å®¢èŠ³çãªæŠå¿µã§ãã ãã®è€éãã®æ¬ åŠïŒè€éãïŒãç¹ã蟌ã¿ã®æ¬ åŠãæ··ä¹±ãå°æ°ã®æ¥ç¶ã äžæ¹ããç°¡åãã¯éåžžã«äž»èŠ³çã§ãã èªè»¢è»ã«ä¹ãããšã¯ç°¡åã§ããïŒ ãã§ã¹ã®è©Šåã«åã¡ãŸããïŒ ãã€ãèªã話ã ãã€ãèªã¯ããããŸããããããã¯ããã®èšèªã¯å¿ èŠãªããè€éãããããšèšãçç±ã§ã¯ãããŸããã ããã¯ç§ã«ãšã£ãŠé£ããããšã§ãããããã§ãç§ã¯åã«ãããç¥ããªãããã§ãã
ç§ãã¡ã¯ãã¹ãŠãé¢æ°åŒã³åºã
f(x, y)
åŒã³åºãã«æ £ããŠããŸãã ç§ãã¡ã¯ãOOPã®ãã¬ãŒã ã¯ãŒã¯ã§ã®ããã°ã©ãã³ã°ã«æ £ããŠããŸãã ããã¯åœããåã§ãã ãããå®éãèºã¯å¿ ãããåçŽã§ã¯ãããŸããã ç§ãã¡ã¯ããããã®ã®è€éãã«æ £ãããããç¡èŠãå§ããåœããåã ãšæã£ãŠããŸãã é¢æ°ã®äŸïŒ
(defn select "Returns a set of the elements for which pred is true" {:added "1.0"} [pred xset] (reduce (fn [sk] (if (pred k) s (disj sk))) xset xset))
ããã¯éåžžã«... å¥åŠã«èŠããŸãïŒ èšèªãç¿åŸãããã®æŠå¿µãç¿åŸããŠãèšèªãç°¡åã«ããå¿ èŠããããŸãã ããããåçŽãïŒãŸãã¯è€éãïŒã¯äžå®ã§ãã ããŒã«ããã調ã¹ãã°ãå éšäŸåé¢ä¿ã®æ°ã¯ãšã«ããå€ãããŸããã ç§ãã¡ã«ãšã£ãŠã¯ç°¡åã§ãããããè€éã§ãåçŽã§ããããŸããã
䜿ãæ £ããããŒã«ã䜿çšãããšãããã«æè¯ã®çµæãããã«åŸãããšãã§ããŸãããé·æçã«ã¯ãæãåçŽãªãœãªã¥ãŒã·ã§ã³ãæè¯ã®çµæã瀺ããŸãã
å¯äœçš
ããã°ã©ã ã®é£ããã®åå ã¯äœã§ããïŒ ãããã®1ã€ã¯å¯äœçšã§ãã ããããªãã§ã¯å®å šã«è¡ãããšã¯ã§ããŸããããããŒã«ã©ã€ãºããããšã¯ã§ããŸãã ãããŠãèšèªã¯ããã«åœ¹ç«ã€ã¯ãã§ãã
Clojureã¯é¢æ°åèšèªã§ãããçŽç²ãªé¢æ°ãæžãããšã奚å±ããŠããŸãã ãã®ãããªé¢æ°ã®çµæã¯ãå ¥åãã©ã¡ãŒã¿ãŒã®ã¿ã«äŸåããŸãã ãããŒããã§ãããã®é¢æ°ãåŒã³åºãåã«ãããèµ·åãããšã©ããªããŸããããšé ãæ©ãŸãå¿ èŠã¯ãããŸããã å ¥åãããå Žåã¯ãé±æ«ããããŸãã é¢æ°ãäœåºŠå®è¡ããŠããçµæã¯åãã«ãªããŸãã ããã«ããããã¹ããéåžžã«ç°¡åã«ãªããŸãã åŒã³åºãã®ããŸããŸãªé åºããœãŒãããããæ£ããå€éšç¶æ ãåäœæïŒã·ãã¥ã¬ãŒã·ã§ã³ïŒããå¿ èŠã¯ãããŸããã
çŽç²ãªé¢æ°ã¯åæãç°¡åã§ãæåéããéã³ããã©ã€ãããŒã¿ã§ã®åäœã確èªã§ããŸãã ãããã°ããããã³ãŒãã é¢æ°ã®çµæã¯ä»¥åã«å®è¡ããããã®ã«äŸåããªãããããšã©ãŒãåŒãèµ·ãããã©ã¡ãŒã¿ãŒãæž¡ãã ãã§ãçŽç²ãªé¢æ°ã§ãã€ã§ãåé¡ãåçŸã§ããŸãã çŽç²ãªæ©èœã¯ãå€ãã®äœæ¥ãè¡ãå Žåã§ãéåžžã«ç°¡åã§ãã
ãã¡ãããClojureã¯é«éé¢æ°ããã®æ§æããµããŒãããŠããŸãã
((juxt dec inc) 1) ; => [0 2] ((comp str *) 1 2 3) ; => "6" (map (partial * 10) [1 2 3]) ; => [10 20 30] (map (comp inc inc) [1 2 3]) ; => [3 4 5]
Clojureã¯çŽç²ãªèšèªã§ã¯ãªããé¢æ°ã«ã¯å¯äœçšããããŸãã ããšãã°ã
println
ã¯é¢æ°åŒã³åºããã¢ã¯ã·ã§ã³ã§ãã ãã®ãããªæ©èœã®æ¬è³ªãå€ã®äžçãšã®çžäºäœçšã«ããããšãéèŠã§ãã ãã¡ã€ã«ã«å€ãåºåããã«ã¯ãHTTPãªã¯ãšã¹ããéä¿¡ããSQLãå®è¡ããŸãããããã®ã¢ã¯ã·ã§ã³ã¯ãã¹ãŠãããããäœæããå¯äœçšãšã¯å¥ã«ç¡æå³ã§ãã ãããã£ãŠããã®ãããªæ©èœïŒã¯ãªãŒã³ãšããŒãã£ïŒãåé¢ããããšã¯éåžžã«äŸ¿å©ã§ãã
ãã ãããããïŒããŒãã£é¢æ°ïŒã«ã¯ç¶æ ããããŸããã ãããã¯å€ã®äžçãšã®çžäºäœçšã®æ段ãšããŠã®ã¿æ©èœããŸãã åŸã§èŠãããã«ãClojureã¯éæ¥ãªã³ã¯ã䜿çšããŠããã°ã©ã ã®ç¶æ ãåé¢ããŸãã
å ç«
Clojureã®ãã¹ãŠã®ããŒã¿æ§é ã¯äžå€ã§ãã ãã¯ã¿ãŒèŠçŽ ãå€æŽããæ¹æ³ã¯ãããŸããã ã§ããããšã¯ã1ã€ã®èŠçŽ ãå€æŽãããæ°ãããã¯ãã«ãäœæããããšã ãã§ãã éåžžã«éèŠãªç¹ã¯ãClojureããã¹ãŠã®æšæºçãªåéæäœã«å¯ŸããŠïŒæéãšã¡ã¢ãªã®ç¹ã§ïŒã¢ã«ãŽãªãºã ã®è€éããä¿æããŠããããšã§ãã ãŸããã»ãšãã©ããã¯ãã«ã®OïŒ1ïŒã®ä»£ããã«ãOïŒlog 32 ïŒNïŒïŒããããŸãã å®éã«ã¯ãæ°çŸäžã®èŠçŽ ã®ã³ã¬ã¯ã·ã§ã³ã§ãããlg 32 ïŒNïŒã¯5ãè¶ ããŸããã
ãã®è€éãã¯ã æ°žç¶çãªã³ã¬ã¯ã·ã§ã³ã䜿çšããŠå®çŸãããŸãã æ§é ããå€æŽãããããšãå€ãããŒãžã§ã³ãšæ°ããããŒãžã§ã³ãå éšããŒã¿ã®ã»ãšãã©ãå ±æãããšããèãæ¹ã§ãã åæã«ãå€ãããŒãžã§ã³ã¯å®å šã«æ©èœãç¶ããŸãã ããã«ãæ§é ã®ãã¹ãŠã®ããŒãžã§ã³ã«ã¢ã¯ã»ã¹ã§ããŸãã ããã¯éèŠãªãã€ã³ãã§ãã ãã¡ãããäžèŠãªããŒãžã§ã³ã¯ã¬ããŒãžã³ã¬ã¯ã¿ãŒã«ãã£ãŠåéãããŸãã
(def a [1 2 3 4 5 6 7 8]) ; a -> [1 2 3 4 5 6 7 8] (def b (assoc a 3 999)) ;b -> [1 2 3 999 5 6 7 8]
ããã«äœ¿ããClojureã¯ãåäžãªã³ã¯ãªã¹ãããã¯ãã«ãããã·ã¥ããŒãã«ãèµ€é»æšããµããŒãããŠããŸãã æ°žç¶ãã¥ãŒã®å®è£ ããããŸãïŒã¹ã¿ãã¯ã«ã¯ãªã¹ããŸãã¯ãã¯ã¿ãŒã䜿çšã§ããŸãïŒã ãããŠããã¹ãŠã¯äžå€ã§ãã ããã©ãŒãã³ã¹ãåäžãããããã«ãç¬èªã®ã¬ã³ãŒãã¿ã€ããäœæã§ããŸãã
(defrecord Color [red green blue]) (def a (Color. 0.5 0.6 0.7) ; a => {:red 0.5, :green 0.6, :blue 0.7}
ããã§ã¯ã3ãã£ãŒã«ãæ§é ã宣èšããŸãã Clojureã³ã³ãã€ã©ãŒã¯ã5ã€ã®ãã£ãŒã«ãïŒ2ã€ã®ãè¿œå ãïŒãæã€ãªããžã§ã¯ããäœæããŸãã ã¡ã¿ããŒã¿çšã®1ã€ã®ãã£ãŒã«ãããã®äŸã§ã¯nullã§ãã å®éã®ããŒã¿çšã®3ã€ã®ãã£ãŒã«ãã ãããŠãã1ã€ã®ãã£ãŒã«ã-è¿œå ããŒçšã ããã°ã©ã ã®é床ãäžããããã«ããã£ãŒã«ããæ瀺çã«åæããæ§é äœã宣èšãããšããŠããClojureã¯ããã«å€ãè¿œå ããæ©äŒãæ®ããŠããŸãã
(defrecord Color [red green blue]) (def b (assoc a :alpha 0.1)) ; b => {:alpha 0.1, :red 0.5 :green 0.6, :blue 0.7}
ã¯ããClojureã®ããŒã¿æ§é ã«ã¯ç¹å¥ãªæ§æããããŸãã
; [1 2 3] ; - {:x 1, :y 2} ; #{"a" "b" "c"}
ç¶æ
ãããã£ãŠãçŽç²ãªé¢æ°ããããã¢ããªã±ãŒã·ã§ã³ã®ããžãã¹ããžãã¯ã決å®ããŸãã å€éšã·ã¹ãã ïŒãœã±ãããããŒã¿ããŒã¹ãWebãµãŒããŒïŒã§ã®å¯Ÿè©±ã«äœ¿çšãããããŒãã£é¢æ°ããããŸãã ãããŠãã·ã¹ãã ã®å éšç¶æ ããããéæ¥åç §ãšããŠClojureã«ä¿åãããŸãã
æšæºãªã³ã¯ã«ã¯4ã€ã®ã¿ã€ãããããŸãã
-
var
ã³ã³ããã¹ãããŒã¿ã®èšå®ã«äœ¿çšãããã¹ã¬ããããŒã«ã«å€æ°ã®é¡äŒŒç©ãããŒã¿ããŒã¹ãžã®çŸåšã®æ¥ç¶ãçŸåšã®HTTPèŠæ±ãæ°åŒã®ç²ŸåºŠãã©ã¡ãŒã¿ãŒãªã©ã -
atom
ååã»ã« ãç¶æ ãåæçã«æŽæ°ã§ããŸããã調æŽã¯ã§ããŸãã ã -
agent
-ã¢ã¯ã¿ãŒã®è»œéã¢ããã°ïŒããæå³ã§ã¯ããããã¯å¯Ÿæäœã§ããã以äžã§ããã«è©³ãã説æããŸãïŒãç¶æ ãšã®éåæäœæ¥ã«åœ¹ç«ã¡ãŸãã -
ref
ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã®ã»ã«ãç¶æ ã䜿çšããŠåæããã³èª¿æŽãããäœæ¥ãæäŸããŸãã
ãã¹ãŠã®ã°ããŒãã«å€æ°ã¯
var
ïŒé¢æ°ãå«ãïŒã«ä¿åãããŸãã ãããã£ãŠããããŒã«ã«ãã«åå®çŸ©ã§ããŸãã
(def ^:dynamic *a* 1) (println a) ; => 1 (binding [a 42] (println a)) ; => 42
ããã§ãå€æ°
a
ã¯åçã§
a
å¿ èŠãããããšãã³ã³ãã€ã©ãŒã«ææããŸããã ThreadLocalå ã«ä¿åãããŸãã
ThreadLocal
ã䜿çšãããšããã©ãŒãã³ã¹ããããã«äœäžãããããããã©ã«ãã§ã¯ãã¹ãŠã®
var
ã»ã«ã«é©çšãããããã§ã¯ãããŸããã ãã ããå¿ èŠã«å¿ããŠãäœæåŸã«ä»»æã®
var
åçã«ããããšãã§ããŸãïŒãã¹ãã§ãã䜿çšãããŸãïŒã
ãã¹ãã§ã¯ãé¢æ°å šäœã眮ãæããããšãã§ããŸãã
; , .. (defn some-function-with-side-effect [x] ...) ; (defn another-function [x] ...) (deftest just-a-test ... (binding [some-function-with-side-effect (fn [x] ...)] ; mock- (another-function 123)) ...)
Clojureã®ãã¹ãŠã®ãªã³ã¯ã¯ã
deref
ïŒå€ã®ååŸïŒæäœããµããŒãããŠããŸãã
var
ã»ã«ã®å Žåã次ã®ããã«ãªããŸãã
; #'a (def a 123) (println a) ; => 123 (println #'a) ; => #'user/a (println (deref #'a)) ; => 123
ã»ã«ã¯å€ïŒäžå€ïŒãæ ŒçŽããŸãããããèªäœã¯ç¬ç«ãããšã³ãã£ãã£ã§ãã
deref
é¢æ°ã«ç¹å¥ãªæ§æãå°å ¥
deref
ããŸããïŒã¯ããããã¯ãã ã®ç ç³ã§ãïŒã
atom
ã®äœ¿çšäŸã次ã«ç€ºããŸãã
(let [x (atom 0)] (println @x) ; => 0 (swap! x inc) ; CAS- (println @x)) ; => 1
swap!
æ©èœ
swap!
ã¢ãã ãšãå€åãé¢æ°ãåããŸãã åŸè ã¯ã¢ãã ã®çŸåšã®å€ãååŸããæ°ããå€ãè¿ãå¿ èŠããããŸãã ããã§ã¯ãæ°žç¶çãªããŒã¿æ§é ãéåžžã«äŸ¿å©ã§ãã ããšãã°ã100äžåã®èŠçŽ ã®ãã¯ãã«ãã¢ãã ã«æ ŒçŽã§ããŸããããå€æŽãé¢æ°ã¯CASã«ååãªéãã§å®è¡ãããŸãïŒæ°žç¶ã³ã¬ã¯ã·ã§ã³ã®æäœã®è€éãã¯ãéåžžã®å€æŽå¯èœãªãã®ãšåãã§ããããšãèŠããŠããŸãïŒã ãŸãã¯ãããã·ã¥ããŒãã«ã®ããã€ãã®ãã£ãŒã«ããæŽæ°ã§ããŸãã
(def user (atom {:login "theuser" :email "theuser@example.com"})) (swap! account assoc :phone "12345") ; (swap! account (fn [x] (assoc x :phone "12345")))
é¢æ°ã¯æ°åå®è¡ã§ãããããé¢æ°ãã¯ãªãŒã³ã§ããããšãéèŠã§ãã 次ã®ãããªèšè¿°ã¯ã§ããŸããïŒãã¹ãã§ã¯ãããŸããïŒïŒã
(swap! x (fn [x] (insert-new-record-to-db x) (inc x)))
ãšãŒãžã§ã³ã
ãšãŒãžã§ã³ãã¯ãå¯äœçšã«çŽæ¥é¢ä¿ããç¶æ ããµããŒããã圹å²ãæãããŸãã ã¢ã€ãã¢ã¯ã·ã³ãã«ã§ãã ã»ã«ããããé¢æ°ã®ãã¥ãŒãããã«ãæ¥ç¶ããããŠããŸãã ãã®ã»ã«ã«æ ŒçŽãããŠããå€ã«é¢æ°ã1ã€ãã€é©çšãããé¢æ°ã®çµæãæ°ããå€ã«ãªããŸãã ãã¹ãŠãåå¥ã®ã¹ã¬ããããŒã«ã§éåæçã«èšç®ãããŸãã
(def a (agent 0)) ; (send a inc) (println @a) ; => 1 (send a (fn [x] (Thread/sleep 100) (inc x))) (println @a) ; => 1 ; 100 (println @a) ; => 2
ãšãŒãžã§ã³ãã¯å€ãéåæã«æŽæ°ããŸãã ãã ãããšãŒãžã§ã³ãã®ç¶æ ã¯ãã€ã§ã確èªã§ããŸãã ãšãŒãžã§ã³ãã¯äºãã«ã¡ãã»ãŒãžãéä¿¡ã§ããŸã;éä¿¡ãããšããéä¿¡ãšãŒãžã§ã³ããã¹ããŒã¿ã¹ãæŽæ°ãããŸã§ã¡ãã»ãŒãžã¯é 延ããŸãã ã€ãŸãããããšãŒãžã§ã³ãã§äŸå€ãã¹ããŒãããå Žåãããããéä¿¡ãããã¡ãã»ãŒãžã¯ã©ãã«ãéä¿¡ãããŸããã
(def a (agent 0)) (def b (agent 0)) (send a (fn [x] (send b inc) ; b (throw (Exception. "Error")))) (println @b) ; -> 0,
俳åªã®ã¢ãã«ãšã®ããé¡æšã¯ã ããèªäœã瀺åããŠããŸã ã ãããã¯äŒŒãŠããŸãããæ ¹æ¬çãªéãããããŸãã ãšãŒãžã§ã³ãã®ç¶æ ã¯æ瀺çã§ããããã€ã§ã
deref
ãåŒã³åºããŠãšãŒãžã§ã³ãã®å€ãååŸã§ããŸãã ããã¯ãã¡ãã»ãŒãžãéåä¿¡ããããšã§éæ¥çã«ããç¶æ ãç¥ãããšãã§ããªãã¢ã¯ã¿ãŒã®æŠå¿µãšççŸããŠããŸãã 俳åªã®å Žåã圌ã®ç¶æ ã«ã€ã³ã¿ãã¥ãŒããããšã確信ããããšããã§ããŸãããç§ãã¡ã¯ãå¶ç¶ããããå€ããªãã§ãããã ãã®æå³ã§ããšãŒãžã§ã³ãã¯å®å šã«ä¿¡é Œã§ããŸãããã®ç¶æ ã¯ã
send
ããã³
send-off
é¢æ°ïŒã¡ãã»ãŒãžãåŠçãããã¹ã¬ããããŒã«ã®ã¿ãç°ãªãïŒã§ã®ã¿å€æŽã§ããŸãã
2çªç®ã®éèŠãªéãã¯ããšãŒãžã§ã³ããæ©èœãå€æŽããã³è¿œå ã§ããããšã§ãã ã¢ã¯ã¿ãŒã®åäœãå€æŽããå¯äžã®æ¹æ³ã¯ãã³ãŒããæžãçŽãããšã§ãã ãšãŒãžã§ã³ãã¯åãªããªã³ã¯ã§ãããç¬èªã®åäœã¯ãããŸããã æ°ããé¢æ°ãäœæããŠããšãŒãžã§ã³ããã¥ãŒã«éä¿¡ã§ããŸãã
ã¢ã¯ã¿ãŒã¯ãããã°ã©ã ã®ç¶æ ãããã©ãã©ã«ãããåé¢ãããããããå°ããªéšåã«åå²ããããšããŠããŸãã ã¹ããŒã¿ã¹ã®æŽæ°ããã³èªã¿åãæäœã¯ãã¡ãã»ãŒãžã®éä¿¡ã«ãªããŸãã ããã¯éåžžã«äŸ¿å©ãªå ŽåããããŸãïŒããšãã°ãè€æ°ã®ããŒãã§erlangããã°ã©ã ãå®è¡ããå ŽåïŒã ããããå€ãã®å Žåãããã¯å¿ èŠãããŸããã æã«ã¯ãã®éã§ãã ãããã£ãŠããšãŒãžã§ã³ãã¯ããã£ãã·ã¥ãã»ãã·ã§ã³ãæ°åŠçèšç®ã®äžéçµæãªã©ããããŒéã移åããããã«å¿ èŠãªå€§éã®æ å ±ãä¿åãããšäŸ¿å©ã§ãã
ã¢ã¯ã¿ãŒã«ã€ããŠã¯ã圌ãå¿çã§ããå€ãã®ã¡ãã»ãŒãžãä¿®æ£ããŸãïŒåœŒã¯æ®ãã誀ã£ãŠãããšèããŠããŸãïŒã ã¡ãã»ãŒãžã®é åºãéèŠã§ãããæœåšçã«å¯äœçšãããå¯èœæ§ããããŸãã ããã¯åœŒã®å ¬éå¥çŽã§ãã ãšãŒãžã§ã³ãã®å Žåãä¿åã§ããããŒã¿ããã®æ§é ã®ã¿ãèšé²ããŸãã ãšãŒãžã§ã³ããã¢ã¯ã¿ãŒã眮ãæããããšããŸã£ããè©Šã¿ãŠããªãããšã匷調ããããšã¯éåžžã«éèŠã§ãã ãããã¯ç°ãªãæŠå¿µã§ããããã®ç¯å²ã¯ç°ãªããŸãã
åè¿°ã®ããã«ããšãŒãžã§ã³ãã¯éåæã«åäœããŸãã ã€ãã³ãã®ãã§ãŒã³ïŒãšãŒãžã§ã³ããããšãŒãžã§ã³ããžã®ã¡ãã»ãŒãžã®éä¿¡ïŒãæ§ç¯ã§ããŸãã ãããããšãŒãžã§ã³ãã®å©ãã ãã§ã¯ãããã°ã©ã ã®ç¶æ ã調æŽãããæ¹æ³ã§å€æŽããããšã¯ã§ããŸããã
STM
ãœãããŠã§ã¢ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã¯ãClojureã®äž»èŠãªæ©èœã®1ã€ã§ãã MVCCã«ãã£ãŠå®è£ ãããŸãã ãããŠããã«äŸïŒ
(def account1 (ref 100) (def account2 (ref 0)) (dosync (alter account1 - 30) (alter account2 + 30))
1ã€ã®å€ãå¢ãããåæã«å¥ã®å€ãæžãããŸãã äœãåé¡ãçºçããå ŽåïŒäŸå€ïŒããã©ã³ã¶ã¯ã·ã§ã³å šäœããã£ã³ã»ã«ãããŸãã
(println @account1) ; => 70 (println @account2) ; => 30 (dosync (alter account1 * 0) (alter account2 / 0)) ; => ArithmeticException ; (println @account1) ; => 70 (println @account2) ; => 30
éåžžã®ACIDãšéåžžã«äŒŒãŠããŸãããèä¹ æ§ããããŸããã ãã©ã³ã¶ã¯ã·ã§ã³ãå ¥åãããšããã¹ãŠã®ãªã³ã¯ãããªãŒãºããŠããããã«èŠãããããã®å€ã¯ãã©ã³ã¶ã¯ã·ã§ã³å šäœã®æéäžåºå®ãããŸãã ãªã³ã¯ã®èªã¿åã/æžã蟌ã¿æã«ããã®å€ãæ¢ã«å€æŽãããŠããïŒä»ã®ãã©ã³ã¶ã¯ã·ã§ã³ãå®äºããç§ãã¡ã®ç掻ãå°ç¡ãã«ããŠããïŒããšãå€æããå ŽåãçŸåšã®ãã©ã³ã¶ã¯ã·ã§ã³ãåéãããŸãã ãããã£ãŠããã©ã³ã¶ã¯ã·ã§ã³å ã§ã®å¯äœçšïŒå ¥åºåãã¢ãã ã®æäœïŒã¯ãããŸããã ãããŠãããã§ãšãŒãžã§ã³ãã圹ã«ç«ã¡ãŸãã
(def a (ref 0)) (def b (ref 0)) (def out-agent (agent nil)) (dosync (println "transaction") (alter a inc) ; (let [a-value @a b-value @b] (send-off out-agent (fn [_] (println "a" a-value "b" b-value)))) (alter b dec)) ;
ãšãŒãžã§ã³ããžã®ãã¹ãŠã®ã¡ãã»ãŒãžã¯ããã©ã³ã¶ã¯ã·ã§ã³ãå®äºããç¬éã«åŸããŸãã ãã®äŸã§ã¯ããªã³ã¯
a
ãš
b
å€æŽ
a
ãšãã©ã³ã¶ã¯ã·ã§ã³ãåéãããå Žåããããããã©ã³ã¶ã¯ã·ã§ã³ããšããåèªãæ°åå°å·ã§ããŸãã ãã ãããšãŒãžã§ã³ãå ã®ã³ãŒãã¯ããã©ã³ã¶ã¯ã·ã§ã³ãå®äºããåŸã«äžåºŠã ãå®è¡ãããŸãã
ããŸããŸãªãã©ã³ã¶ã¯ã·ã§ã³ãäºãã«å¹²æžããªãããã«ãClojureã®ãªã³ã¯ã¯å€ã®å±¥æŽãä¿æããŸãã ããã©ã«ãã§ã¯ãããã¯æåŸã®å€ã®ã¿ã§ããã競åãçºçãããšïŒ1ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ã®æžã蟌ã¿ãšä»ã®èªã¿åãïŒãç¹å®ã®ãªã³ã¯ã«å¯ŸããŠãä¿åãããå±¥æŽã®ãµã€ãºã1ã€ïŒæ倧5ã€ã®å€ïŒå¢å ããŸãã å ±éã®æ§é èŠçŽ ãå ±æãããªã³ã¯ã«æ°žç¶æ§é ãä¿åããããšãå¿ããªãã§ãã ããã ãããã£ãŠããã®ãããªã¹ããŒãªãŒãClojureã«ä¿åããããšã¯ãã¡ã¢ãªæ¶è²»ã®èŠ³ç¹ããéåžžã«å®äŸ¡ã§ãã
STMãã©ã³ã¶ã¯ã·ã§ã³ã¯ãã³ãŒããå€æŽãããšãã«æ°ã«ããŸããã çŸåšã®ãã©ã³ã¶ã¯ã·ã§ã³ã§1ã€ãŸãã¯å¥ã®ãªã³ã¯ã䜿çšã§ãããã©ãããåæããå¿ èŠã¯ãããŸããã ãããã¯ãã¹ãŠå©çšå¯èœã§ãããæ¢åã®ã³ãŒãã«å®å šã«ééçã«æ°ãããªã³ã¯ãè¿œå ã§ããŸãã ãªã³ã¯ã¯çžäºã«äœçšããŸããã ããšãã°ãéåžžã®ããã¯ã䜿çšããå Žåããããããã¯ãçºçããªãããã«ããã¯/ããã¯è§£é€ã®é åºãç£èŠããå¿ èŠããããŸãã
åæã¢ã¯ã»ã¹ã§ã¯ã ReadWriteLockã䜿çšããã®ãšåãããã«ããªãŒããŒãã©ã³ã¶ã¯ã·ã§ã³ã¯äºãã«ãããã¯ããŸããã ããã«ããã©ã³ã¶ã¯ã·ã§ã³ã©ã€ã¿ãŒã¯ãªãŒããŒããããã¯ããŸããïŒ ãªã³ã¯ãå€æŽãããã©ã³ã¶ã¯ã·ã§ã³ãçŸåšå®è¡ãããŠããå Žåã§ãããããã¯ããã«å€ãååŸã§ããŸãã
ãšãŒãžã§ã³ããšSTMãªã³ã¯ã¯äºãã«è£å®ããŸãã åè ã¯èª¿æŽãããç¶æ ã®å€åã«ã¯é©ããŠããŸããããåŸè ã¯å¯äœçšãæ±ãããšã¯ã§ããŸããã ãããããããã®å ±å䜿çšã«ããããå€å žçãªãããŒã«ïŒãã¥ãŒããã¯ã¹ãã»ããã©ãªã©ïŒã䜿çšããããããããã°ã©ã ãããéæã§åçŽïŒè€éã§ã¯ãªãïŒã«ãªããŸãã
ã¡ã¿ããã°ã©ãã³ã°
çŸåšãå€ãã®èšèªã«äœããã®ã¡ã¿ããã°ã©ãã³ã°ããŒã«ããããŸãã ãããã¯ãJavaçšã®AspectJ ãGroovyçšã®ASTå€æãPythonçšã®ãã³ã¬ãŒã¿ãŒãšã¡ã¿ã¯ã©ã¹ãããŸããŸãªãªãã¬ã¯ã·ã§ã³ã§ãã
Clojureã¯ãLispãã¡ããªãŒã®ã¡ã³ããŒãšããŠããããã®ç®çã§ãã¯ãã䜿çšããŸãã圌ãã®å©ããåããŠãèšèªèªäœã䜿ã£ãŠèšèªãããã°ã©ã ïŒæ¡åŒµïŒã§ããŸãããã¯ãã¯ãéåžžã®ãé¢æ°ã§ãããå¯äžã®éãã¯ããã°ã©ã ã®ã³ã³ãã€ã«äžã«å®è¡ãããããšã§ãããŸã ã³ã³ãã€ã«ãããã³ãŒãã¯ãã¯ãå ¥åã«æž¡ãããŸããããã¯ãã®å®è¡çµæã¯ãã³ã³ãã€ã©ãæ¢ã«ã³ã³ãã€ã«ããæ°ããã³ãŒãã§ãã
(defmacro unless [pred ab] `(if (not ~pred) ~a ~b)) (unless (> 1 10) (println "1 > 10. ok") (println "1 < 10. wat"))
ç¬èªã®å¶åŸ¡æ§é ïŒéããŒãžã§ã³
if
ïŒãäœæããŸãããããªããããå¿ èŠãããã®ã¯ãé¢æ°ãæžãããšã§ãïŒ
ãã¯ãã¯Clojureã§åºã䜿çšãããŠããŸãããšããã§ãèšèªã«çµã¿èŸŒãŸããŠããæŒç®åã®å€ãã¯ãå®éã«ã¯ãã¯ãã§ããããšãã°ã以äžã¯å®è£
or
ã§ãã
(defmacro or ([] nil) ([x] x) ([x & next] `(let [or# ~x] (if or# or# (or ~@next)))))
ã§ã
defn
ãã ãã¯ãã«å±é
def
ããŠ
fn
ãã¡ãªã¿ã«ãæ§é åããã¯ãã䜿çšããŠå®è£ ãããŸãã
(let [[ab] [1 2]] (+ ab)) ; - ... (let* [vec__123 [1 2] a (clojure.core/nth vec__123 0 nil) b (clojure.core/nth vec__123 1 nil)] (+ ab))
æè¿ãtry-with-resourcesã Javaã«ç»å ŽããŸãããåæã«ãJavaã®ç¬¬7ããŒãžã§ã³ãç»å Žããã®ãã»ãã®æ°å¹ŽåŸ ã¡ãŸãããClojureã®å Žåã¯ãæ°è¡æžãã ãã§ãã
(defmacro with-open [[vr] & body] `(let [~r ~v] (try ~@body (finally (.close ~v)))))
ä»ã®èšèªã§ã¯ãç¶æ³ã¯è¯ããªããŸãããããã§ãçæ³ããã¯ã»ã©é ãã§ããéèŠãªããšã¯ãèšèªã«ç¹å®ã®æ§é ãååšããããšã§ã¯ãªããç¬èªã®æ§é ãè¿œå ããèœåã§ãããããã£ãŠãããšãã°ãClojureã®ãã¿ãŒã³ãããã³ã°ãåå¥ã®ãã©ã°ã€ã³ã©ã€ãã©ãªãšããŠå®è£ ãããŠããããšã¯é©ãããšã§ã¯ãããŸããããã®ãããªãã®ãèšèªã®ã³ã¢ã«å«ããå¿ èŠã¯ãŸã£ãããããŸããããããããã¯ãã®åœ¢ã§å®è£ ããæ¹ãã¯ããã«äŸ¿å©ã§ããç¶æ³ã¯ãã¢ããã®ãµããŒããè«çããã°ã©ãã³ã°ãé«åºŠãªãšã©ãŒåŠçãããã³ãã®ä»ã®èšèªæ¡åŒµãšåæ§ã§ãããªãã·ã§ã³ã®éçåä»ãããããŸãïŒ
DSLãäœæããããšã®å©äŸ¿æ§ã«èšåãããããããŸããã Clojureã«ã¯ãããããããŸãããããšHTMLçæããã³HTTP-èŠæ±ã®ã«ãŒãã£ã³ã°ãšã¯ã§åäœãããªã¬ãŒã·ã§ãã« ããŒã¿ããŒã¹ã® ããŒã¿ãåã³ã§ã®äœæ¥ãã€ããªãããã³ã«ãšæ€èšŒããŒã¿ïŒãã®å Žåã¯ãããªããåæ¢ããéã«ç¥ã£ãŠããå¿ èŠããããŸããïŒ...ç°¡åãã€å¹æçã«äœæããŸãã
ClojureïŒãã¹ãŠã®Lispã©ã€ã¯ãªèšèªãšåæ§ïŒã«ã¯éåžžã«éèŠãªæ©èœããããŸã-ããã¯åçš®ãŠããŒã¯ã§ããèšãæãããšãããã°ã©ã ã®ãœãŒã¹ã³ãŒãçšã«å¥ã®ãã¬ãŒã³ããŒã·ã§ã³ãäœæããå¿ èŠã¯ãããŸãããäœåãªãã¬ãŒã³ããŒã·ã§ã³ãäœæããå¿ èŠã¯ãããŸãããããã€ãã®è¿œå ã®ASTããªãŒã®åœ¢ã§ã®æœè±¡åã®ã¬ãã«ãããã°ã©ã ã¯ãã®ããªãŒã§ããããã«ããã®ããªãŒã¯ç¹å¥ãªæ§é ã§ã¯ãªããéåžžã®ãªã¹ãããã¯ãã«ãããã³ã·ã³ãã«ã§ãããããŠãéåžžã®ããŒã¿ãšåãæ¹æ³ã§ããã°ã©ã ãæäœã§ããŸãã
(defn do2 [x] (list 'do xx)) (do2 '(println 1)) ; => '(do (println 1) (println 1)) ; ; => (list 'do (list 'println 1) (list 'println 1))
Clojureã®ãã¯ãã¯ããã®åã®ãã¹ãŠã«ã€ããŠãããã°ã©ã ã®å¯èªæ§ãæãªããŸããïŒãã¡ãããé©åºŠã«äœ¿çšããå Žåãé€ããŸãïŒãçµå±ã®ãšããããã¯ãã¯åãªãé¢æ°ã§ãããçŸåšã®ã³ã³ããã¹ãã§ã©ã®é¢æ°ã䜿çšããããåžžã«äžæã«æ±ºå®ã§ããŸããããšãã°ãã³ãŒããèŠããšã
(dosomething [ab] c)
ååã®åŸãã«é ããŠãããã®ãèŠã€ããã®ã¯ç°¡å
dosomething
ã§ãããã¡ã€ã«ã®å é ïŒä»ã®ã¢ãžã¥ãŒã«ãã€ã³ããŒããããŠããå ŽæïŒãèŠãã ãã§ããããããã¯ãã®å Žåããã®ã»ãã³ãã£ã¯ã¹ã¯äžå®ã§ãããããç¥ãããŠããŸãããã®ã³ãŒããç解ããã®ã«é«åºŠãªIDEã¯å¿ èŠãããŸããããã¡ãããé«åºŠãªéçºç°å¢ã§ã¯ãã¯ããé©åã«ãå±éãããããšãã§ããŸããããã«ãããã³ã³ãã€ã©ãŒãããã°ã©ã ãã©ã®ããã«å€ãããã確èªã§ããŸãã
å€å
Clojureã«ã¯ãããªã¢ãŒãã£ãã¯é¢æ°ãäœæããããã®2ã€ã®ã¡ã«ããºã ããããŸããåœåããã®èšèªã¯åŒ·åãªããŒã«ã§ãããã«ãã¡ãœããã®ã¿ããµããŒãããŠããŸããããã»ãšãã©ã®å Žåã¯éå°ã§ãããããŒãžã§ã³1.2ïŒããã³ããŒãžã§ã³1.5.1ãçŸåšé¢é£ïŒãããæ°ããæŠå¿µãèšèªã«è¿œå ãããŸãã-ãããã³ã«ã
ãããã³ã«ã¯Javaã€ã³ã¿ãŒãã§ãŒã¹ã«äŒŒãŠããŸãããäºãã«ç¶æ¿ããããšã¯ã§ããŸãããåãããã³ã«ã«ã¯ãäžé£ã®æ©èœãèšè¿°ãããŠããŸãã
(defprotocol IShowable (show [this])) ; ... (map show [1 2 3])
ããã«ããããããã³ã«èªäœãšé¢æ°ã®2ã€ã®ãšã³ãã£ãã£ã宣èšããŸã
show
ãããã¯éåžžã®Clojureé¢æ°ã§ãåŒã³åºããããšãæåã®åŒæ°ã®åã«åºã¥ããŠæãé©åãªå®è£ ãæ€çŽ¢ããŸããå¥éãå¿ èŠãªããŒã¿æ§é ã宣èšãããããã«ãããã³ã«ã®å®è£ ã瀺ããŸãã
(defrecord Color [red green blue] IShowable (show [this] (str "<R" (:red this) " G" (:green this) " B" (:blue this))))
ãµãŒãããŒãã£ã¿ã€ãã®ãããã³ã«ãå®è£ ã§ããŸãïŒãã«ãã€ã³ã§ãã£ãŠãïŒã
(extend-protocol IShowable String (show [this] (str "string " this)) clojure.lang.IPersistentVector (show [this] (str "vector " this)) Object (show [this] "WAT")) (show "123") ; => "string 123" (show [1 2 3]) ; => "vector [1 2 3]" (show '(1 2 3)) ; => "WAT"
ãœãŒã¹ã³ãŒãã«ã¢ã¯ã»ã¹ã§ããªãå Žåã§ããæ¢åã®ã¿ã€ãã«ãããã³ã«å®è£ ãè¿œå ã§ããŸãããã€ãã³ãŒããŸãã¯åæ§ã®ããªãã¯ã«ããéæ³ã®æäœã¯ãããŸããã Clojureã¯ã°ããŒãã«ããŒãã«ãäœæããŸã
->
ããããã³ã«ã¡ãœãããåŒã³åºããããšãéå±€ãèæ ®ããŠããã®ããŒãã«ã§æåã®åŒæ°ã®ã¿ã€ãã«ãã£ãŠæ€çŽ¢ãããŸãããããã£ãŠããããã³ã«ã®æ°ããå®è£ ã®å®£èšã¯ãã°ããŒãã«ããŒãã«ã®æŽæ°ã«åž°çããŸãã
ãã ãããããã³ã«ã§ã¯äžååãªå ŽåããããŸããããšãã°ãäºéã¹ã±ãžã¥ãŒãªã³ã°ã®å Žåããã®å ŽåïŒã ãã§ãªãïŒããã«ãã¡ãœããã䟿å©ã«ãªããŸããããã«ãã¡ãœããã宣èšãããšããç¹å¥ãªãµã€ãé¢æ°ãã£ã¹ãããã£ãŒãæå®ããŸãããã£ã¹ãããã£ãŒã¯ããã«ãã¡ãœãããšåãåŒæ°ãåãåããŸããæçµå®è£ ã®æ€çŽ¢ã¯ããã£ã¹ãããã£ã«ãã£ãŠè¿ãããå€ã«ãã£ãŠæ¢ã«å®è¡ãããŠããŸããã¿ã€ããããŒã¯ãŒãããŸãã¯ãã¯ãã«ãæå®ã§ããŸãããã¯ãã«ã®å Žåãããã€ãã®å€ã䜿çšããŠæé©ãªå®è£ ãæ€çŽ¢ããŸãã
(defmulti convert (fn [obj target-type] [(class obj) target-type])) (defmethod convert [String Integer] [x _] (Integer/parseInt x)) (defmethod convert [String Long] [x _] (Long/parseLong x)) (defmethod convert [Object String] [x _] (.toString x)) (defmethod convert [java.util.List String] [x _] (str "V" (vec x))) (convert "123" Integer) ; -> 123 (convert "123" Long) ; -> 123 (convert 123 String) ; -> "123" (convert [1 2 3] String) ; -> "V[1 2 3]"
ããã§ãæåã®åŒæ°ã®åãš2çªç®ã®åŒæ°ã®å€ïŒããã¯ã¯ã©ã¹ã§ãªããã°ãªããŸããïŒã«åºã¥ããŠå®è£ ãéžæãããæœè±¡é¢æ°ãçºè¡šããŸããããã¡ãããClojureã¯é©åãªå®è£ ãæ¢ãéã«åéå±€ãèæ ®ããŸããã¿ã€ãã¯äœ¿ããããã§ãããéå±€ã¯å³å¯ã«åºå®ãããŠããŸãããã ããããŒã¯ãŒãããç¬èªã®ã¢ãããã¯éå±€ãäœæã§ããŸãã
; "-" (derive ::rect ::shape) (derive ::square ::rect) (derive ::circle ::shape) (derive ::triangle ::shape) (defmulti perimeter :type) ; , :type ~ (fn [x] (:type x)) (defmethod perimeter ::rect [x] (* 2 (+ (:hx) (:wx)))) (defmethod perimeter ::triangle [x] (reduce + ((juxt :a :b :c) x))) (defmethod perimeter ::circle [x] (* 2 Math/PI (:rx))) (perimeter {:type ::rect, :h 10, :w 3}) ; -> 26 (perimeter {:type ::square, :h 10, :w 10}) ; -> 40 (perimeter {:type ::triangle, :a 3, :b 4, :c 5}) ; -> 12 (perimeter {:type ::shape}) ; -> throws IllegalArgumentException
è€æ°ã®éå±€ã宣èšã§ããŸããåãšåæ§ã«ãè€æ°ã®å€ãäžåºŠã«ãã£ã¹ãããã§ããŸãïŒãã¯ã¿ãŒïŒãç¬èªã®éå±€ãå®çŸ©ããå ŽåãããŒã¯ãŒããšJavaã¿ã€ããæ··åšãããããšãã§ããŸãïŒ
(derive java.util.Map ::collection) (derive java.util.Collection ::collection) (derive ::tag .java.lang.Iterable) ; -> ClassCastException
ããŒã¯ãŒãããåããç¶æ¿ãã§ããŸãïŒéãåæ§ã§ãïŒãããã¯ãæ¡åŒµãå¯èœãªã¯ã©ã¹ã°ã«ãŒããäœæããã®ã«äŸ¿å©ã§ãã
ãã«ãã¡ãœããã·ã¹ãã ã¯ã·ã³ãã«ã§ãããéåžžã«åŒ·åã§ããéåžžãæ¥åžžçãªããŒãºã«ã¯ãããã³ã«ã®æ©èœã§ååã§ãããè€éãªéæšæºã®ç¶æ³ã§ã¯ãã«ãã¡ãœãããåªãããœãªã¥ãŒã·ã§ã³ã«ãªããŸãã
åžžè
èšèªã¯ãã€ã³ãã©ã¹ãã©ã¯ãã£ãªãã§ã¯æå³ããããŸãããã³ãã¥ããã£ãã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ãããŸããŸãªãŠãŒãã£ãªãã£ã®ã»ãããªãã Clojureã®åŒ·ã¿ã®1ã€ã¯ãJVMãã©ãããã©ãŒã ã®äœ¿çšã§ãã Javaãšã®çµ±åïŒåæ¹åïŒã¯éåžžã«ç°¡åã§ãã Javaã«ã¯èšå€§ãªæ°ã®ã©ã€ãã©ãªãååšããããšã¯ç§å¯ã§ã¯ãããŸããïŒãã®å質ã«ã€ããŠã¯èª¬æããŸããïŒããããã¯ãã¹ãŠClojureããçŽæ¥äœ¿çšã§ããŸãããã ãããã€ãã£ãã©ã€ãã©ãªã®æ°ã¯éåžžã«å€ãïŒåžžã«å¢å ããŠããŸãïŒããŸããEclipseãšIDEAã®
ãã©ã°ã€ã³ã¯æŽ»çºã«éçºãããŠããŸãããããžã§ã¯ããæ§ç¯ããããã«ãã³ãã¥ããã£å šäœã§äœ¿çšãããŠããã©ã€ã³ãã³ã°ãŠãŒãã£ãªãã£ã¯ãé·ãéäºå®äžã®æšæºã§ãããäœæããããã®ããŸããŸãªãã¬ãŒã ã¯ãŒã¯ããããŸã WEBã¢ããªã±ãŒã·ã§ã³ãšéåæãµãŒããŒïŒ äžå€ã®
ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒãéçºãããŠããŸãïŒJBoss AS7ã®ã©ãããŒïŒã Immutantã¯ããªã³ã°ïŒClojureã®HTTPã¹ã¿ãã¯ïŒãéåæã¡ãã»ãŒãžãåæ£ãã£ãã·ã¥ãã¹ã±ãžã¥ãŒã«ãããã¿ã¹ã¯ãåæ£ãã©ã³ã¶ã¯ã·ã§ã³ãã¯ã©ã¹ã¿ãªã³ã°ãªã©ãæäœããããã®ã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãã Immutantã®å±éãšæ§æã¯éåžžã«ç°¡åã§ãã
Clojureã«ã¯ã.Net CLRã®äžã®ããŒããªã©ã®ä»£æ¿å®è£ ããããŸããããããçå®ã¯èšãããŸããClojureScriptã¯æã泚ç®ã«å€ãããJavaScriptçšã®ããŒãããã¡ããããã«ãã¹ã¬ããããŒã«ã¯ãããŸããããã®ããããã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªãšãšãŒãžã§ã³ãããããŸãããã ããæ°žç¶æ§é ããã¯ãããããã³ã«ããã«ãã¡ãœãããªã©ãä»ã®ãã¹ãŠã®èšèªæ©èœã䜿çšã§ããŸãããŸããClojureScriptãšJavaScriptã®çµ±åã¯ãClojureãšJavaã®çµ±åãšåããããåªããŠãããåçŽã§ãïŒå Žæã«ãã£ãŠã¯ããã«åªããŠããŸãïŒã
次ã¯ïŒ
ãããŠããã¹ãŠãç°¡åã§ããããŒã«ããããŸããåŽåè ãä¿¡é Œã§ãããç¹å¹è¬ã§ã¯ãããŸããããååãªæ±çšæ§ããããŸããã·ã³ãã«ãã¯ããããªãã¯ãããç¿åŸããããã«ããã€ãã®æéãè²»ããå¿ èŠããããããããŸãããå€ãã¯çãããŠå¥åŠã«èŠãããããããŸãããããããããã¯ç¿æ £ã®åé¡ã«ãããŸãããèšèªã®å šäœã®çŸããã¯ãåã ã®èŠçŽ ãåäžã®å šäœã«ç¹çŽ°ã«çµåããŠãããšããææ©æ§ã«ããããšã«ããã«æ°ä»ãã§ãããã
Clojureãç¥ãããšã¯äŸ¡å€ããããŸããééããªãã ãã®ããŒã«ãäœããã®çç±ã§ããªãã«åããªãå Žåã§ããããã«çµã¿èŸŒãŸããŠããã¢ã€ãã¢ã¯éåžžã«æçšã§ããããšã蚌æãããŸãã