You are absolutely right.
I have written Scheme interpreters in both languages.
Compare
https://github.com/nukata/little-scheme-in-ruby/blob/v0.3.0/... # Cons cell
class Cell
include Enumerable
attr_reader :car
attr_accessor :cdr
def initialize(car, cdr)
@car = car
@cdr = cdr
end
# Yield car, cadr, caddr and so on, à la for-each in Scheme.
def each
j = self
begin
yield j.car
j = j.cdr
end while Cell === j
j.nil? or raise ImproperListException, j
end
end # Cell
and
https://github.com/nukata/little-scheme-in-crystal/blob/v0.2... # Cons cell
class Cell < Obj
include Enumerable(Val)
getter car : Val # Head part of the cell
property cdr : Val # Tail part of the cell
def initialize(@car : Val, @cdr : Val)
end
# Yield car, cadr, caddr and so on, à la for-each in Scheme.
def each
j = self
loop {
yield j.as(Cell).car
j = j.as(Cell).cdr
break unless Cell === j
}
raise ImproperListException.new(j) unless j.nil?
end
end # Cell
and they will make the point clear.
Ruby and Crystal are different languages, but you can translate your code from Ruby to Crystal line by line fairly easily.For the performance boost, see
https://github.com/nukata/little-scheme/tree/v1.3.0#performa...
which shows times to solve 6-Queens on a meta-circular Scheme as follows: * Crystal 0.34.0: crystal build --release scm.cr: 2.15 sec. * Crystal 0.34.0: crystal scm.cr: 9.88 sec. * Ruby 2.3.7: ruby scm.rb: 84.80 sec. Compiled (and complex enough) Crystal code runs 39 times faster than the equivalent Ruby code in this case. |