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

Crystal

 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.

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