2017/03/14に開催されたnishi-shinju-clojure #1の発表資料です。
͜͜࠷ۙͷɹ$MPKVSF4DSJQUOJTIJTIJOKVDMPKVSFPO!BUIPT
View Slide
ࣗݾհ‣ 5XJUUFS!BUIPT‣ χϟϯύεגࣜձࣾॴଐ‣ $MPKVSFίϯτϦϏϡʔλ
͜͜࠷ۙͷ$MPKVSF$MPKVSF4DSJQU‣ $MPKVSFք۾͕ϦϦʔε͞Εͣɺ͋·Γେ͖ͳಈ͖͕ͳ͍‣ ҰํͰɺ$MPKVSF4DSJQUͷपลΊ·͙Δ͘͠มԽ͍ͯ͠Δ‣ ࠓճͦͷͳ͔Ͱɺൺֱతʹେ͖ͦ͏ͩͱݸਓతʹࢥ͏ͷΛϐοΫΞοϓͯ͠հ
$MPKVSF4DSJQUͷେ͖ͳมԽ‣ .BDSP*OGFSFODF‣ &YUFSOT*OGFSFODF‣ +4Ϟδϡʔϧαϙʔτ BMQIB‣ ηϧϑϗετ$MPKVSF4DSJQUπʔϧଓʑొ
.BDSP*OGFSFODF‣ $MPKVSF4DSJQUͰϚΫϩΛ$MPKVSFͰॻ͘‣ ͜Ε·ͰϓϩάϥϚ͕ʮͲͷࣝผࢠ͕ϚΫϩ͔ʯΛ໌ࣔతʹίϯύΠϥʹڭ͑ͯΔඞཁ͕͋ͬͨ‣ .BDSPJOGFSFODFʹΑΓɺίϯύΠϥ͕উखʹͲͷࣝผࢠ͕ϚΫϩ͔Λࣝผͯ͘͠ΕΔΑ͏ʹ
(ns bar.core(:require-macros [foo.core :refer [add]])(:require [foo.core :refer [subtract]]))(add 2 3)(subtract 7 4)͜Ε·Ͱͷίʔυ‣ ϚΫϩ͔Ͳ͏͔Ͱ:require:require-macrosΛ͍͚Δඞཁ͋Γ‣ bar.coreΛDMKDʹ͢Δ߹ʹSFBEFSDPOEJUJPOBM͕ඞཁ(ns foo.core)(defmacro add [a b]`(+ ~a ~b))(ns foo.core)(defn subtract [a b](- a b))foo/core.clj foo/core.cljsbar/core.cljs
(ns bar.core(:require-macros [foo.core :refer [add]])(:require [foo.core :refer [subtract]]))(add 2 3)(subtract 7 4)͜Ε·Ͱͷίʔυ‣ ϚΫϩ͔Ͳ͏͔Ͱ:require:require-macrosΛ͍͚Δඞཁ͋Γ‣ bar.coreΛDMKDʹ͢Δ߹ʹSFBEFSDPOEJUJPOBM͕ඞཁ(ns foo.core)(defmacro add [a b]`(+ ~a ~b))(ns foo.core)(defn subtract [a b](- a b))foo/core.clj foo/core.cljsbar/core.cljsϚΫϩͷ߹
(ns bar.core(:require-macros [foo.core :refer [add]])(:require [foo.core :refer [subtract]]))(add 2 3)(subtract 7 4)͜Ε·Ͱͷίʔυ‣ ϚΫϩ͔Ͳ͏͔Ͱ:require:require-macrosΛ͍͚Δඞཁ͋Γ‣ bar.coreΛDMKDʹ͢Δ߹ʹSFBEFSDPOEJUJPOBM͕ඞཁ(ns foo.core)(defmacro add [a b]`(+ ~a ~b))(ns foo.core)(defn subtract [a b](- a b))foo/core.clj foo/core.cljsbar/core.cljsϚΫϩͷ߹ͦΕҎ֎ͷ߹
(ns bar.core(:require [foo.core :refer [subtract]:refer-macros [add]]))(add 2 3)(subtract 7 4)͜Ε·Ͱͷίʔυ‣ :refer-macrosΛͬͯ:requireΛͭʹ·ͱΊΔͱଟগ͖ͬ͢Γ‣ Կ͕ϚΫϩ͔ΛϓϩάϥϚ͕ҙ͢Δඞཁ·ͩ͋Δ(ns foo.core)(defmacro add [a b]`(+ ~a ~b))(ns foo.core)(defn subtract [a b](- a b))foo/core.clj foo/core.cljsbar/core.cljs
(ns bar.core(:require [foo.core :as foo:include-macros true]))(foo/add 2 3)(foo/subtract 7 4)͜Ε·Ͱͷίʔυ‣ :include-macrosΛ͑Կ͕ϚΫϩ͔Λؾʹ͢Δඞཁͳ͘ͳΔ‣ bar.coreΛDMKDʹ͢Δ߹ʹSFBEFSDPOEJUJPOBM͕ඞཁ(ns foo.core)(defmacro add [a b]`(+ ~a ~b))(ns foo.core)(defn subtract [a b](- a b))foo/core.clj foo/core.cljsbar/core.cljs
(ns bar.core(:require [foo.core :refer [add subtract]]))(add 2 3)(subtract 7 4)͜Ε͔Β͜͏ॻ͚ΔϚΫϩΛఆٛ͢Δ໊લۭؒଆͰҰ͓ͯ͘͠ͱɺԿ͕ϚΫϩ͔ίϯύΠϥͰࣗಈతʹผͯ͘͠ΕΔΑ͏ʹ(ns foo.core)(defmacro add [a b]`(+ ~a ~b))(ns foo.core(:require-macrosfoo.core)(defn subtract [a b](- a b))foo/core.clj foo/core.cljsbar/core.cljs
&YUFSOT*OGFSFODF‣ $MPKVSF4DSJQUίϯύΠϥ෦Ͱ(PPHMF$MPTVSF$PNQJMFS +4ˠ+4ͷ࠷దԽίϯύΠϥΛ͏‣ $MPTVSF$PNQJMFS࠷దԽΦϓγϣϯʹΑͬͯϑΟʔϧυ໊ϝιου໊Λ͔ͳΓΞάϨογϒʹϦωʔϜ͢Δ‣ ֎෦ϥΠϒϥϦΛ͏߹ɺ$MPTVSF$PNQJMFS͕Βͳ໊͍લ͕ଘࡏ͢Δͱίʔυ͕յΕΔ߹‣ &YUFSOT*OGFSFODFʹΑΓܕώϯτΛ͚ͭΔ͚ͩͰ໊લΛղܾͰ͖ΔΑ͏ʹͳͬͨ
$MPTVSF$PNQJMFSͷϦωʔϜίʔυΛNJOJGZ͢ΔࡍɺίϯύΠϥ͕߹ੑΛอͬͨ··ϑΟʔϧυ໊ɾϝιου໊ΛϦωʔϜ(deftype Foo [bar baz])(defn make-foo [bar baz](Foo. bar baz))(defn area [foo](* (.-bar foo)(.-baz foo)))function He(a,b) {return {this.xb=a;this.yb=b;}}…function Je(a,b) {return a.xb*b.yb}ClojureScriptίϯύΠϧޙJavaScript
$MPTVSF$PNQJMFSͷϦωʔϜ+4ϥΠϒϥϦΛ͏߹ίϯύΠϥ͕Βͳ໊͍લΛࢀরͨ͠߹ʹϦωʔϜͰ߹ੑ͕ͱΕͣΤϥʔʹͳΔ͜ͱ(defn make-foo [bar baz](js/Foo. bar baz))(defn area [foo](* (.-bar foo)(.-baz foo)))function Ne(a,b) {return new Foo(a,b)}…function Oe(a,b) {return a.Nb*b.Ob}ClojureScriptίϯύΠϧޙJavaScriptfunction Foo(bar, baz) {this.bar = bar;this.baz = baz;}JavaScript
ϦωʔϜͷճආࡦ‣ FYUFSOTϑΝΠϧΛ࡞Δ $MPTVSF$PNQJMFSʹ֎෦ϥΠϒϥϦͷɹɹɹɹɹɹɹɹɹɹ໊લΛڭ͑Δํ๏‣ DMKTKTϥΠϒϥϦΛ͏ FYUFSOTϑΝΠϧΛόϯυϧͨ͠+4ϥΠϒϥϦ‣ ྻͷΠϯσΫγϯάͰ໊લʹΞΫηε agetasetΛ͏ $MPTVSF$PNQJMFSͷϦωʔϜͰจࣈྻมߋ͞Εͳ͍͜ͱΛར༻var Foo = {”bar” = {},”baz" = {}}externs.js
&YUFSOT*OGFSFODF‣ &YUFSOTJOGFSFODFΛ͑ɺίϯύΠϥ͕FYUFSOTϑΝΠϧΛࣗಈੜͯ͘͠ΕΔ‣ ϦωʔϜ͕ʹͳΔՕॴʹܕώϯτΛ͚ͭΔ(set! *warn-on-infer* true)(defn make-foo [bar baz](js/Foo. bar baz))(defn area [^js/Foo foo](* (.-bar foo)(.-baz foo)))ClojureScriptvar Foo;Foo.prototype.bar;Foo.prototype.bar;inferred-externs.jsࣗಈੜʂ
+4Ϟδϡʔϧαϙʔτ BMQIB‣ +4ʹϞδϡʔϧͷఆٛํ๏͕͍ͭ͋͘Δ $PNNPO+4 ".% &$."4DSJQU ʜ‣ $MPKVSF4DSJQUඪ४Ͱ$MPTVSF-JCSBSZϞδϡʔϧ͔͠ѻ͑ͳ͔ͬͨ‣ ίϯύΠϥΦϓγϣϯͰϞδϡʔϧλΠϓΛࢦఆ͢Δ͜ͱͰͦΕҎ֎ͷϞδϡʔϧΛ͑ΔΑ͏ʹ:foreign-libs [{:file "resources/libs/calculator.js":provides ["calculator"]:module-type :commonjs}]
ηϧϑϗετ$MPKVSF4DSJQUπʔϧଓʑొ‣ $MPKVSF4DSJQU͕ࣗࣗΛίϯύΠϧ ηϧϑϗεςΟϯάɹͰ͖ΔΑ͏ʹͳͬͨ͜ͱʹΑΓɺ$MPKVSFʹґଘ͠ͳ͍ॲཧܥ͕ग़͖͍ͯͯΔ‣ ࣮ߦʹ+7.͕ඞཁͳ͍ͷͰىಈ͕࣌ؒ͘ɺεΫϦϓτ࣮ߦͷ༻్ʹ͘ͷ͋Δ‣ ॲཧܥͷྫ 1MBODL$MPKVSF4DSJQUPO+BWB4DSJQU$PSF -VNP$MPKVSF4DSJQUPO/PEFKT DBMWJO-VNP্Ͱಈ͘$MPKVSF4DSJQU༻Ϗϧυπʔϧ
͕࣌ؒ͋Ε-VNPʹ͍ͭͯܰ͘σϞ
-VNPͷಛ‣ OQNͰαΫοͱΠϯετʔϧͰ͖Δ‣ ىಈ͕ૣ͍‣ ୯ମͰ$MPKVSF4DSJQUͷϏϧυ͕Ͱ͖Δ
·ͱΊ‣ $MPKVSF4DSJQUͷ$MPKVSF+4ʹର͢Δੑɹ·͢·͢ߴ·͍ͬͯΔ‣ ҰํͰɺηϧϑϗεςΟϯάʹΑΓ$MPKVSF4DSJQU୯ମͰΤίγεςϜΛங͚ΔՄೳੑ·Ͱݟ͖͑ͯͨ‣ $MPKVSF$MPKVSF4DSJQU ʴ+4ͷΈ߹Θͤํɹࠓޙ͞Βʹଟ༷Խ͍͖ͯͦ͠͏ͳงғؾ
ࢀߟ‣ $MPKVSF4DSJQU.BDSP4VHBS IUUQCMPHpLFTGBSNDPNQPTUTDMPKVSFTDSJQUNBDSPTVHBSIUNM .JLF'JLFT 1MBODL։ൃऀʹΑΔNBDSPJOGFSFODFͷղઆهࣄ‣ &YUFSOT*OGFSFODF IUUQTHJTUHJUIVCDPNTXBOOPEFUUFGDDDDGDEBGD %BWJE/PMFOʹΑΔղઆهࣄ‣ +BWB4DSJQU.PEVMF4VQQPSU "MQIB IUUQTHJUIVCDPNDMPKVSFDMPKVSFTDSJQUXJLJ+BWB4DSJQU.PEVMF4VQQPSU "MQIB ެࣜXJLJϖʔδ‣ $PNQJMJOH$MPKVSF4DSJQU1SPKFDUT8JUIPVUUIF+7. IUUQTBONPOUFJSPDPNDPNQJMJOHDMPKVSFTDSJQUQSPKFDUTXJUIPVUUIFKWN "OUÓOJP/.POUFJSP -VNP։ൃऀʹΑΔ+7.ͳ͠Ͱͷ$MPKVSF4DSJQUͷϏϧυͷղઆهࣄ
ࢀߟ‣ 1MBODL IUUQTHJUIVCDPNNpLFTQMBODL‣ -VNP IUUQTHJUIVCDPNBONPOUFJSPMVNP‣ DBMWJO IUUQTHJUIVCDPNFHJOF[DBMWJO