Slide 1

Slide 1 text

ࣗ࡞ݴޠਐḿ 2020 Mar @todesking

Slide 2

Slide 2 text

લճ • Q: ࠓ·ͰԿΛ? • A: ৸ͯ·ͨ͠…… • ࠷ۙى͖ͨͷͰ։ൃΛ࠶։ͨ͠

Slide 3

Slide 3 text

֓ཁ • JVMͰಈ͘ίϯύΠϥݴޠΛ࡞͍ͬͯ·͢ • MLܥؔ਺ܕݴޠ • https://github.com/todesking/ojaml/

Slide 4

Slide 4 text

Ͱ͖Δ͜ͱ module A { let add x y = x + y ;; let x = add 1 2 ;; let add1 = add 1 ;; let y = add1 10 ;; let app f x = f x ;; let z = app (fun x => x + 1) 1 ;; let num_to_str n: int = java.lang.Integer##toString(n) ;; } ؔ਺ఆٛͱݺͼग़͠ ෦෼ద༻ Javaϝιουݺͼग़͠ ߴ֊ؔ਺

Slide 5

Slide 5 text

Ͱ͖Δ͜ͱ module A { let s = if x == y then "eq" else "neq" let f x = let tmp = x + 1 in x * tmp ;; let x = let rec f x = g x g x = f x in f 0 ;; } ੍ޚߏจ ϩʔΧϧม਺ ࠶ؼ

Slide 6

Slide 6 text

Ͱ͖Δ͜ͱ module A { let id x = x ;; // id: [?1] ?1 -> ?1 data Option a = Some a | None ;; let get_or_else o x = match o | Some a => a | None => x ;; let option_value = Some 1 ;; let value = get_or_else option_value 100 ;; } ύϥϝʔλଟ૬ ܕਪ࿦ ଟ૬ͳ୅਺తσʔλܕ ύλʔϯϚον

Slide 7

Slide 7 text

ίϯύΠϥͷߏ੒ Source Raw AST Named AST Typed AST JAST Parser Namer Typer Javalizer • Parser: ιʔείʔυ͔ΒAST΁ͷม׵ • Namer: Ϋϥε໊΍ม਺໊ͷղܾ • Typer: ܕ෇͚ • Javalizer: JavaόΠτίʔυʹ͍ۙதؒදݱʹม׵ • Emitter: ΫϥεϑΝΠϧͷग़ྗ .class Emitter

Slide 8

Slide 8 text

ΫϥεϑΝΠϧ΁ͷม׵ • ιʔείʔυΛίϯύΠϧͯ͠.classϑΝΠϧͱͯ͠ग़ྗ ͍ͯ͠Δ • Ϟδϡʔϧ(ScaleͰݴ͏object૬౰)͕JavaͷΫϥεʹରԠ • letͰఆٛ͞Εͨม਺͸staticϑΟʔϧυͱͳΔ • ม਺ͷ஋͸static initializerͰॳظԽ͞ΕΔ module A { let n = 10 ;; } class A { static int n; static { A.n = 10; } }

Slide 9

Slide 9 text

ΫϥεϑΝΠϧ΁ͷม׵ • ؔ਺͸ΦϒδΣΫτͱͯ͠දݱ͞ΕΔ • ͢΂ͯͷؔ਺͸1Ҿ਺ module A { let f x = x + 1 ;; } class A { static Fun f; static { A.f = new A$0(); } } class A$0 extends Fun { override def app(x: Object) = (int)x + 1; }

Slide 10

Slide 10 text

ΫϥεϑΝΠϧ΁ͷม׵ • ෳ਺Ҿ਺ؔ਺͸ؔ਺Λฦؔ͢਺Ͱදݱ͞ΕΔ • ؔ਺ΦϒδΣΫτ͸֎ଆͷؔ਺΁ͷࢀরΛ௨ͯ͡Ҿ਺ʹΞ ΫηεͰ͖Δ fun x y = x + y class A$0 extends Fun { def app(x: Object) = return new A$1( local=x, parent=this) } class A$1 extends Fun { def app(arg: Object) = { val x = (int)parent.local; val y = (int)arg; x + y } }

Slide 11

Slide 11 text

ΫϥεϑΝΠϧ΁ͷม׵ • ࠶ؼతࢀরΛ࣮ݱ͢ΔͨΊɺࣄલʹՄม഑ྻΛڞ༗͓ͯ͠ ͍ͯޙ͔ΒࢀরΛઃఆ let rec f x = g x g x = f x in f val env = Array[Object](null, null) val f = A$0(env, null) val g = A$1(env, null) env(0) = f env(1) = g return f // f.local(0) == f, f.local(1) == g

Slide 12

Slide 12 text

ΫϥεϑΝΠϧ΁ͷม׵ • ୅਺తσʔλܕ͸Ϋϥε֊૚ͱͯ͠දݱ data Option a = Some a | None abstract class Option extends Data class Option$Some(val v0: Object) extends Option class Option$None() extends Option

Slide 13

Slide 13 text

ΫϥεϑΝΠϧ΁ͷม׵ • ୅਺తσʔλܕͷύλʔϯϚον͸νΣοΫؔ਺+஋ͷऔ Γग़ؔ͠਺Ͱ࣮ݱ match value | Some a => a | None => x if(some_check(value)) return some_get0(value) else if(none_check(value)) return x def some_check(value) = value.isInstanceOf[Option$Some] def some_get0(value) = value.asInstanceOf[Option$Some] .v0

Slide 14

Slide 14 text

ࠓޙͷ༧ఆ • ܕΫϥε͕΄͍͠ • ηϧϑϗεςΟϯάʹ޲͚ͯ৭ʑ΍͍͖͍ͬͯͨͰ͢Ͷ