[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