Variable number of parameters

Tue, 11 Mar 1997 23:04:01 +0100 (MET)


Hello, everybody!

According to Frank Heckenbach:
> In news:comp.lang.pascal.borland, there's just a discussion about
> variable number/types of procedure/function parameters going on.

Here are just a few remarks from me to clarify some points; right now I
don't have the time to enter the discussion in comp.lang.pascal.borland.
I'll join you next week (-;unless our news server is down again).

> Not explicitly call itoa(), but (s)he'd have to specify the type by a format 
> specifier ("%d") in the format string. This, of course, provides no means of 
> type checking, and is therefore not suited for Pascal.

I agree; however Borland has had something like this ("Form" procedure) in
Turbo87 3.0 and something similar in Turbo Vision ("FormatStr" procedure),
and you can call C functions like "printf" from GPC using the declaration

    Function Printf ( format: CString; ... ): Integer;

(Yes, with three dots.)

> But this would be a case for default values as in C++. If you could declare
> something like
>  procedure LPP(s:String;segg,off:Word;PPal:PPalettestructure value NIL);
> and call it with wither 3 or 4 parameters (in the former case, the 4th 
> parameter would be implicitly NIL), that would be nice sometimes...

Yes, that would be nice .  But it's work, of course.
Any help welcome!

> I don't think there's anything wrong with it, but Borland will not do it.
> They've dropped TP, face it! So if you want these changes, don't look at
> TP, but perhaps at GNU Pascal.

:-)

> AFAIK, gpc already supports declaring and
> calling a procedure with variable arguments, like C - but only to allow
> calling C functions with varargs. There's not (yet) a way to implement such
> a procedure in Pascal,

Correct.

> but the gpc developers are always looking to enhance
> the language, so if you've got some concrete ideas (or can even help to work
> on the compiler), you're always welcome to join the team.

Correct ** 2.  :-) ;-)

> > Thats not what I where aiming at. You could make the product better,
> > and alas get more satisfied customers. 
> 
> That's how the gpc developers/maintainers feel too, I think.

Correct, too.  With the only difference that we don't get money for our
work on GPC.  (Instead we will get our dream compiler.:)

> > As far as i can remember (this might be wrong) GNU pascal dont have
> > oop. 
> 
> By now, AFAIK, gpc has (nearly) the same OOP as TP, but doesn't implement the
> Object Pascal (not-yet-)standard.

Correct.  It has the "Borland Pascal 7.0 with Object" standard.  Only the
"private" directive and "dynamic methods" (Function Foo; virtual 1234;)
are still missing.

> > >To each his own.  If you want overloading and procedures with variable number of
> > >parameters, then check out languages that support them.  
> > Belive me, I have .. But I really dont like C. Its so.. what should I
> > say..  pee->(wee&&) .. I just dont like it :)
> 
> I don't think that's valid in C (provided there's anything that's not valid in
> C - not sure if there is... :-> ), but I know what you mean. I'd also prefer
> to have the Pascal syntax and yet many of the other features.

I agree - including the try with C++.  That's why I am working on GPC.

However, function and oparator overloading are not new to Pascal.
At least the PXSC standard has this feature.  (You *need* it for
scientific programming!)  Unfortunately I have never seen a working
PXSC compiler, only a book with the standard specifications ...

> > I think that would be a bit to much trouble really. I was just
> > presenting the idea to get a feeling of  other people's thoughts on
> > the matter.
> 
> If you're serious about it, join the gpc mailing list.
> I'll post a copy of this message to the list, since it's quite much about gpc.

:-)

> > Writeln, reset, and a whole bunch of others allready support it. it's
> > just not any way for the -user- to define procedures like that. 
> > 
> > and that is a shame . :) 
> 
> But of course, it's much more difficult to provide a way for the user to
> declare and implement such procedures than to just allow some specially
> handled procedures like Writeln.

Correct.  But it seems that VAX Pascal has solved this problem.  We should
have a look at their solution.

> > [...]

> > One, not very good, would be to require VAR types in function
> > overloading (thats what you called it, right?), like this:
> >         function f(var nr:byte);
> > 
> > This would remove the problem all together, but its not a very
> > flexible way of doing it.
> 
> Quite restricting...

But it already works, in GPC and in Borland Pascal:  Use an untyped
formal `Var' parameter, and use `absolute' variables to access it.
(See my other mail.)

> >As a side note: Doesn't FPK support function overloading?
> [...]
> AME replied: 
> > Either FPK or GNU, I can't remember which. I can't even remember if it
> > was fully implemented.

Implemented in FPK, planned for GNU.

> AFAIK, gpc supports part of the PCSX (Pascal scientific extensions) standard.
> I don't know this standard, and haven't used these extensions, but I think
> there is some kind of overloading. You might want to find out if there were
> any ambiguity problems involved, and how they were solved.

