Милен обнови решението на 15.01.2014 14:35 (преди почти 11 години)
+module Asm
+ def self.asm(&block)
+ instructions = ArithmeticInstructions.new
+ instructions.instance_eval &block
+ p instructions.registers.values
+ end
+
+ class ArithmeticInstructions
+ attr_reader :ax, :bx, :cx, :dx
+ attr_reader :registers
+
+ def initialize
+ @operations_queue = []
+ @registers = {
+ ax: 0,
+ bx: 0,
+ cx: 0,
+ dx: 0,
+ }
+ @ax, @bx = :ax, :bx
+ @cx, @dx = :cx, :dx
+ end
+
+ def mov(register, value)
+ if value.is_a? Fixnum
+ @registers[register.to_sym] = value
+ else
+ @registers[register.to_sym] = @registers[value.to_sym]
+ end
+ @operations_queue << ['mov', [register.to_sym, value]]
+ end
+
+ def inc(register, value)
+ if value.is_a? Fixnum
+ @registers[register.to_sym] += value
+ else
+ @registers[register.to_sym] += @registers[value.to_sym]
+ end
+ @operations_queue << ['inc', [register.to_sym, value]]
+ end
+
+ def dec(register, value)
+ if value.is_a? Fixnum
+ @registers[register.to_sym] -= value
+ else
+ @registers[register.to_sym] -= @registers[value.to_sym]
+ end
+ @operations_queue << ['dec', [register.to_sym, value]]
+ end
+
+ def cmp(register, value)
+ if value.is_a? Fixnum
+ @last_cmp_result = @registers[register.to_sym] <=> value
+ else
+ @last_cmp_result = @registers[register.to_sym] <=> @registers[value.to_sym]
+ end
+ @operations_queue << ['cmp', [register.to_sym, value]]
+ end
+
+ def label(value)
+ @operations_queue << ['label', value]
+ end
+
+ def method_missing(method_name)
+ method_name
+ end
+ end
+end
Щеше да е по-удачно да използваш символи за имената на инструкциите.
Лошото подравняване и забравеното p instructions.registers.values
ще бъдат санкционирани с точка. Имаш късмет, че p
връща аргументите си като стойност, та са минали 2 теста.
Оправдано :) Не искам да прозвучи като заяждане, по-скоро като въпрос относно форматирането. Пиша на Sublime. Там всичко изглежда наред. Като копирам кода във формата на сайта трябва отново да подравнявам много от нещата. Къде е проблема?
@Милен, за Sublime ти препоръчвам тези неща:
- Сложи си опцията
"draw_white_space": "all"
в настройките на редактора. - Инсталирай си плъгин, който ти показва trailing whitespace. Ако имаш Package Control, потърси плъгин, който се казва "TrailingSpaces" или нещо сродно. Ако нямаш Package Control, задължително си инсталирай.
-
Увери се, че syntax specific настройките за Ruby (има го в менюто), имат следните две опции вътре:
"tab_size": 2, "translate_tabs_to_spaces": true,