computedGoto 编译指示

computedGoto 编译指令告知编译器如何编译嵌在 while true 语句里的 Nim case 语句。 这个编译指示在语法上必须是这个循环体里的一条语句:

  1. type
  2. MyEnum = enum
  3. enumA, enumB, enumC, enumD, enumE
  4. proc vm() =
  5. var instructions: array[0..100, MyEnum]
  6. instructions[2] = enumC
  7. instructions[3] = enumD
  8. instructions[4] = enumA
  9. instructions[5] = enumD
  10. instructions[6] = enumC
  11. instructions[7] = enumA
  12. instructions[8] = enumB
  13. instructions[12] = enumE
  14. var pc = 0
  15. while true:
  16. {.computedGoto.}
  17. let instr = instructions[pc]
  18. case instr
  19. of enumA:
  20. echo "yeah A"
  21. of enumC, enumD:
  22. echo "yeah CD"
  23. of enumB:
  24. echo "yeah B"
  25. of enumE:
  26. break
  27. inc(pc)
  28. vm()

如例子所示,computedGoto 对于实现解释器非常有用。如果所使用的后端(C 编译器)不支持计算跳转这个扩展功能,那么该编译指示被直接忽略。