Slide 1

Slide 1 text

͜͜࠷ۙͷ ɹ$MPKVSF4DSJQU OJTIJTIJOKVDMPKVSFPO !BUIPT

Slide 2

Slide 2 text

ࣗݾ঺հ ‣ 5XJUUFS!BUIPT ‣ χϟϯύεגࣜձࣾॴଐ ‣ $MPKVSFίϯτϦϏϡʔλ

Slide 3

Slide 3 text

͜͜࠷ۙͷ$MPKVSF$MPKVSF4DSJQU ‣ $MPKVSFք۾͸͕ϦϦʔε͞Εͣɺ͋·Γେ͖ͳ ಈ͖͕ͳ͍ ‣ ҰํͰɺ$MPKVSF4DSJQUͷपล͸Ί·͙Δ͘͠มԽ ͍ͯ͠Δ ‣ ࠓճ͸ͦͷͳ͔Ͱɺൺֱతʹେ͖ͦ͏ͩͱݸਓతʹ ࢥ͏΋ͷΛϐοΫΞοϓͯ͠঺հ

Slide 4

Slide 4 text

$MPKVSF4DSJQUͷେ͖ͳมԽ ‣ .BDSP*OGFSFODF ‣ &YUFSOT*OGFSFODF ‣ +4Ϟδϡʔϧαϙʔτ BMQIB ‣ ηϧϑϗετ$MPKVSF4DSJQUπʔϧଓʑొ৔

Slide 5

Slide 5 text

.BDSP*OGFSFODF ‣ $MPKVSF4DSJQUͰ͸ϚΫϩΛ$MPKVSFͰॻ͘ ‣ ͜Ε·Ͱ͸ϓϩάϥϚ͕ʮͲͷࣝผࢠ͕ϚΫϩ͔ʯ Λ໌ࣔతʹίϯύΠϥʹڭ͑ͯ΍Δඞཁ͕͋ͬͨ ‣ .BDSPJOGFSFODFʹΑΓɺίϯύΠϥ͕উखʹ Ͳͷࣝผࢠ͕ϚΫϩ͔Λࣝผͯ͘͠ΕΔΑ͏ʹ

Slide 6

Slide 6 text

