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

Crystal

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 Crystal

Una introducción al lenguaje de programación Crystal, pensada para gente con experiencia en Ruby, centrándose en diferencias y similutudes con este. Presentada en Madrid.rb Mayo 2016.

Avatar for Sergio Gil

Sergio Gil

May 26, 2016
Tweet

More Decks by Sergio Gil

Other Decks in Programming

Transcript

  1. ruby + compilado (= muy rápido) + tipos + Librería

    estándar - metaprogramación + otra metaprogramación
  2. ruby + compilado (= muy rápido) + tipos + Librería

    estándar - metaprogramación + otra metaprogramación
  3. crystal ruby + compilado (= muy rápido) + tipos +

    Librería estándar - metaprogramación + otra metaprogramación
  4. class MyClass1 def my_method "hello" end end class MyClass2 end

    object = MyClass2.new object.my_method error
  5. Error in ./example.cr:9: undefined method 'upcase' for Int32 object.my_method.upcase ^~~~~~

    ============================================================ Int32 trace: ./example.cr:2 def my_method ^~~~~~~~~ ./example.cr:3 1 ^
  6. class MyClass def my_method : Int32 1 end end object

    = MyClass.new object.my_method.upcase error
  7. class MyClass def my_method : Int32 1 end end object

    = MyClass.new object.my_method.upcase error
  8. error class MyClass def my_method(param) param.upcase end end object =

    MyClass.new object.my_method("hello") object.my_method(5)
  9. class MyClass def my_method(param : String | Int32) param.succ end

    end object = MyClass.new object.my_method("hello") # "hellp" object.my_method(5) # 6
  10. class Duck def quack "Quack!" end end class QuacksLikeADuck def

    quack "I'm a duck! Don't look at my like that!" end end def make_a_duck_quack(duck) duck.quack end duck1 = Duck.new duck2 = QuacksLikeADuck.new make_a_duck_quack(duck1) make_a_duck_quack(duck2)
  11. class MyClass def my_method(param : String | Int32) # param

    es un String | Int32 if param.is_a?(String) # param es un String aquí, así que # responde a upcase param.upcase else param.to_s end end end object = MyClass.new object.my_method("hello") # "HELLO" object.my_method(5) # "5"
  12. class MyClass def my_method(param : String) param.upcase end def my_method(param)

    param.to_s end end object = MyClass.new object.my_method("hello") # "HELLO" object.my_method(5) # "5"
  13. class MyContainer(T) def initialize @items = Array(T).new end def add(item

    : T) @items << item end end container1 = MyContainer(String).new container1.add("Hello") container2 = MyContainer(Int32).new container2.add(32)
  14. Macro ~ método, pero: 1) Se ejecuta en compilación 2)

    Genera el código que será compilado
  15. module Config macro option(name, value) def self.{{name}} {{value}} end end

    end class MyConfig include Config option url, "http://madridrb.org" option city, "Madrid" end MyConfig.url MyConfig.city
  16. class MyClass macro method_missing(name, _params, _block) {% if name ==

    "trololo" %} {{ raise "TROLOLO" }} {% end %} {{name.upcase}} end end object = MyClass.new object.foo object.bar object.trololo error
  17. class MyClass def foo "FOO" end def bar "BAR" end

    end object = MyClass.new object.foo object.bar
  18. channel = Channel(String).new spawn do loop do sleep 0.5 channel.send("PING")

    end end spawn do loop do sleep 0.5 channel.send("PONG") end end while item = channel.receive puts item end
  19. 2016-05-26 13:39:10 +0200 200 GET / - 15µs 2016-05-26 13:39:10

    +0200 200 GET / - 21µs 2016-05-26 13:39:11 +0200 200 GET / - 17µs 2016-05-26 13:39:11 +0200 200 GET / - 16µs 2016-05-26 13:39:11 +0200 200 GET / - 39µs 2016-05-26 13:39:11 +0200 200 GET / - 34µs