Slide 1

Slide 1 text

$SZTUBM %BWZ NF!EBWZUX $SZTUBM5BJXBO6TFST(SPVQ IUUQT/$6POF2H

Slide 2

Slide 2 text

3VCZ

Slide 3

Slide 3 text

3VCZ š 5IPSPVHIMZPCKFDUPSJFOUFEXJUIJOIFSJUBODF NJYJOT BOENFUBDMBTTFT š %ZOBNJDUZQJOHBOEEVDLUZQJOH š &WFSZUIJOHJTBOFYQSFTTJPO FWFOTUBUFNFOUT BOEFWFSZUIJOHJTFYFDVUFEJNQFSBUJWFMZ FWFO EFDMBSBUJPOT  š %ZOBNJDSFGMFDUJPOBOEBMUFSBUJPOPGPCKFDUTUPGBDJMJUBUFNFUBQSPHSBNNJOH š -FYJDBMDMPTVSFT JUFSBUPSTBOEHFOFSBUPST XJUIBVOJRVFCMPDLTZOUBY š (BSCBHFDPMMFDUJPO š $VTUPNEJTQBUDICFIBWJPS UISPVHImethod_missing BOEconst_missing  š 4USJDUCPPMFBO DPFSDJPOSVMFT FWFSZUIJOHJTUSVFFYDFQUfalse BOEnil 

Slide 4

Slide 4 text

3VCZ say = "I love Ruby" puts say #=> I love Ruby say['love'] = "*love*" puts say.upcase #=> I *LOVE* RUBY # "I *love* Ruby" in five times 5.times { puts say }

Slide 5

Slide 5 text

(SBEVBM5ZQJOH š "UZQFTZTUFNBMMPXTQBSUTPGBQSPHSBNUPCFEZOBNJDBMMZUZQFEBOEPUIFSQBSUTUPCF TUBUJDBMMZUZQFE š 5IFQSPHSBNNFSDPOUSPMTXIJDIQBSUTBSFXIJDICZFJUIFSMFBWJOHPVUUZQFBOOPUBUJPOT PSCZBEEJOHUIFNJO IUUQXQIPNFTTPJDJOEJBOBFEVKTJFLXIBUJTHSBEVBMUZQJOH

Slide 6

Slide 6 text

(SBEVBM5ZQJOH def add1(x): return x + 1 class A(object): pass a = A() add1(a) IUUQXQIPNFTTPJDJOEJBOBFEVKTJFLXIBUJTHSBEVBMUZQJOH

Slide 7

Slide 7 text

def add1(x): return x + 1 class A(object): pass a = A() add1(a) # TypeError: unsupported operand type(s) for +: 'A' and ‘int' # (Interpreter) (SBEVBM5ZQJOH IUUQXQIPNFTTPJDJOEJBOBFEVKTJFLXIBUJTHSBEVBMUZQJOH

Slide 8

Slide 8 text

(SBEVBM5ZQJOH class A { int add1(int x) { return x + 1; } public static void main(String args[]) { A a = new A(); add1(a); } } IUUQXQIPNFTTPJDJOEJBOBFEVKTJFLXIBUJTHSBEVBMUZQJOH

Slide 9

Slide 9 text

(SBEVBM5ZQJOH class A { int add1(int x) { return x + 1; } public static void main(String args[]) { A a = new A(); add1(a); } } IUUQXQIPNFTTPJDJOEJBOBFEVKTJFLXIBUJTHSBEVBMUZQJOH # add1(int) in A cannot be applied to (A) add1(a); # (Compiler)

Slide 10

Slide 10 text

(SBEVBM5ZQJOH class A { int add1(int x) { return x + 1; } public static void main(String args[]) { A a = new A(); if (false) add1(a); } } IUUQXQIPNFTTPJDJOEJBOBFEVKTJFLXIBUJTHSBEVBMUZQJOH

Slide 11

Slide 11 text

(SBEVBM5ZQJOH class A { int add1(int x) { return x + 1; } public static void main(String args[]) { A a = new A(); if (false) add1(a); } } IUUQXQIPNFTTPJDJOEJBOBFEVKTJFLXIBUJTHSBEVBMUZQJOH # add1(int) in A cannot be applied to (A) add1(a);

Slide 12

Slide 12 text

(SBEVBM5ZQJOH ü 4UBUJDUZQFDIFDLJOHDBUDIFTCVHTFBSMJFS UIFSFCZSFNPWJOHUIFHSFBUFSDPTUPGGJYJOH CVHTMBUFSJOUIFEFWFMPQNFOUDZDMFPSUIFFWFOHSFBUFSDPTUPGBCVHUIBUPDDVSTJOUIF GJFME ü %ZOBNJDUZQFDIFDLJOHEPFTOUHFUJOZPVSXBZZPVDBOJNNFEJBUFMZSVOZPVSQSPHSBN XJUIPVUGJSTUIBWJOHUPDIBOHFZPVSQSPHSBNJOUPBGPSNUIBUUIFUZQFDIFDLFSXJMM BDDFQU ü 4UBUJDUZQFDIFDLJOHFOBCMFTGBTUFSFYFDVUJPOCFDBVTFUZQFDIFDLJOHOFFEOPUCF QFSGPSNFEBUSVOUJNFBOECFDBVTFWBMVFTDBOCFTUPSFEJONPSFFGGJDJFOU SFQSFTFOUBUJPOT IUUQXQIPNFTTPJDJOEJBOBFEVKTJFLXIBUJTHSBEVBMUZQJOH

Slide 13

Slide 13 text

(SBEVBM5ZQJOH ü %ZOBNJDUZQFDIFDLJOHNBLFTJUFBTZUPEFBMXJUITJUVBUJPOTXIFSFUIFUZQFPGBWBMVF EFQFOETPOSVOUJNFJOGPSNBUJPO ü 4UBUJDUZQJOHJNQSPWFTNPEVMBSJUZ ü 'PSFYBNQMF JOBEZOBNJDMBOHVBHF ZPVDBODBMMBMJCSBSZTVCSPVUJOFJODPSSFDUMZCVUUIFOHFUBUZQFFSSPS EFFQJOTJEFUIBUSPVUJOF4UBUJDDIFDLJOHDBUDIFTUIFUZQFFSSPSTVQGSPOU BUUIFQPJOUXIFSFZPVDBMMFE UIFTVCSPVUJOF X 4UBUJDUZQFDIFDLJOHNBLFTZPVUIJOLNPSFTFSJPVTMZBCPVUZPVSQSPHSBNXIJDIIFMQT UPGVSUIFSSFEVDFCVHT X 8JUIEZOBNJDUZQFDIFDLJOH ZPVEPOUIBWFUPTQFOEUJNFXSJUJOHUZQFBOOPUBUJPOT IUUQXQIPNFTTPJDJOEJBOBFEVKTJFLXIBUJTHSBEVBMUZQJOH

Slide 14

Slide 14 text

(SBEVBM5ZQJOH def add1(x): return x + 1 class A(object): pass a = A() add1(a) IUUQXQIPNFTTPJDJOEJBOBFEVKTJFLXIBUJTHSBEVBMUZQJOH

Slide 15

Slide 15 text

(SBEVBM5ZQJOH def add1(x : int): return x + 1 class A(object): pass a = A() add1(a) IUUQXQIPNFTTPJDJOEJBOBFEVKTJFLXIBUJTHSBEVBMUZQJOH

Slide 16

Slide 16 text

(SBEVBM5ZQJOH def add1(x : ?): return x + 1 add1(1) # int ~> ? IUUQXQIPNFTTPJDJOEJBOBFEVKTJFLXIBUJTHSBEVBMUZQJOH

Slide 17

Slide 17 text

(SBEVBM5ZQJOH def g(p : int * int): return p[0] def f(x, y : int): p = (x, y) g(p) # ? * int ~> int * int IUUQXQIPNFTTPJDJOEJBOBFEVKTJFLXIBUJTHSBEVBMUZQJOH

Slide 18

Slide 18 text

(SBEVBM5ZQJOH š S ~ T UPFYQSFTTUIBUUZQFS JTDPOTJTUFOUXJUIUZQFT š 'PSBOZUZQFT XFIBWFCPUI? ~ T BOET ~ ? š 'PSBOZCBTJDUZQFB TVDIBTJOU XFIBWFB ~ B š "UVQMFUZQFT1 * T2 JTDPOTJUFOUXJUIBOPUIFSUVQMFUZQFS1 * S2 JGT1 ~ S1 BOET2 ~ S2 5IJTSVMFHFOFSBMJ[FTJOBTUSBJHIUGPSXBSEXBZUPUVQMFTPGBSCJUSBSZTJ[F š "GVODUJPOUZQFfun(T1, ..., Tn, R) 5˘5O BSFUIFQBSBNFUFSUZQFT 3JTUIFSFUVSOUZQF  JTDPOTJTUFOUXJUIBOPUIFSGVODUJPOUZQFfun(S1, ..., Sn, U) JGT1 ~ S1˘Tn ~ Sn BOER ~ U IUUQXQIPNFTTPJDJOEJBOBFEVKTJFLXIBUJTHSBEVBMUZQJOH

Slide 19

Slide 19 text

(SBEVBM5ZQJOH š int ~ int š int !~ bool š ? ~ int š bool ~ ? š int * int ~ ? š fun(?, ?) ~ fun(int, int) š ? ~ fun(int, int) š int * int !~ ? * bool IUUQXQIPNFTTPJDJOEJBOBFEVKTJFLXIBUJTHSBEVBMUZQJOH

Slide 20

Slide 20 text

8IZ $SZTUBM IUUQXXXTMJEFTIBSFOFUDSZTUBMMBOHVBHFQPSRVDSZTUBMXIZDSZTUBMMBOHVBHF

Slide 21

Slide 21 text

)FMMPXPSME /* Java: Main.java */ public class Main { public static void main(String[] args) { System.out.println("Hello world!"); } }

Slide 22

Slide 22 text

)FMMPXPSME /* C: main.c */ #include int main() { puts("Hello world!"); return 0; }

Slide 23

Slide 23 text

)FMMPXPSME # Crystal: main.cr p "Hello world!"

Slide 24

Slide 24 text

4JNQMF def say_hello() puts("Hello world!"); end say_hello();

Slide 25

Slide 25 text

4JNQMF def say_hello() puts("Hello world!") end say_hello()

Slide 26

Slide 26 text

4JNQMF def say_hello puts "Hello world!" end say_hello

Slide 27

Slide 27 text

%ZOBNJDBMMZUZQFE def prime?(n) (2...n).all? { |i| n % i != 0 } end # Prime pairs that differ from six def sexy_primes(n) (9..n).map { |i| { i - 6, i } } .select { |i| i.all? { |x| prime?(x) } } end puts sexy_primes(100_000)

Slide 28

Slide 28 text

#FODINBSL š #SBJOGVDL ˋˋ CFODIC 5JNF T .FNPSZ .C $   $SZTUBM   (P   3VCZ   IUUQTHJUIVCDPNLPTUZBCFODINBSLT

Slide 29

Slide 29 text

#FODINBSL š #SBJOGVDL ˋˋ NBOEFMC 5JNF T .FNPSZ .C $   $SZTUBM   (P   1ZUIPO1ZQZ   IUUQTHJUIVCDPNLPTUZBCFODINBSLT

Slide 30

Slide 30 text

#FODINBSL š .BUSJYNVMUJQMJDBUJPO ˋˋ .BUNVM 5JNF T .FNPSZ .C $   $SZTUBM   (P   3VCZ   IUUQTHJUIVCDPNLPTUZBCFODINBSLT

Slide 31

Slide 31 text

#FODINBSL š )BWMBLMPPQGJOEFSˋˋ )BWMBL 5JNF T .FNPSZ .C $SZTUBM   $   (P   1ZUIPO   IUUQTHJUIVCDPNLPTUZBCFODINBSLT

Slide 32

Slide 32 text

#FODINBSL š 1BSTFCJHKTPO GJMFˋˋ +TPO 5JNF T .FNPSZ .C $ (BTPO   $SZTUBM X4DIFNB     (P   3VCZ   IUUQTHJUIVCDPNLPTUZBCFODINBSLT

Slide 33

Slide 33 text

#FODINBSL š 5ISFBESJOH 5JNF T .FNPSZ .C $SZTUBM   (P   4DBMB   3VCZ   IUUQTHJUIVCDPNLPTUZBDSZTUBMCFODINBSLTHBNF

Slide 34

Slide 34 text

#FODINBSL š 3VOUJNFGBDUPS 5JNF OPSNBMJ[FE UP+BWB +BWB  $SZTUBM  /PEFKT  3VCZ  IUUQTUFGBONBSSEFEPXOMPBETDSZTUBMIUNM

Slide 35

Slide 35 text

5ZQFDIFDLJOH def prime?(n) (2...n).all? { |i| n % i != 0 } end def sexy_primes(n) (9..n).map { |i| { i - 6, i } } .select { |i| i.all? { |x| prime?(x) } } end puts sexy_primes(100_000)

Slide 36

Slide 36 text

5ZQFDIFDLJOH def prime?(n) (2...n).all? { |i| n % i != 0 } end def sexy_primes(n) (9..n).map { |i| { i - 6, i } } .select { |i| i.all? { |x| prime?(x) } } end puts sexy_primes("Oops")

Slide 37

Slide 37 text

5ZQFDIFDLJOH def prime?(n) (2...n).all? { |i| n % i != 0 } end def sexy_primes(n) (9..n).map { |i| { i - 6, i } } .select { |i| i.all? { |x| prime?(x) } } end puts sexy_primes("Oops") # Error: no overload matches `Int32#<` with type String

Slide 38

Slide 38 text

5ZQFDIFDLJOH def prime?(n) (2...n).all? { |i| n % i != 0 } end def sexy_primes(n) (9..n).map { |i| { i - 6, i } } .select { |i| i.all? { |x| prime?(x) } } end puts sexy_primes("Oops") sexy_primes # Error: no overload matches `Int32#<` with type String

Slide 39

Slide 39 text

5ZQFDIFDLJOH def prime?(n) (2...n).all? { |i| n % i != 0 } end def sexy_primes(n) (9..n).map { |i| { i - 6, i } } .select { |i| i.all? { |x| prime?(x) } } end puts sexy_primes("Oops") map sexy_primes # Error: no overload matches `Int32#<` with type String

Slide 40

Slide 40 text

5ZQFDIFDLJOH def prime?(n) (2...n).all? { |i| n % i != 0 } end def sexy_primes(n) (9..n).map { |i| { i - 6, i } } .select { |i| i.all? { |x| prime?(x) } } end puts sexy_primes("Oops") map sexy_primes # Error: no overload matches `Int32#<` with type String

Slide 41

Slide 41 text

5ZQFDIFDLJOH def prime?(n) (2...n).all? { |i| n % i != 0 } end def sexy_primes(n) (9..n).map { |i| { i - 6, i } } .select { |i| i.all? { |x| prime?(x) } } end puts sexy_primes(100_000)

Slide 42

Slide 42 text

5ZQFDIFDLJOH def prime?(n) (2...n).all? { |i| n % i != 0 } end def sexy_primes(n : Int) (9..n).map { |i| { i - 6, i } } .select { |i| i.all? { |x| prime?(x) } } end puts sexy_primes(100_000)

Slide 43

Slide 43 text

5ZQFDIFDLJOH def prime?(n) (2...n).all? { |i| n % i != 0 } end def sexy_primes(n : Int) (9..n).map { |i| { i - 6, i } } .select { |i| i.all? { |x| prime?(x) } } end puts sexy_primes("Oops")

Slide 44

Slide 44 text

5ZQFDIFDLJOH def prime?(n) (2...n).all? { |i| n % i != 0 } end def sexy_primes(n : Int) (9..n).map { |i| { i - 6, i } } .select { |i| i.all? { |x| prime?(x) } } end puts sexy_primes("Oops") # Error: no overload matches `sexy_primes` with type String

Slide 45

Slide 45 text

)JHIMFWFM numbers = [1, 2, 3, 4] puts numbers.map { |x| x + 10 } #=> [11, 12, 13, 14] puts numbers[0] + numbers[-1] #=> 5 phones = { "Ann" => "0987654321", "Bob" => "0223456789" } puts phones["Bob"] #=> "0223456789"

Slide 46

Slide 46 text

)JHIMFWFM objects = [0, "one", { 2, "three" }] objects << 456 puts typeof(objects) #=> Array(String | Int32 | {Int32, String}) objects << 78.9 #=> no overload matches 'Array(String | Int32 | {Int32, String})#<<' with type Float64

Slide 47

Slide 47 text

-PXMFWFM ptr = Pointer(UInt8).malloc(20) ptr.value = 10_u8 puts ptr #=> Pointer(UInt8)@0x255a440 a = 1 ptr = pointerof(a) ptr.value = 2 puts a #=> 2 buffer = uninitialized UInt8[1024] # allocated on the stack

Slide 48

Slide 48 text

-PXMFWFM /* C: math.c */ #include #include /* export function */ EXPORT double cos(double x) { /* return cos(x) */ }

Slide 49

Slide 49 text

-PXMFWFM @[Link("math")] lib LibMath fun cos(value : Float64) : Float64 end puts LibMath.cos(1.5) #=> 0.0707372

Slide 50

Slide 50 text

.BDSP macro define_method(name, content) def {{name}} {{content}} end end define_method foo, 1 puts foo

Slide 51

Slide 51 text

.BDSP def foo 1 end puts foo #=> 1

Slide 52

Slide 52 text

8IZOFXMBOHVBHF š 8FMPWF3VCZTFGGJDJFODZGPSXSJUJOHDPEF š 8FMPWF$TFGGJDJFODZGPSSVOOJOHDPEF š 8FXBOUUIFCFTUPGCPUIXPSMET š 8FXBOUUIFDPNQJMFSUPVOEFSTUBOEXIBUXFNFBOXJUIPVUIBWJOHUPTQFDJGZUZQFTFWFSZXIFSF š 8FXBOUGVMM001 š 0I BOEXFEPOUXBOUUPXSJUF$DPEFUPNBLFUIFDPEFSVOGBTUFS IUUQTHJUIVCDPNDSZTUBMMBOHDSZTUBM

Slide 53

Slide 53 text

(PBMT š 4BNFTZOUBYBT3VCZ PSBUMFBTUBTTJNJMBSBTQPTTJCMF š 4UBUJDBMMZUZQFDIFDLFECVUXJUIPVUIBWJOHUPTQFDJGZUIFUZQFPGWBSJBCMFTPSNFUIPEBSHVNFOUT š #FBCMFUPDBMM$DPEFCZXSJUJOHCJOEJOHTUPJUJO$SZTUBM š )BWFDPNQJMFUJNFFWBMVBUJPOBOEHFOFSBUJPOPGDPEF UPBWPJECPJMFSQMBUFDPEF š $PNQJMFUPFGGJDJFOUOBUJWFDPEF IUUQTHJUIVCDPNDSZTUBMMBOHDSZTUBM

Slide 54

Slide 54 text

4UBUVT š 7FSTJPO š "MQIBTUBHF š 4UJMMUXFBLJOHUIFMBOHVBHFTQFDJGJDBUJPOBOETUBOEBSEMJCSBSZ š #PPUTUSBQ š 5IFDPNQJMFSJTXSJUUFOJO$SZTUBM š 3FXSJUJOHDPNQJMFS IUUQDSZTUBMMBOHPSHUIFGVUVSFPGDSZTUBMIUNM  š %FDFOUSBMJ[FEEFQFOEFODZNBOBHFS š 4IBSE IUUQTDSZTUBMTIBSETIFSPLVBQQDPN

Slide 55

Slide 55 text

1SPKFDUT IUUQXXXTMJEFTIBSFOFUDSZTUBMMBOHVBHFQPSRVDSZTUBMXIZDSZTUBMMBOHVBHF IUUQTHJUIVCDPNWFFMFOHBBXFTPNFDSZTUBM

Slide 56

Slide 56 text

$PNNBOEMJOFBQQMJDBUJPOT š UMDSIUUQTHJUIVCDPNQPSSBTUMDS š "TJNQMFUFSNJOBMCBTFEDMJFOUGPS5-%3 IUUQUMESQBHFTHJUIVCJP QBHFT XSJUUFOJO$SZTUBM š DSVMIUUQTHJUIVCDPNQPSSBTDSVM š "DVSMSFQMBDFNFOU UIBUJT JUTBDPNNBOEMJOF)551DMJFOU š TIBSETIUUQTHJUIVCDPNZTCBEEBEFOTIBSET š %FQFOEFODZNBOBHFSGPSUIF$SZTUBMMBOHVBHF /PXEJTUSJCVUFE XJUI$SZTUBMJUTFMG š DSZMPBEIUUQTHJUIVCDPN4EPHSVZPMDSZMPBE š )551CFODINBSLJOHUPPMXSJUFO JO$SZTUBM

Slide 57

Slide 57 text

-JCSBSJFT š %BUBCBTF%SJWFST š .Z42- 1PTUHSFT 3FEJT 42-JUF *OGMVY%# .POHP%#  š "SUBOJTIUUQTHJUIVCDPNZTCBEEBEFOBSUBOJT š $SZTUBMTNFUBQSPHSBNNJOHNBDSPTUPCVJMEB4JOBUSBMJLF%4- IUUQXXXTJOBUSBSCDPN  š DSZTUBMMJOFIUUQTHJUIVCDPNKUPNTDISPFEFSDSZTUBMMJOF š "DPMMFDUJPOPGDPOUBJOFSTBMHPSJUINT š TZTDBMMDSIUUQTHJUIVCDPNLVCPTZTDBMMDS š 3BXTZTDBMM JOUFSGBDFGPS$SZTUBM š 0UIFST š [MJCDS CTPODS TTIDS BDUJWF@SFDPSEDS PQFOTTMDS EPDLFSDS TQPUJGZDS 

Slide 58

Slide 58 text

.PSFBOENPSF š 8FC'SBNFXPSLT š "NFUIZTU IUUQTHJUIVCDPN$PEDPSF"NFUIZTU  3BJMTJOTQJSFEXFCGSBNFXPSL š ,FNBM IUUQTHJUIVCDPNTEPHSVZPMLFNBM -JHIUOJOH'BTU 4VQFS4JNQMFXFCGSBNFXPSL JOTQJSFECZ4JOBUSB š &NVMBUPST š 3$16 IUUQTHJUIVCDPNEEGSFZOFSDQV 7.FNVMBUPSBOEBTTFNCMFS š OFTDS IUUQTHJUIVCDPNSPNFSPBESJBOOFTDS  "/&4FNVMBUPS š $PNQJMFST š $SJTQ IUUQTHJUIVCDPNSIZTE$SJTQ -JTQEJBMFDUJNQMFNFOUFEXJUI$SZTUBM š $SZTUBM IUUQTHJUIVCDPNDSZTUBMMBOHDSZTUBM $SZTUBMDPNQJMFT$SZTUBM

Slide 59

Slide 59 text

$PNNVOJUZ

Slide 60

Slide 60 text

0GGJDJBMDPNNVOJUZ š (PPHMFHSPVQ š IUUQTHSPVQTHPPHMFDPNGPSVNGPSVNDSZTUBMMBOH š (JUUFS š IUUQTHJUUFSJNDSZTUBMMBOHDSZTUBM š *3$DIBOOFM š DSZTUBMMBOH !JSDGSFFOPEFOFU š 4UBDL0WFSGMPX š IUUQTUBDLPWFSGMPXDPNRVFTUJPOTUBHHFEDSZTUBMMBOH

Slide 61

Slide 61 text

$SZTUBM5BJXBOVTFSTHSPVQ š 姻넓⚥俒缺陼鎙ⷔ š IUUQTHJUIVCDPNDSZTUBMUXDSZTUBMUXHJUIVCJP š (JUUFS š IUUQTHJUUFSJNDSZTUBMUXDSZTUBMUXHJUIVCJP š ⿮罌$SZTUBM+1垸䒭麌⡲ š IUUQTHJUIVCDPNDSZTUBMKQ

Slide 62

Slide 62 text

5IBOLZPV