Operator overloading is implemented in GPC; function overloading is
defined in PXSC, planned for GPC.

> To me the point is that the extensions, however implemented, must still allow
> Pascal's strong type checking. (In this example, the type checking was
> annulled by assembler code, type casts or (unnecessarily) untyped pointers,
> I'd guess from what I know about TV.)

Correct.  In TV, they unnecessarily used untyped pointers.  Correct use
of a *carefully* implemented function overloading scheme would not cause
this trouble.

> Sure. And gpc already has compiler switches to ensure that certain features
> are [not] used. All the extensions discussed here would be object to these
> (or additional) switches, too.

Correct.

(I see there is not much need for me to join the discussion directly. ;-)

> At last, I've got some suggestions for the varargs problem, too:
> [...]

Looks nice, but let's first see how VAX Pascal solved the problem.

> Alternatively, it would suffice to allow "array expressions" like:
> 
> procedure varnumargs(p:array of integer); begin ... end;
> 
> var a,b,c:integer;
> begin
>  varnumargs( (a,b,c,2,c-b,27) )
>             {^^^^^^^^^^^^^^^^ array declaration as in a "typed const"}
> end.

This I don't understand.  Parameters like "Var p: array of Integers" *do*
work in GPC (note the `Var'; lower bound is set to zero, upper remains
unchecked; Extended Pascal's schemas will provide a better way to achive
the same functionality.)

> 2. Unknown type of an argument
> 
> Ok, there are untypes arguments in TP, but they don't allow for any type
> checking when used, so they're not suited here. Furthermore, the procedure
> doesn't get any information about the type, so this information would have
> to be passed separately (as in the printf format string in C), which is not
> acceptable.
> 
> So the type must be passed internally, and there must be a way for the
> procedure to check the type, and to access the parameter as its real type.

Objects.

> I could imagine something like the following:
> [...]
> (This syntax is only tentative, it doesn't have to be called IFTYPE and
> CASETYPE.)

Perhaps a good idea, but the type would have to be passed as an (implicit
or explicit) additional parameter anyway, and you can do the cast using
`absolute' variables - which already work.  I am not sure whether it is
worth the effort and the loss of compatibility to other compilers to
implement `iftype' and `casetype'.

> Of course, the SizeOf function would work on a and return the actual size.
> [...]
> One has to investigate if and how this is possible (considering multiple, 
> possibly nested IFTYPEs/CASETYPEs)...

Much work.  Probably too much, sorry ...

> Another idea is whether it is possible and/or useful to compare types of 
> different arguments:
> 
> procedure equal(const a,b);
> begin
>   IFTYPE a,b then {Compare SizeOf(a) bytes at @a and @b}
>   else Error('Comparison of different types not allowed!')
>   {^^^ or again, rather a compiler error...}
> end;

This I don't understand.

> It also seems useful to declare local variables of the same type as an
> argument:
> 
> procedure swap(var a,b);
> var temp:TYPEOF(a);
> begin
>   IFTYPE a,b then begin temp:=a;a:=b;b:=temp end
>   else Error('Swapping different types not allowed!') {see above}
> end;
> 
> (I think, Extended Pascal (gpc???) has some kind of type inquiry, but probably
> only for known types. Anyway, this one could, of course, use the same syntax
> as EP (it's probably not the syntax above, since I don't know the EP syntax).)

It's

    Var
      temp: type of a;

AFAIK, it works only for known types.  But I'm not (yet) an EP expert.

> Concerning the implementation, I'd say that for each "vartype" parameter an
> additional (invisible) parameter is passed that describes the type uniquely.
> Since the compiler has to keep track of all the types somehow anyway, it
> shouldn't be hard to generate a unique number for each type.

It *is* hard.  Consider a large project with many Units/Modules which are
compiled separately ...

> Many ideas... many problems... much to do...

Correct!

> This message is distributed under the terms of the GNU General Public License.
> The license can be retrieved from many ftp and www sites, e.g. from:
> ftp://sunsite.unc.edu/pub/gnu/COPYING
> http://www.mi.uni-erlangen.de/~heckenb/COPYING
> If you can't get this file, mail me, and I'll send you a copy.

:-)

Greetings,

    Peter

  Dipl.-Phys. Peter Gerwinski, Essen, Germany, free physicist and programmer
peter.gerwinski@uni-essen.de - http://home.pages.de/~peter.gerwinski/ [970201]
       maintainer GNU Pascal - http://home.pages.de/~gnu-pascal/ [970125]


Peter Gerwinski (peter@agnes.dida.physik.uni-essen.de)

HTML conversion by Lluís de Yzaguirre i Maura
Institut de Lingüística Aplicada - Universitat "Pompeu Fabra"
e-mail: de_yza@upf.es