13. τarka λabs@vagmi
y = uninitialized Int32
y = 42
puts y
# y = "@vagmi"
# => Error in ./variables/variables.cr:15:
# type must be Int32, not (String | Int32)
14. τarka λabs@vagmi
z = uninitialized (Int32 | String)
puts z # segfault
# Invalid memory access (signal 11) at address 0x7fff571cb200
15. τarka λabs@vagmi
a = 20
if rand(100) < 50
a = “@vagmi"
end
puts typeof(a) # => (String | Int32)
17. τarka λabs@vagmi
a = {} of String => Int32
a["year"] = 2016
puts a
b = Hash(Int32 | Char, Int32) {3 => 4}
b[1] = 2
b['a'] = 9
puts b # => {3 => 4, 1 => 2, 'a' => 9}
puts b.size # => 3
18. τarka λabs@vagmi
b.delete('a')
puts b # => {3 => 4, 1 => 2}
p b[true] # runtime error
# should this not be a compile error?
# => Missing hash key: true (KeyError)
p b["bar"]? # nil
22. τarka λabs@vagmi
def add2(num)
2 + num
end
puts add2(40) # => 42
puts add2("forty")
# in ./def/funs.cr:17: no overload matches
# 'Int32#+' with type String
def add2(other : String)
"#{other} two"
end
puts add2("forty") # => forty two
23. τarka λabs@vagmi
abstract class Foo
abstract def foo
def greet
"hello #{@name}"
end
end
class Bar < Foo
def initialize(@name)
end
def foo
1
end
end
a = Bar.new("Bar")
puts a.foo # => 1
puts a.greet # => Hello Bar
class Baz < Foo
def foo
2
end
end
b = Baz.new
puts b.foo # => 2
p b.greet # => "Hello "
24. τarka λabs@vagmi
- class Object (4 bytes)
+- class Reference (4 bytes)
+- class Foo (16 bytes)
. @name : String? (8 bytes)
+- class Baz (16 bytes)
+- class Bar (16 bytes)
crystal tool hierarchy -e Foo abstract/abstract.cr
25. τarka λabs@vagmi
struct Entry
property :title, :score, :num_comments
def initialize(@title, @score, @num_comments)
end
def to_json(io)
{
title: title,
score: score,
num_comments: num_comments
}.to_json(io)
end
end
28. τarka λabs@vagmi
macro getter(*names)
{% for name in names %}
{% if name.is_a?(TypeDeclaration) %}
@{{name.id}}
{% name = name.var %}
{% end %}
def {{name.id}}
@{{name.id}}
end
{% end %}
end
29. τarka λabs@vagmi
macro setter(*names)
{% for name in names %}
{% if name.is_a?(TypeDeclaration) %}
@{{name}}
def {{name.var.id}}=(@{{name.var.id}} :
{{name.type}})
end
{% else %}
def {{name.id}}=(@{{name.id}})
end
{% end %}
{% end %}
end
30. τarka λabs@vagmi
def make_request
url = "https://www.reddit.com/hot.json"
channel = Channel(String).new
spawn do
HTTP::Client.get(url) do |response|
if(resp_body = response.body_io.gets)
$cache = resp_body
channel.send resp_body
end
end
end
channel
end
31. τarka λabs@vagmi
get '/feed' do |env|
channel = make_request
entries = JSON.parse(channel.receive)["data"]
["children"].as_a
feed = entries.map do |e|
Entry.from_json(e)
end
env.response.content_type = "application/json"
feed.to_json
end
32. τarka λabs@vagmi
Crystal Language - http://crystal-lang.org/
Support Crystal - https://salt.bountysource.com/teams/crystal-lang
Crystal Shards - https://crystalshards.herokuapp.com/
Awesome Crystal - http://awesome-crystal.com/