[nem-pl] Kilkla temacików

Michal Moskal malekith at pld-linux.org
Sun Jan 4 17:40:40 CET 2004


On Sun, Jan 04, 2004 at 12:48:45PM +0100, Kamil Skalski wrote:
> u nas musiałoby to wyglądać
> f (params l : array(int)) : void
> ew.
> f (params l : list(int)) : void
> 
> (dodanie słowa kluczowego 'params' nie podoba mi się za bardzo...)

Albo f (.. l : array (int)). Ale nie wiem. Wersję z list bym sobie
darował, tak, żeby na zewnątrz była widoczna zawsze tylko wersja z tablicą
(zgodna z CLS).

> > 2. zrobić jakiś hack w parserze, że jak widzi "macro ... syntax ..." to
> >    wtedy już dodaje regułę. problem: makra muszą być sparsowane przed
> >    funkcjami, które z nich korzystają, o co musi zatroszczyć się
> >    użytkownik (kolejność plików i funkcji w nich).
> 
> No właśnie o czymś takim myślałem i to nie jest aż taki hack. W H. nie takie 
> hacki mają ;)
> Ale najładniej byłoby dodać jeden przebieg do kompilacji, który wyłapałby 
> wszystkie macra i pododawał rozszerzenia składniowe.

Osobny przebieg *parsowania*. Zauważ, że musiałbyś mieć hack w rodzaju
liczenia otwartych/zamkniętych nawiasów zamiast normalnego parsowania
(bo nie wiesz, że masz np. takie while jakoś inaczej parsować). 

Dodatkowo wpłynie to negatywnie na czas *każdej* kompilacji, nie ważne
czy tworzącej makra czy nie (a pewnie większość będzie takich, które
makr nie tworzą).

> Jeszcze jedna sprawa - opcjonalne parametry.
> assert (cond : expr, message : string_lit = "") { .. }
> To w ogóle byłoby fajne, a cytuję:
> "C# doesn???t provide a way of directly doing so, despite the fact that VB.NET 
> and .NET???s attribute system both support this functionality. This is a 
> subject of some debate currently in the C# community."
> 
> Myślę, że możemy zrobić to po prostu tak jak w C++

W C++ o ile się orientuje opcjonalne argumenty są przekazywane z
call-site. Tzn. foo (bar) jest zmieniane na foo (bar, ""). My moglibyśmy
przeładować foo (znaczy wygenerować funkcję foo (x) { foo (x, "") }).
Problem może być jednak taki, że takich przeładowań trzeba wykładniczo
dużo względem liczby argumentów (w C++ jest ich tylko liniowo dużo bo
argumenty można opuszczać tylko od końca, podczas gdy u nas przez
keyword parameters dałoby się też ze środka). Więc chyba lepiej tak jak
w C++.

Można też zastanowić się nad oróżnieniem foo (bar) od foo (bar, "")
(tj.  nie podania default argumentu, od padania go akurat w formie
defaultowej). Można by to kodować jako option. Ale to nie ma chyba
głębszego sensu.

Oczywiście opcjonalne argumenty w makrach to tylko kwestia składni i
jakiegoś preprocessingu.

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