Днес научих, че във Pharo изпълнението на:
[v := 1] ensure: [self halt. v := 2]
ще завърши с настройка v = 2,
дори когато изоставим процеса в прозореца halt
(!).
Намирам това за спорно. За мен семантиката на #ensure:
означава, че последователността
self halt. v := 2
трябва да се изпълни, независимо от обстоятелствата с приемния блок, не независимо от логиката на аргументния блок. И тъй като логиката на #halt
включва събитието за прекратяване на процеса, намирам за натрапчива упоритата оценка на второто изречение.
След това опитах следното:
[v := 1] ensure: [1 / 0. v := 2]
Когато се появи изключение ZeroDivide
, затворих програмата за отстраняване на грешки и все още стойността на v
беше 2
(същото като при #halt
.)
Накрая оцених:
[v := 1] ensure: [n := 1 / 0. v := v + n]
и затвори програмата за отстраняване на грешки при изключението ZeroDivide
. Този път стойността на v
беше 1
, но не получих изключение от факта, че v + n
не може да бъде оценено. С други думи, грешката продължи безшумно.
Та въпросът ми е. Каква е рационалната основа зад това поведение? Не трябва ли процесът просто да приключи в точката, в която би приключил при „нормални“ обстоятелства, т.е. без участие на #ensure:
?