SlideShare a Scribd company logo
OCamlでJavaScriptが幸せ
.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)
Lisp知ってますか?
(defun fact (n)
(if (= n 0)
1
(* n (fact (- n 1))) ) )
(format t "~A" (fact 42))
Lisp
= (型無し)λ + macro
Lisp
= JavaScript + macro
λ ≒ 値としての函數 (を表はす記法)
let callback = (err, data) => {
if (err) { throw err; }
console.log(data);
};
fs.readSync(ʻmomongaʼ, ʻutf8ʼ, callback);
型無しλには型が無い
型?
型 = 値の分類
型?
命題P(x) : xは美味しい
「美味しいもの」は型Pを持つ。
型?
型が在り、型の演算が出來れば、
計算を検証出來る。
命題f : 美味しいものは今⽇の 🍛⼣⾷になる
命題g : 🍅トマトは美味しい
⇒ 命題h : 🍅トマトは今⽇の 🍛⼣⾷になる
型P : 美味しいもの
型Q : 今⽇の 🍛⼣⾷
型R : 🍅トマト
函數f : P→Q
函數g : R→P
⇒ f・g = 函數h : R→Qが作れる
Lisp + 型 → ML
Lisp + 型 + OOP → OCaml
OCaml
正格な型の割りと純粋な函數型⾔語
⾦融系や原發その他で實績が在る
JavaScript
型は餘んまり無い
第⼀級函數
モジュールでプログラムを區
切る
ちょっとしたOOP
正格 & 先⾏評價
mutable (時々immutable)
OCaml
(実⾏時には)型は餘んまり無い
第⼀級函數
モジュールでプログラムを區切
る
ちょっとしたOOP
正格 & 先⾏評價
immutable (時々mutable)
JavaScript
型は餘んまり無い
第⼀級函數
モジュールでプログラムを區
切る
ちょっとしたOOP
正格 & 先⾏評價
mutable (時々immutable)
OCaml
(実⾏時には)型は餘んまり無い
第⼀級函數
モジュールでプログラムを區切
る
ちょっとしたOOP
正格 & 先⾏評價
immutable (時々mutable)
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
bloomberg/BuckleScript
*.ml
→ [BuckleScript] → *.js
let f x y = x + y
function f(x, y) {
return x + y | 0;
}
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));
facebook/Reason
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>;
Reason
≒ OCaml + JSX
*.re
→ [Reason] → AST
→ [BuckleScript] → *.js
OCaml v.s. TypeScript
TypeScript < OCaml
∴ OCaml
OCaml v.s. Flow
Flow < OCaml
∴ OCaml
OCaml v.s. Haxe
Haxe ≠ OCaml = JavaScript
∴ OCaml
OCaml v.s. Haste
Haste = Haskell ≠ JavaScript
∴ OCaml
OCaml v.s. Elm
Elm ≒ OCaml + FRP
Elm ≠ JavaScript
∴ OCaml
OCamlで幸せ

More Related Content

ODP
20130608 git-2
PDF
)の品格
PDF
mrubyのfiberを試してみた
PDF
private-values
PDF
哲學を學ぶ為に一冊目に何を讀むべきか?
PDF
Crystalで殺せ
PDF
Modular Macros for OCaml
PDF
Serverless
20130608 git-2
)の品格
mrubyのfiberを試してみた
private-values
哲學を學ぶ為に一冊目に何を讀むべきか?
Crystalで殺せ
Modular Macros for OCaml
Serverless

Viewers also liked (8)

PDF
Serverless Frameworkを本番環境に投入するために
PDF
OCamlによるプロダクト開発
PDF
関数型プログラミング入門 with OCaml
PDF
J言語を讃えた
PDF
O caml2014 leroy-slides
PPTX
4K Checkerboard in Battlefield 1 and Mass Effect Andromeda
PDF
Railway Oriented Programming
PDF
最速で最速のRuby擴張を作る
Serverless Frameworkを本番環境に投入するために
OCamlによるプロダクト開発
関数型プログラミング入門 with OCaml
J言語を讃えた
O caml2014 leroy-slides
4K Checkerboard in Battlefield 1 and Mass Effect Andromeda
Railway Oriented Programming
最速で最速のRuby擴張を作る
Ad

More from Sachirou Inoue (20)

PDF
Elixir on Containers
PDF
發言の超越論的な根拠
PDF
faastCrystal
PDF
人工言語作成を樂しむ者の爲の言語學
PDF
人工言語を作るゆるやかな道
PDF
FaaStRuby
PDF
DI is for us?
PDF
How to make a spaghetti
PDF
Why we update our oss dependencies.
PDF
Test like a team.
PDF
Phoenix at scale
PDF
Vivaldi #cd3437
PDF
外傷的Elixir
PDF
勝手に作ったものたち
PDF
PDF
ActiveHash
PDF
boilerplate react
PDF
ElixirでNode.jsを倒す
PDF
大勢でピンポンできるのは、だれ?
PPTX
フレームワークを求めるな。ECMAScriptを使へ。
Elixir on Containers
發言の超越論的な根拠
faastCrystal
人工言語作成を樂しむ者の爲の言語學
人工言語を作るゆるやかな道
FaaStRuby
DI is for us?
How to make a spaghetti
Why we update our oss dependencies.
Test like a team.
Phoenix at scale
Vivaldi #cd3437
外傷的Elixir
勝手に作ったものたち
ActiveHash
boilerplate react
ElixirでNode.jsを倒す
大勢でピンポンできるのは、だれ?
フレームワークを求めるな。ECMAScriptを使へ。
Ad

OCamlでJavaScriptが幸せ