[nem-pl] z cyklu oglądamy i krytykujemy
Michal Moskal
malekith at pld-linux.org
Thu Nov 6 21:57:22 CET 2003
On Thu, Nov 06, 2003 at 09:40:09PM +0100, Grzegorz Stelmaszek wrote:
> > Blah... gorzej:
> >
> > >> To sa niezmienniki na poziomie calego bloku, podobnie jak require,
> > >> ale sprawdzane po kazdej instrukcji w bloku,
> >
> > Co to jest ,,instrukcja w bloku''? Po każdym średniku czy jak?
>
> Przy kazdej potencjalnej zmianie mutable'a, czyli bezposrednio przy tych
> zmianach oraz po powrocie z wywolania funkcji [przepraszam za
> skrzywienie imperatywne, ale mamy tutaj imperatywne konstrukcje no nie
> :) ].
Ok, to czemu nie podłączyć ich pod guarded zmienne?
> Można ewnetualnie rozwazyc propagowanie guardow w glab, tzn. przy
> wywolywaniu funkcji będzie się automatycznie przekazywala lista guardow
> które należy sprawdzac caly czas (to może być przydatne do powiedzenia,
> ze np.. "w calym programie jakas zmienna jest > 0 i < 5".
To ma sens tylko przy przekazywaniu zmiennych przez ref (& w C++). W
innym można podłączyć gurda pod zmienną globalną (statyczna w klasie)
lub pod zmienne pole klasy.
Nie sądzę, żeby ref było używane na tyle często by się tym przejmować.
Wymyślcie mi lepiej jakiś przykład dla zmiennych guarded (globalnych i
lokalnych) oraz dla tranzakcji.
Na razie mam dla ensure/require:
static public factorial (x : int) : int {
require { x >= 1 }
def loop (acc : int, x : int) : int {
require { x >= 1 }
if (x == 1) acc
else loop (x * acc, x - 1)
}
loop (1, x)
ensure { value >= x;
x >= 3 == (value % 3 == 0) }
}
Też średnio dobry.
--
: Michal Moskal :: http://www.kernel.pl/~malekith : GCS {C,UL}++++$ a? !tv
: When in doubt, use brute force. -- Ken Thompson : {E-,w}-- {b++,e}>+++ h
More information about the devel-pl
mailing list