Такой вот код на C#:
var x = 0;
switch (x)
{
case 0: break;
case 1: break;
case 2: break;
}
компилируется в:
L_0001: ldc.i4.0
L_0002: stloc.0
L_0003: ldloc.0
L_0004: stloc.1
L_0005: ldloc.1
L_0006: switch (L_0019, L_001b, L_001d)
L_0017: br.s L_001f
L_0019: br.s L_001f
L_001b: br.s L_001f
L_001d: br.s L_001f
Match на Немерле:
def x = 0;
match (x) {
| 0 => {}
| 1 => {}
| 2 => {}
}
компилируется в :
L_0002: ldc.i4.0
L_0003: stloc.0
L_0004: nop
L_0005: ldloc.0
L_0006: ldc.i4.0
L_0007: bne.un L_0015
L_000c: nop
L_000d: nop
L_000e: nop
L_000f: nop
L_0010: br L_003e
L_0015: nop
L_0016: ldloc.0
L_0017: ldc.i4.1
L_0018: bne.un L_0026
L_001d: nop
L_001e: nop
L_001f: nop
L_0020: nop
L_0021: br L_003e
L_0026: nop
L_0027: ldloc.0
L_0028: ldc.i4.2
L_0029: bne.un L_0037
L_002e: nop
L_002f: nop
L_0030: nop
L_0031: nop
L_0032: br L_003e
L_0037: nop
L_0038: newobj instance void [Nemerle]Nemerle.Core.MatchFailureException::.ctor()
L_003d: throw
L_003e: nop
L_003f: nop
Как говорится, почувствуйте разницу.
Можно ли ожидать, что генерация match-а, когда образцами выступают целые/энумы, будет производиться как в C#?
Очень бы этого хотелось