Oggi ho imparato che nel Pharo l'esecuzione di:È ok per eseguire l'intero blocco di garanzia se il processo è terminato?
[v := 1] ensure: [self halt. v := 2]
finirà impostazione v = 2,
anche quando si abbandona il processo alla finestra halt
(!).
Trovo che questo sia discutibile. Per me, la semantica di #ensure:
significa che la sequenza
self halt. v := 2
deve essere eseguito, a prescindere dalle circostanze con il blocco ricevente, non indipendentemente la logica del blocco tesi. E poiché la logica di #halt
include l'evento di terminare il processo, trovo invadente la valutazione ostinata della seconda frase.
Dopo ho provato quanto segue: (. Stessa con #halt
)
[v := 1] ensure: [1/0. v := 2]
Quando il ZeroDivide
eccezione spuntato-up I chiuso il debugger e ancora il valore di v
era 2
Infine, valutato:
[v := 1] ensure: [n := 1/0. v := v + n]
e chiuso il debugger su ZeroDivide
eccezione. Questa volta il valore di v
era 1
ma non ho ottenuto alcuna eccezione dal fatto che non è possibile valutare v + n
. In altre parole, l'errore è andato in silenzio.
Quindi la mia domanda è. Qual è la logica dietro questo comportamento? Il processo non dovrebbe terminare al punto in cui verrebbe risolto in circostanze "normali", cioè senza lo #ensure:
coinvolto?
Non vedo la tua domanda nella mailing list degli sviluppatori di pharo. Sarebbe molto più appropriato lì (e nello squittio) che qui –
@StephanEggermont: Il fatto che sia _also_ appropriato nella mailing list non lo rende _inappropriato_ qui. Secondo me, troppa conoscenza si perde in quelle mailing list ... non sono solo la cosa di tutti. ;-) –
Non è appropriato perché ha bisogno di discussioni sul tradeoff della progettazione, non di risposte. Usiamo le mailing list per questo, non SO. Duplicare le cose qui va bene, ma il punto centrale è e rimane la mailing list (finché non creiamo qualcosa di meglio nell'immagine) –