[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