Upgrade to Pro — share decks privately, control downloads, hide ads and more …

OCamlでJavaScriptが幸せ

 OCamlでJavaScriptが幸せ

BuckleScript + Reason

さっちゃん

December 08, 2016
Tweet

More Decks by さっちゃん

Other Decks in Programming

Transcript

  1. Lisp知ってますか? (defun fact (n) (if (= n 0) 1 (*

    n (fact (- n 1))) ) ) (format t "~A" (fact 42))
  2. λ ≒ 値としての函數 (を表はす記法) let callback = (err, data) =>

    { if (err) { throw err; } console.log(data); }; fs.readSync(ʻmomongaʼ, ʻutf8ʼ, callback);
  3. 型P : 美味しいもの 型Q : 今⽇の⼣⾷ 型R : トマト 函數f

    : P→Q 函數g : R→P ⇒ f・g = 函數h : R→Qが作れる
  4. JavaScript 型は餘んまり無い 第⼀級函數 モジュールでプログラムを區 切る ちょっとしたOOP 正格 & 先⾏評價 mutable

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

    (時々immutable) OCaml (実⾏時には)型は餘んまり無い 第⼀級函數 モジュールでプログラムを區切 る ちょっとしたOOP 正格 & 先⾏評價 immutable (時々mutable)
  6. 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
  7. let f x y = x + y function f(x,

    y) { return x + y | 0; }
  8. 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));
  9. 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 <Sibling> <Momonga a=10 b=0 /> <Momonga a=10 b=0 /> <div argument1=1 />; </Sibling>;