Crystal is a programming language created in 2014 by Ary Borenszweig and Juan Wajnerman and Brian Cardiff.
#63on PLDB | 9Years Old | 27.1kUsers |
0Books | 0Papers | 8kRepos |
In computer software programming languages, Crystal is a general-purpose, object-oriented programming language, designed and developed by Ary Borenszweig and Juan Wajnerman and more than 200 contributors. With syntax inspired by the language Ruby, it is a compiled language with static type-checking, but specifying the types of variables or method arguments is generally unneeded. Types are resolved by an advanced global type inference algorithm. Read more on Wikipedia...
# Type your code here, or load an example.
# compile with --prelude=empty
fun square(num : Int32) : Int32
num &* num
end
puts "Hello, world!"
puts "Hello World"
# Hello world in Crystal
puts "Hello World"
#!/usr/bin/env bin/crystal --run
require "../../spec_helper"
describe "Type inference: declare var" do
it "types declare var" do
assert_type("a :: Int32") { int32 }
end
it "types declare var and reads it" do
assert_type("a :: Int32; a") { int32 }
end
it "types declare var and changes its type" do
assert_type("a :: Int32; while 1 == 2; a = 'a'; end; a") { union_of(int32, char) }
end
it "declares instance var which appears in initialize" do
result = assert_type("
class Foo
@x :: Int32
end
Foo.new") { types["Foo"] }
mod = result.program
foo = mod.types["Foo"] as NonGenericClassType
foo.instance_vars["@x"].type.should eq(mod.int32)
end
it "declares instance var of generic class" do
result = assert_type("
class Foo(T)
@x :: T
end
Foo(Int32).new") do
foo = types["Foo"] as GenericClassType
foo_i32 = foo.instantiate([int32] of Type | ASTNode)
foo_i32.lookup_instance_var("@x").type.should eq(int32)
foo_i32
end
end
it "declares instance var of generic class after reopen" do
result = assert_type("
class Foo(T)
end
f = Foo(Int32).new
class Foo(T)
@x :: T
end
f") do
foo = types["Foo"] as GenericClassType
foo_i32 = foo.instantiate([int32] of Type | ASTNode)
foo_i32.lookup_instance_var("@x").type.should eq(int32)
foo_i32
end
end
it "declares an instance variable in initialize" do
assert_type("
class Foo
def initialize
@x :: Int32
end
def x
@x
end
end
Foo.new.x
") { int32 }
end
end
channel = Channel(Int32).new
spawn do
puts "Before first send"
channel.send(1)
puts "Before second send"
channel.send(2)
end
puts "Before first receive"
value = channel.receive
puts value # => 1
puts "Before second receive"
value = channel.receive
puts value # => 2
abstract do if nil? self unless alias else in of sizeof until as elsif include out struct when as? end instancesizeof pointerof super while asm ensure isa? private then with begin enum lib protected true yield break extend macro require type case false module rescue typeof class for next return uninitialized def fun nil select union
Feature | Supported | Token | Example |
---|---|---|---|
While Loops | ✓ | ||
Conditionals | ✓ | ||
Functions | ✓ | ||
Classes | ✓ | ||
File Imports | ✓ | require | require "../../spec_helper" |
Booleans | ✓ | true false | |
Strings | ✓ | " | "Hello world" |
Print() Debugging | ✓ | puts | |
Comments | ✓ | # A comment |
|
Line Comments | ✓ | # | # A comment |
Type Inference | ✓ | ||
Semantic Indentation | X | ||
MultiLine Comments | X |