2013-09-05 12 views
5

Egzersiz 4.5: Eğer Lua bir goto bir fonksiyonu dışında atlayamazsın kısıtlama var neden açıklayabilir misiniz? (İpucu:? Bu özelliği uygulamak nasıl)Lua’da neden gotos atlamıyor? Lua kitap 3rd edition sayfasında Programlama From

o kadar olabilir neden olarak birkaç tahmin var: Başka bir ikincisi döner içine bir işlevi atlamak durumunda

  • , PC nereye gidiyor?
  • a = f() varsa, ancak bu kod satırından sonra goto, a değeri nedir?
  • çünkü farklı platformların arama sözleşmelerin standart davranışını tanımlamak mümkün değil midir?

ben yazar bu soruya cevap verecek merak ediyorum. Belki onu e-postayla gönderirim.

arada

, başka kimse bazı fikirler var?

+2

Ben [çünkü velociraptors ait] olduğunu düşünüyorum (http://xkcd.com/292/). – Renan

+1

Platform sorunları önemli değil. Sadece taşınabilir ANSI C'de uygulanmakla kalmaz, aynı zamanda Lua fonksiyonları da yığın yığınları için C yığınını kullanmaz (bu, portatif olarak koroutleri uygulamak için gereklidir). Bunun dışında doğru yoldasınız - kanonik bir cevap aramaktan çekinmeyin çünkü böyle gotoları sınırlamak için birçok neden var. – hugomg

cevap

9

Sizin tahmin cevap ima edilir. Bunun nedeni, goto ifadesinin ve hedefinin aynı yığın çerçevesinde bulunmasıdır. önce ve goto sonra program içeriği tanımlanmamış olan ve doğru yığın çerçevesi ve davranışlarında başka türlü tepinilen kod çalıştırmayacaksa aynı olması gerekir. goto C de aynı nedenlerle aynı kısıtlamalara sahiptir.

C standart kitaplığı ayrıca longjmp() ve setjump() sağlar ve geçerli yığın çerçevesinden bir "goto" biçimi uygulamanıza olanak tanır. setjmp() geçerli yığın içeriğini kaydeder. Yığını setjmp() aradığınız yere geri açmak için longjmp() numaralı telefonu arayabilirsiniz. setjump() çıkışları denen işlevden sonra longjmp()'u arayamazsınız.

+0

Lua diyor ki: 1. Bir blok içinde atlayamıyorum. 2. Fonksiyonlardan atlayamıyorum. 3. Yerel değişkenlerin kapsamına giremez. Kural # 1 zaten işlevlere atlamaya izin vermez, bu yüzden 2. numaralı kural yoksa, o zaman global kapsam içine atlayabiliriz. Küresel kapsam içine atlamak hala problem yaratıyor mu? Küresel kapsamın düzgün bir istif çerçevesi bile var mı? –

+1

Genel kapsam, aslında, 'chunk' lua_load() 'öğesinden geçirilen tüm beden olan anonim bir işlevdir. Küresel kapsam hala yerel değişkenlere sahip olabilir ve tüm aynı köşe durumları geçerlidir. 2010 ve 2011 yıllarında Lua 5.2 çalışma yayınlarının ilk kez araştırıldığı [Lua-L] (http://news.gmane.org/gmane.comp.lang.lua.general) listesinde 'goto' ile ilgili kapsamlı bir tartışma vardı. 'goto' ve 'devam et' gibi alakalı anahtar kelimeleri çevreleyen sorunlar. Arşivleri "goto", "scope", "block", "local" gibi kelimeler için arayın. – RBerteig