[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