On 2015-04-02 21:11, Ary Borenszweig wrote:

We can. But then it becomes harder to understand what's going on. In
RSpec I don't quite understand what's going on really, and I like a bit
of magic but not too much of it.

It's quite straightforward to implement, in Ruby as least. Something like this:

module DSL
  def describe(name, &block)
    context = Class.new(self)
    context.send(:extend, DSL)
    context.instance_eval(&block)
  end

  def it(name, &block)
    send(:define_method, name, &block)
  end
end

class Foo
  extend DSL

  describe 'foo' do
    it 'bar' do
      p 'asd'
    end
  end
end

You need to register the tests somehow also but be able to run them, but this is the basic idea. I cheated here and used a class to start with to simplify the example.

In fact with macros it's not that simple because you need to remember
the context where you are defining stuff, so that might need adding that
capabilities to macros, which will complicate the language.

Yeah, I don't really now how macros work in Cyrstal.

--
/Jacob Carlborg

Reply via email to