6

Programming In Lua book 3rd edition page 38 から

演習 4.5:なぜ Lua にはgoto関数から飛び出せないという制限があるのか​​説明できますか? (ヒント: その機能をどのように実装しますか?)

なぜそうなのかについては、いくつかの推測があります。

  • ある関数から別の関数にジャンプし、2 番目の関数が戻ってきた場合、PC はどこに行くのでしょうか?
  • 持っているが、そのコード行の後にa = f()fを実行する場合、 の値は何ですか?gotoa
  • プラットフォームの呼び出し規約が異なるため、標準の動作を定義することはできませんか?

著者はその問いにどう答えるのだろうか。多分私は彼に電子メールを送ります。

それまでの間、他の誰かが何かアイデアを持っていますか?

4

1 に答える 1

10

あなたの推測は答えを示唆しています。その理由は、gotoステートメントとその宛先が同じスタック フレームに存在する必要があるためです。前後のプログラム コンテキストgotoは同じである必要があります。同じでないと、ジャンプ先のコードが正しいスタック フレームで実行されず、動作が未定義になります。 gotoin C には、同じ理由で同じ制限があります。

C 標準ライブラリは、現在のスタック フレームから「goto」形式を実装できる longjmp()および も提供します。現在のスタック コンテキストを保存します。その後、 を呼び出して、呼び出した場所にスタックを巻き戻すことができます。呼び出した関数が終了した後に呼び出すことはできません。setjump()setjmp()longjmp()setjmp()longjmp()setjump()

于 2013-09-05T21:50:08.633 に答える