2012-12-24 45 views
1

我正在用Ruby編寫一個模擬器,用於相對簡單的6502處理器。編寫一個模擬器,需要能夠在Ruby中引用方法/函數

我的問題是,有沒有一種方法來定義一個散列或數組的細節,彙編指令的細節,其次是它所需要的操作數,最後,實現它的方法/函數?

然後在代碼中的某處,可以根據讀取的指令評估散列或數組,並且可以啓動實現的適當方法/函數?

我打開思路......

目前,我有這樣一個結構,但我有實現它的困難:

@inst.push [ 0x48, :implied, 1, PHA] 
@inst.push [ 0xA2, :immediate, 2, LDX ] 
@inst.push [ 0xA9, :immediate, 2, LDA ] 
@inst.push [ 0xAD, :absolute, 3, LDA ] 
@inst.push [ 0xA6, :zeropage, 2, LDX ] 
@inst.push [ 0xB6, :zeropagey, 2, LDX ] 
@inst.push [ 0xAE, :absolute, 2, LDX ] 
@inst.push [ 0xBE, :absolutey, 2, LDX ] 
@inst.push [ 0x8A, :implied, 1, TXA ] 

lambda表達式,特效?像這樣的事情能爲我在這裏實現的目標而努力嗎?

我真的不希望每個指令都有一個大的「Case/When」,然後在一個巨大的,醜陋的和相對不友好的地方發表聲明。

謝謝!

+1

是的,我會與lambda一起去。 –

回答

3

如果您的指示是作爲方法實現的,則不需要lambdas。使用符號和名稱指定方法,使用Class#method獲得實際方法,並使用Method#call調用它。我的意思是

method = Object.method :puts 
method.call "Oh, it seems to work!" 

你的情況,這將是

implementation = Instructions.method instruction_name 
# Store it in a hash in which instruction names are keys or any other 
# appropriate data structure. Once you encounter this instruction... 
implementation.call 
+0

訣竅是使用方法(methodname).call。謝謝你的提示。 – farhany

0

您可以使用send調用任何方法的對象上

>> a = [1,2,8] 
=> [1, 2, 8] 
>> a.send(:size) 
=> 3 
>> a.send(:pop) 
=> 8 
>> a 
=> [1, 2] 
>> a.send(:push,42) 
=> [1, 2, 42] 

所以只是存儲的方法名稱它將你的指令作爲數組中的符號實現,然後將符號發送給解釋器來調用相關的方法。

相關問題