[nem-pl] Zmiany składniowe

Michal Moskal malekith at pld-linux.org
Wed Oct 15 16:14:09 CEST 2003


On Wed, Oct 15, 2003 at 03:50:59PM +0200, rzyjontko wrote:
> Michal Moskal napisał:
> >
> >   {
> >     ref x = 3;
> >     while (x < 7) { 
> >       x = x + 1;  // ERROR
> >       foo () 
> >     }
> >   }
> 
> Najpierw taka marginalna uwaga.  Czy
>   ref x <- 3;
> nie byłoby bardziej konsekwentne?

Z jednej strony racja (bo to pierwsze przypisanie), a z drugiej = jest
używane do definicji wartości (a definiujemy nową wartość). Więc nie
wiem.

> Podany błąd jest analogiczny do tych, które powstają w językach bez
> deklaracji zmiennych.  Ale ludzie się czepiają wszystkiego.
> Ostatecznym argumentem zawsze będzie, że Nemerle to nie C#.  Każdy
> manual do Lispa zawiera coś na kształt "common pitfalls in local
> bindings".
> 
> Wydaje mi się, że problemem jest to, że dla zwyczajnego człowieka '='
> wydaje się bardziej naturalne niż <-.  Więc może zamienić '<-' z '='?

Ale <- dobrze obrazuje przypisanie.

Myślałem też nad:

  {
    let ref x = 3; // lub "ref x = 3", lub też '<-' zamiast '='
    let y = x + 3;
    x <- 3;
  }

A czegoś takiego jak "x = 3;" by po prostu nie było. Oczywiście ktoś
może ciągle myśleć, że "let x = 3;" to jest przypisanie, ale teraz już
sam jest sobie winny. Znaczy pomyłkę = vs <- można zrozumieć, ale
dopisanie dodatkowego keyworda, to już jest perwersja ;-)

Zamiast let może jakieś inne słowo, np. val. Na pewno coś krótkiego.

Aha, żeby nie było wątpliwości czym różni się "let x = 3;" od 
"let x = 3 in", to:

  let x = foo () in {
    x#bar <- 3;
    let y = bar (x) in {
      y#qux <- 7;
      (x, y)
    }
  }

vs:

  {
    val x = foo ();
    x#bar <- 3;
    val y = bar (x);
    y#quc <- 7;
    (x, y)
  }

-- 
: 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