2015-09-06 36 views
5

Bugün Pharo içinde yürütülmesi öğrendim (!).Süreç sonlandırılırsa, tüm güvenlik bloğunun yürütülmesi tamam mı?</p> <pre><code>[v := 1] ensure: [self halt. v := 2] </code></pre> <p>biz <code>halt</code> pencerede işleminden vazgeçmesi dahi <code>v = 2,</code> ayarı sona erecek:

bu tartışmalı buluyorum. Benim için #ensure: anlamsallığı dizisi

self halt. v := 2 

, alıcı bloğu ile bağımsız koşullar, bağımsız değişken blok arasında olup bağımsız olarak mantık yürütür edilmesi gerektiği anlamına gelir. Ve #halt mantığı süreci sonlandırma olayını içerdiğinden, ikinci cümlenin obstinate değerlendirmesini müdahalede buluyorum. (. #halt ile aynı) ZeroDivide durum attı makyaj I v değeri 2 olduğu hala hata ayıklayıcı ve kapalı

[v := 1] ensure: [1/0. v := 2] 

Son olarak

I:

Sonraki Aşağıdaki çalıştı değerlendirdi:

[v := 1] ensure: [n := 1/0. v := v + n] 

ve ZeroDivide üzerine ayıklayıcısını kapalı istisna. Bu kez v değeri 1 idi, ancak v + n'un değerlendirilemediği gerçeğinden bir istisna yapıyorum. Başka bir deyişle, hata sessizce devam etti.

Yani benim sorudur. Bu davranışın ardındaki mantıklı nedir? Süreç sadece "normal" koşullar altında sona erdirilmemeli, yani, #ensure:'un dahil edilmemesi gerekir mi?

+1

Sorunuzu pharo geliştiricileri posta listesinde göremiyorum. Buradan çok daha uygun olurdu (ve gıcırdayanlardan) –

+2

@StephanEggermont: Posta listesine uygun _also_ olması, burada _inappropriate_ yapamaz. Benim görüşüme göre, bu posta listelerinde çok fazla bilgi kayboluyor ... onlar sadece herkesin işi değil. ;-) –

+0

Bu uygunsuz çünkü cevaplar değil tasarım tartışma tartışmalarına ihtiyaç duyuyor. Bunun için posta listelerini kullanıyoruz, SO değil. Burada yinelenen şeyler gayet iyi, fakat merkezi nokta ise (daha iyi bir şey yapana kadar) e-posta listesini tutuyor. –

cevap

4

İlginç bir. Yanıtınız, #ensure: tarafından çağrılan BlockClosure>>valueNoContextSwitch yönteminde yatıyor. Orada yorumunu okursanız, o (ilkel olarak) BlockClosure>>value bire bir kopyasını oluşturur söylüyor ki bu kopyanın dönüş değeri döndürülmeden içeren orijinal bloğun değil dönüş değeri senin sen sonlandırıldı halt. Böylece kopya, orijinalin bitmemesi durumunda bile (kopyalanan halt görmezden geliyor) yürütülür.

Tahminimce bunun, her zaman ensure: bloğunun çalışmasını sağlaması (ancak amaçlanan) olmasını sağlaması, ancak orijinal bloğun sonlandırılmasını göz ardı etmesinin istenmeyen yan etkisi vardır. Bu katılıyorum sadece bu sadece karşı sezgisel değil, aynı zamanda amaçlanan değil muhtemelen.

1

Bu tamamen herhangi biri (ANSI) standardında tanımlanmamıştır davranıştır sanırım, ama ben yanlış isem, beni düzeltin.

Diğer Smalltalks farklı davranması gibi görünüyor. Debugger'ın 3 seçenek sunduğunu Smalltalk/X'de denedim: "Devam" (yani devam et), "İptal et" (yani gevşeme) ve "Sonlandır" (yani işlemi durdur). Sanırım "Sonlandır", hata ayıklayıcısını kapattığınızda Squeak'ın ne yaptığına karşılık gelir.

"Abort" ve "Sonlandırma" ile, emin blokun geri kalanı, "Devam" ile yürütülemez. Sanırım bu iyi ve ne bekliyorsunuz?

Vazgeçme ve Sonlandırma (her ikisi de özel durum işleyicileri için her zaman çözülüyorsa), olası hatalı/hatalı/arızalı emin bloğu yeniden değerlendirmeye veya ilerlemeye çalışmamalıdır.

Devam etmek istiyorsa, işleyicinin (temel olarak Debugger'ın) seçimi budur. Eğer değilse, o zaman emin bloktan çıkmalı ve çağrı zincirinde olabilecek herhangi bir diğer emin blokları yürütmeye devam etmelidir.

Bu, istisna işleme bloklarının davranışıyla tutarlıdır, bunlar aynı istisna içinde yükseltilmişse de yeniden değerlendirilmemiş veya devam edilmez. ST/X'de, istisna sınıflarında bu duruma dikkat eden açık bir kod vardır, bu yüzden kesinlikle yan amacına göre değil, amacına göre yapılır.

Tahminimce bu Squeak ve Squeak geliştiricilerin yanlış olduğu söyleniyor.