Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
decode_instr( addr : int, instr : int ) : INSTR {
match(( instr & OP_MASK ) >> OP_SHIFT) {
| 0x0 => {
def (op,r1,imm) = (((instr & S_OP_MASK ) >> S_OP_SHIFT) :> SOpCodes, (instr & S_R1_MASK ) >> S_R1_SHIFT, imm = ((instr & S_IMM_MASK ) >> S_IMM_SHIFT) :> ImmOpcodes);
match(op){
| SOpCodes.Noop => fun(s : OVMState ) { s; };
| SOpCodes.Cmpz => match(imm) {
| ImmOpcodes.Ltz => fun(s) { s.STATUS = (s.MEM[r1] < 0.0); s }
| ImmOpcodes.Lez => fun(s) { s.STATUS = (s.MEM[r1] <= 0.0); s }
| ImmOpcodes.Eqz => fun(s) { s.STATUS = (Math.Abs(s.MEM[r1] ) < 1e-10); s }
| ImmOpcodes.Gez => fun(s) { s.STATUS = (s.MEM[r1] >= 0.0); s }
| ImmOpcodes.Gtz => fun(s) { s.STATUS = (s.MEM[r1] > 0.0); s}
}
| SOpCodes.Sqrt => fun(s) { s.MEM[addr] = Math.Sqrt(Math.Abs(s.MEM[r1]));s };
| SOpCodes.Copy => fun(s) { s.MEM[addr] = s.MEM[r1]; s };
| SOpCodes.Input => fun(s) { s.MEM[addr] = s.INS[r1];s };
}
| _ => {
def (r1,r2) = ((instr & D_R1_MASK ) >> D_R1_SHIFT, (instr & D_R2_MASK ) >> D_R2_SHIFT);
match(opcode) {
| DOpCodes.Add => fun(s : OVMState) { s.MEM[addr] = s.MEM[r1] + s.MEM[r2]; s }
| DOpCodes.Sub => fun(s : OVMState) { s.MEM[addr] = s.MEM[r1] - s.MEM[r2];s;}
| DOpCodes.Mult => fun(s) { s.MEM[addr] = s.MEM[r1] * s.MEM[r2]; s }
| DOpCodes.Div => fun(s) { s.MEM[addr] = if( Math.Abs( s.MEM[r2] ) < 1e-10 ) 0.0 else s.MEM[r1] / s.MEM[r2]; s}
| DOpCodes.Phi => fun(s) { s.MEM[addr] = if( s.STATUS ) s.MEM[r1] else s.MEM[r2]; s}
| DOpCodes.Output => fun(s) { s.OUTS[r1] = s.MEM[r2]; s; }
}
}
}
* This source code was highlighted with Source Code Highlighter.Если сравнивать OCalm и Nemerle, то не думаю, что была бы какая-то качественная разница.
Nemerle и спутник, или ФП для самых маленьких