Разполагаме с много прост робот, който се движи по числова права. Няма значение дали правата е с цели или реални числа. По подразбиране роботът потегля от точка 0, но може да му бъде указана коя да е друга точка от правата за начало. Роботът може да изпълнява две прости команди – move
, която го премества с 1 позиция надясно и mark
, която го кара да съобщи текущите си координати.
Задачата е да се имплементира следният прост DSL:
Да се създаде функция robot
, която приема един аргумент – началната позиция на робота (аргументът има стойност по подразбиране 0).
robot # Роботът ще стартира от позиция 0
robot 42 # Роботът ще стартира от позиция 42
robot
също така трябва да приема блок, който да съдържа серия от команди move
и mark
:
robot 42 do
move
mark
end
robot
връща като резултат масив, съдържащ позициите, които роботът е маркирал:
robot { move; move; mark; move; mark; } # => [2, 3]
robot(9) { move; mark; mark; move; move; mark; } # => [10, 10, 12]
robot(1000000) {} # => []
Забранено е използването на глобални променливи. Не използвайте долари и други парични знаци. :-) Забранено е и използването на дефакто глобални променливи (дефинирани някъде извън robot
, например) за съхранение на информацията.
Hint: разгледайте instance_eval
и напишете помощен клас, който да помни информацията, необходима на робота.