[nem-pl] Re: C# => Nemerle

Michal Moskal malekith at pld-linux.org
Fri Mar 26 23:30:31 CET 2004


On Fri, Mar 26, 2004 at 10:04:54PM +0100, Ryszard Trojnacki wrote:
> Czesc
> 
> Mam specyfikacje C# 1.2 (czy mam to robic na wersje 2.0?).

Lepiej 2.0 (bo zawiera 1.2), ale prościej 1.2 (bo jest prostsze :-).
Albo zaczynasz od 1.2 i kiedyś robisz 2.0, albo ,,kiedyś'' nie
następuje, albo robisz od razu 2.0. Wybór należy do Ciebie :-)

> Analizujac ja mam kilka pytan:
> - C# jest preprocesor, ktory umozliwia podobne jak w C/C++ uzywanie.
> (sekcja specyfikacji B.1.10), co z tym zrobic? Domyslam sie ze mozna
> to zrobic jako makro, lub makra popisac do kazdej opcji preprocesora -
> czy tak to robic?

Ten preprocessor to głównie do warunkowej kompilacji? W Nemerle też taki
będzie. Albo będzie jako projekt, albo sam go dopisze jak znajdę
godzinkę.

> - czy break/continue nie moze byc makrem? - tj. rozszrzyc, lub obrac w
> makro petle oblsugujace te polecenia, tak aby break wywolywal wyjatek,
> ktory w konu petli byl by wylapywany - przykladowe uzycie to wygladalo
> by jakos tak (bez mark):
> try {  // wylapywanie wyjatku "break"
>   while(warunek) {
>     try {  // wylapywanie wyjatku "continue"
>       "skopiowany kod" z oryginalen petli
>     } with {
>       | e : CSharpToNemerle.Continue => ()
>     }
>   }
> } with {
>   | e : CSharpToNemerle.Break => ()
> }
> W ten sposub - ubierajac to w makro (rozszerzajac) makro while bylo by
> to wykonane w sposub bardzo czytelny.

continue za pomocą wyjątków jest nie dopuszczalne ze względu na
efektywność. Wyjątki są w .NET dość drogie. Co do continue -- jeśli jest
na najwyższym poziomie zagnieżdżenia ifów to można je zrobić bez żadnych
problemów:

	while (cond) {
	  expr1;
	  if (cond2) continue;
	  expr2;
	}

na:

	while (cond) {
	  expr1;
	  if (cond2) {}
	  else {
	    expr2; 
	  }
	}

break jest trochę trudniej -- trzeba dodać zmienną:

	mutable loop_goes <- false;
	while (loop_goes && cond) {
	  expr1;
	  if (cond2) { loop_goes <- false }
	  else {
	    expr2;
	  }
	}

albo alternatywnie:

	def loop () {
	  if (cond) {
	    expr1;
	    if (cond2) {}
	    else {
	      expr2;
	      loop ();
	    }
	  } else {}
	};
	loop ();

Ale to chyba nie jest najlepszy pomysł. Znaczy teraz jest niby
funkcjonalnie, ale mechaniczne przepisywanie imperatywnego kodu w sposób
funkcjonalny chyba nie robi mu najlepiej.

Dla bardziej zagnieżdżonych przypadków trzeba więcej zmiennych, co robi
się mało czytelne. Ale na szczęście takie przypadki są raczej
marginalne.

> Przeanalizowalem cala specyfikacje gramatyczna C# i mysle ze bardzo
> ladnie bylo by ja cala przepisac do Nermele i bezposrednio z niej
> konwertowac.
> Wiec program nie bylby jakos "boski" czy cos, ale mysle ze byl by
> czytleny i wlasciwie nic by sie nie pominelo... 

I o to chodzi :-)

> (choc mam tam kilka watpliwosci co do tej specyfikacji).
>
> Jezeli takie rozwiazania pasuja, to moge zabrac sie do kodowania.
> I jaki format przyjac kodowania, komentowania? - tak jak jest w
> plikach dolaczonych do Nemerle?

Hm, byle spójnie :) A wyjście na jakimś podstawowym poziomie mogło by
być konfigurowalne (trzy parametry na krzyż -- stopień wcięć, czy robić
newline po else i takie tam, zresztą możesz to na razie olać).

> Jezeli chodzi o contiune i break, to mozna z wyjatkami, ale jezeli
> chodzi o goto to pozostaje tylko to co jest w tym dokumencie co
> dostalem od Ciebie.
> 
> Mysle ze pozostale watpliwosci wyjda juz przy pisaniu testowaniu.
> Co do goto nie widze dla niego mozliwosci w chwili obecnej do
> rozmiwazania typu wyjatki, gdyz goto moze byc uzywane poza jedna
> struktura - jest calkowicie nie strukturalne.

Wyjątki tak czy inaczej odpadają (efaktywność...)

-- 
: Michal Moskal :: http://www.kernel.pl/~malekith :: GCS !tv h e>+++ b++
: When in doubt, use brute force. -- Ken Thompson :: UL++++$ C++ E--- a?




More information about the devel-pl mailing list