(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.cljs bar/core.cljs

Slide 7

Slide 7 text

(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.cljs bar/core.cljs ϚΫϩͷ৔߹

Slide 8

Slide 8 text

(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.cljs bar/core.cljs ϚΫϩͷ৔߹ ͦΕҎ֎ͷ৔߹

Slide 9

Slide 9 text

(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.cljs bar/core.cljs

Slide 10

Slide 10 text

(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.cljs bar/core.cljs

Slide 11

Slide 11 text

(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-macros foo.core) (defn subtract [a b] (- a b)) foo/core.clj foo/core.cljs bar/core.cljs

Slide 12

Slide 12 text

(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-macros foo.core) (defn subtract [a b] (- a b)) foo/core.clj foo/core.cljs bar/core.cljs

Slide 13

Slide 13 text

&YUFSOT*OGFSFODF ‣ $MPKVSF4DSJQUίϯύΠϥ͸಺෦Ͱ(PPHMF$MPTVSF $PNQJMFS +4ˠ+4ͷ࠷దԽίϯύΠϥ Λ࢖͏ ‣ $MPTVSF$PNQJMFS͸࠷దԽΦϓγϣϯʹΑͬͯ͸ϑΟʔ ϧυ໊΍ϝιου໊Λ͔ͳΓΞάϨογϒʹϦωʔϜ͢Δ ‣ ֎෦ϥΠϒϥϦΛ࢖͏৔߹౳ɺ$MPTVSF$PNQJMFS͕஌Β ͳ໊͍લ͕ଘࡏ͢Δͱίʔυ͕յΕΔ৔߹΋ ‣ &YUFSOT*OGFSFODFʹΑΓܕώϯτΛ͚ͭΔ͚ͩͰ໊લ ΛղܾͰ͖ΔΑ͏ʹͳͬͨ

Slide 14

Slide 14 text

$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

Slide 15

Slide 15 text

$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

Slide 16

Slide 16 text

$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

Slide 17

Slide 17 text

$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

Slide 18

Slide 18 text

$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

Slide 19

Slide 19 text

$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 ίϯύΠϧޙJavaScript function Foo(bar, baz) { this.bar = bar; this.baz = baz; } JavaScript

Slide 20

Slide 20 text

$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 ίϯύΠϧޙJavaScript function Foo(bar, baz) { this.bar = bar; this.baz = baz; } JavaScript

Slide 21

Slide 21 text

ϦωʔϜ໰୊ͷճආࡦ ‣ FYUFSOTϑΝΠϧΛ࡞Δ $MPTVSF$PNQJMFSʹ֎෦ϥΠϒϥϦͷɹɹɹɹɹɹɹɹɹɹ ໊લΛڭ͑Δํ๏ ‣ DMKTKTϥΠϒϥϦΛ࢖͏ FYUFSOTϑΝΠϧΛόϯυϧͨ͠+4ϥΠϒϥϦ ‣ ഑ྻͷΠϯσΫγϯάͰ໊લʹΞΫηε agetasetΛ࢖͏ $MPTVSF$PNQJMFSͷϦωʔϜͰจࣈྻ͸มߋ͞Εͳ͍͜ͱΛ ར༻ var Foo = { ”bar” = {}, ”baz" = {} } externs.js

Slide 22

Slide 22 text

&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))) ClojureScript var Foo; Foo.prototype.bar; Foo.prototype.bar; inferred-externs.js ࣗಈੜ੒ʂ

Slide 23

Slide 23 text

+4Ϟδϡʔϧαϙʔτ BMQIB ‣ +4ʹ͸Ϟδϡʔϧͷఆٛํ๏͕͍ͭ͘΋͋Δ $PNNPO+4 ".% &$."4DSJQU ʜ ‣ $MPKVSF4DSJQUඪ४Ͱ͸$MPTVSF-JCSBSZϞδϡʔϧ ͔͠ѻ͑ͳ͔ͬͨ ‣ ίϯύΠϥΦϓγϣϯͰϞδϡʔϧλΠϓΛࢦఆ͢Δ ͜ͱͰͦΕҎ֎ͷϞδϡʔϧΛ࢖͑ΔΑ͏ʹ :foreign-libs [{:file "resources/libs/calculator.js" :provides ["calculator"] :module-type :commonjs}]

Slide 24

Slide 24 text

ηϧϑϗετ$MPKVSF4DSJQUπʔϧଓʑొ৔ ‣ $MPKVSF4DSJQU͕ࣗ෼ࣗ਎ΛίϯύΠϧ ηϧϑϗεςΟϯά ɹ Ͱ͖ΔΑ͏ʹͳͬͨ͜ͱʹΑΓɺ$MPKVSFʹґଘ͠ͳ͍ॲཧܥ ͕ग़͖͍ͯͯΔ ‣ ࣮ߦʹ+7.͕ඞཁͳ͍ͷͰىಈ͕࣌ؒ୹͘ɺεΫϦϓτ࣮ߦ ౳ͷ༻్ʹ޲͘΋ͷ΋͋Δ ‣ ॲཧܥͷྫ 1MBODL$MPKVSF4DSJQUPO+BWB4DSJQU$PSF -VNP$MPKVSF4DSJQUPO/PEFKT DBMWJO-VNP্Ͱಈ͘$MPKVSF4DSJQU༻Ϗϧυπʔϧ

Slide 25

Slide 25 text

͕࣌ؒ͋Ε͹ -VNPʹ͍ͭͯܰ͘σϞ

Slide 26

Slide 26 text

-VNPͷಛ௃ ‣ OQNͰαΫοͱΠϯετʔϧͰ͖Δ ‣ ىಈ͕ૣ͍ ‣ ୯ମͰ$MPKVSF4DSJQUͷϏϧυ͕Ͱ͖Δ

Slide 27

Slide 27 text

·ͱΊ ‣ $MPKVSF4DSJQUͷ$MPKVSF΍+4ʹର͢Δ਌࿨ੑ͸ɹ ·͢·͢ߴ·͍ͬͯΔ ‣ ҰํͰɺηϧϑϗεςΟϯάʹΑΓ$MPKVSF4DSJQU ୯ମͰΤίγεςϜΛங͚ΔՄೳੑ·Ͱݟ͖͑ͯͨ ‣ $MPKVSF$MPKVSF4DSJQU ʴ+4 ͷ૊Έ߹Θͤํ͸ɹ ࠓޙ͞Βʹଟ༷Խ͍͖ͯͦ͠͏ͳงғؾ

Slide 28

Slide 28 text

ࢀߟ ‣ $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ͷϏϧυͷղઆهࣄ

Slide 29

Slide 29 text

ࢀߟ ‣ 1MBODL IUUQTHJUIVCDPNNpLFTQMBODL ‣ -VNP IUUQTHJUIVCDPNBONPOUFJSPMVNP ‣ DBMWJO IUUQTHJUIVCDPNFHJOF[DBMWJO