Slide 1

Slide 1 text

OCamlでJavaScriptが幸せ

Slide 2

Slide 2 text

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

Slide 3

Slide 3 text

Lisp知ってますか? (defun fact (n) (if (= n 0) 1 (* n (fact (- n 1))) ) ) (format t "~A" (fact 42))

Slide 4

Slide 4 text

Lisp = (型無し)λ + macro

Slide 5

Slide 5 text

Lisp = JavaScript + macro

Slide 6

Slide 6 text

λ ≒ 値としての函數 (を表はす記法) let callback = (err, data) => { if (err) { throw err; } console.log(data); }; fs.readSync(ʻmomongaʼ, ʻutf8ʼ, callback);

Slide 7

Slide 7 text

型無しλには型が無い

Slide 8

Slide 8 text

型? 型 = 値の分類

Slide 9

Slide 9 text

型? 命題P(x) : xは美味しい 「美味しいもの」は型Pを持つ。

Slide 10

Slide 10 text

型? 型が在り、型の演算が出來れば、 計算を検証出來る。

Slide 11

Slide 11 text

命題f : 美味しいものは今⽇の⼣⾷になる 命題g : トマトは美味しい ⇒ 命題h : トマトは今⽇の⼣⾷になる

Slide 12

Slide 12 text

型P : 美味しいもの 型Q : 今⽇の⼣⾷ 型R : トマト 函數f : P→Q 函數g : R→P ⇒ f・g = 函數h : R→Qが作れる

Slide 13

Slide 13 text

Lisp + 型 → ML

Slide 14

Slide 14 text

Lisp + 型 + OOP → OCaml

Slide 15

Slide 15 text

OCaml 正格な型の割りと純粋な函數型⾔語 ⾦融系や原發その他で實績が在る

Slide 16

Slide 16 text

JavaScript 型は餘んまり無い 第⼀級函數 モジュールでプログラムを區 切る ちょっとしたOOP 正格 & 先⾏評價 mutable (時々immutable) OCaml (実⾏時には)型は餘んまり無い 第⼀級函數 モジュールでプログラムを區切 る ちょっとしたOOP 正格 & 先⾏評價 immutable (時々mutable)

Slide 17

Slide 17 text

JavaScript 型は餘んまり無い 第⼀級函數 モジュールでプログラムを區 切る ちょっとしたOOP 正格 & 先⾏評價 mutable (時々immutable) OCaml (実⾏時には)型は餘んまり無い 第⼀級函數 モジュールでプログラムを區切 る ちょっとしたOOP 正格 & 先⾏評價 immutable (時々mutable)

Slide 18

Slide 18 text

JavaScript 型は餘んまり無い 第⼀級函數 モジュールでプログラムを區 切る ちょっとしたOOP 正格 & 先⾏評價 mutable (時々immutable) OCaml (実⾏時には)型は餘んまり無い 第⼀級函數 モジュールでプログラムを區切 る ちょっとしたOOP 正格 & 先⾏評價 immutable (時々mutable) /| ヘ /|/ | N /i/´ ゙ ̄ ̄``ヾ)_ ∧ / V .| , Nヾ ゙ ゙ヽ |\/ ∨l/ レ‘ 7N゙、 ゙i _|` JS /N゙ゞ .! ヽ O だ 7ゞミミ、 ノ,彡イハヾ、 i Z C っ Zー-r-==、’リノ_ノ_,.ヾミ,.ィ,ニi ヽ a た / {i `゙‘;l={゙´石ゞ}=’´゙‘r_/ 〈 m ん |: `iー’/ ヾ、__,.ノ /i´ / l だ i、 ! ゙ニ-=、 u / ,ト, ∠_ は よ |` ヽ、I‘、_丿 /// ヽ /_ !! | _,.ィヘヽ二 ィ'_/ / ゙i\|/Wlヘ |' ̄/ i ヽ_./´ ./ .| `\ ∨\ wヘ /\|/ /ィ´ ゙̄i / ir=、 l'i"ヽ、 ∨ ∠__,,..-イ i /\_,イ,=-、 i 、,.ゞ、 | ゙'"ヽ \ ! .i-'´ ,i | ./`゙'i' /i_.!._,..ヽ<! ゙i、゙i. =゙! \ ! | .,i゙::|/ .| ,/::/-i ゙i ゙i 三゙i ゙i | /⌒ i/ .| ,i゙:::i' | ,/ ::/= .|三. ゙i/.| .| .| .ij:. .l〉 | ,i゙ :::| .!' ::::i゙'i ト. ゙i | _,.. V =,! ! | ,i゙ ::::| / ::::::| l= ヾ!.._ ヽ」 "´;i :.:i ./ . | .| .,i ::::::| ,/::::::::::| ヾ:.:. ヾ::" ゙ // │ | ,i::::::::| ,/ .::::::::: | ゙i.:.:.:.:.:、:.:.:.:.:.:.:.:.:.:/,ィ'"´ .| | i::::::::,イ::::::::::::::::| /ト、;:;:;:;:;:;:;:;:;:;::,ノi|Y

Slide 19

Slide 19 text

bloomberg/BuckleScript

Slide 20

Slide 20 text

*.ml → [BuckleScript] → *.js

Slide 21

Slide 21 text

let f x y = x + y function f(x, y) { return x + y | 0; }

Slide 22

Slide 22 text

class c = object (self) val p = 19 method f v = v * p end let i = new c;; Js.log (i#f 3) function c_init($$class) { var ids = CamlinternalOO.new_methods_variables($$class, shared, ["p"]); var f = ids[0]; var p = ids[1]; CamlinternalOO.set_method($$class, f, function (self$neg1, v) { return Caml_int32.imul(v, self$neg1[p]); }); return function (_, self) { var self$1 = CamlinternalOO.create_object_opt(self, $$class); self$1[p] = 19; return self$1; }; } var c = CamlinternalOO.make_class(shared, c_init); var i = Curry._1(c[0], 0); console.log(Curry.js2(102, 1, i, 3));

Slide 23

Slide 23 text

facebook/Reason

Slide 24

Slide 24 text

Reason type component = {displayName: string}; let module Sibling = { let createElement (children: list component) => {displayName: "t Sibling"}; }; let module Momonga = { let createElement a::a=? b::b=? children => {displayName: "t Momonga "}; }; let div argument1::argument1=? children => { displayName: "test”; }; Js.log
; ;

Slide 25

Slide 25 text

Reason ≒ OCaml + JSX

Slide 26

Slide 26 text

*.re → [Reason] → AST → [BuckleScript] → *.js

Slide 27

Slide 27 text

OCaml v.s. TypeScript TypeScript < OCaml ∴ OCaml

Slide 28

Slide 28 text

OCaml v.s. Flow Flow < OCaml ∴ OCaml

Slide 29

Slide 29 text

OCaml v.s. Haxe Haxe ≠ OCaml = JavaScript ∴ OCaml

Slide 30

Slide 30 text

OCaml v.s. Haste Haste = Haskell ≠ JavaScript ∴ OCaml

Slide 31

Slide 31 text

OCaml v.s. Elm Elm ≒ OCaml + FRP Elm ≠ JavaScript ∴ OCaml

Slide 32

Slide 32 text

OCamlで幸せ