Создание модуля вспомогательной функции

Я пишу DSL для создания парсеров для плоских файлов биоинформатики. Я хотел бы позволить пользователю определять вспомогательные функции в блоке, а затем включать функцию в объект контекста синтаксического анализа. Я хотел бы использовать такой синтаксис:

rules = Rules.new do
  helpers do
     def foo()
       #...
     end
     def bar( baz )
       #...
     end
   end
   # Here come the parsing rules which can access both helper methods
 end

Я хотел бы добавить вспомогательные методы в определение модуля и включить модуль в экземпляр (только экземпляр, а не класс).

У тебя есть идея, как я могу достичь этой цели? Также приветствуются ответы с немного другим синтаксисом.


person paradigmatic    schedule 30.12.2009    source источник


Ответы (1)


Что-то вроде этого, может быть?

class Rules
  def initialize(&block)
    instance_eval &block
  end

  def helpers
    yield
  end
end

Rules.new do
  helpers do
    def hi_world
      puts "Hello World!"
    end
  end

  hi_world
end

Обратите внимание, что здесь метод helpers не делает ничего особенного, он просто полагается на тот факт, что блок Rules уже является текущей областью.

person Ciarán Walsh    schedule 30.12.2009