[fpc-pascal] Feature announcement: Generic functions, procedures and methods
leledumbo
leledumbo_cool at yahoo.co.id
Sat Nov 21 19:09:13 CET 2015
Congratulations! Nice work, Sven.
It's a bit weird to see the specialize in the middle of an expression but
that's not a problem for me. The one that needs explanation is "complex
expressions", what's the minimum requirement for an expression to be called
complex for this case?
Sven Barth-2 wrote
> Hello together!
>
> I'm pleased to finally announce the addition of generic functions,
> procedures and methods (collectively called "routines") to Free Pascal
> which allows writing type safe methods that can be used for multiple
> types.
>
> Syntax:
>
> The syntax for declaring a generic routine is similar to declaring a
> normal routine and also includes support for class methods:
>
> generic [class] (procedure|function)
> IDENTIFIER
> <TYPEARGLIST>
> [(PARAMETERLIST)][: RESULTTYPE]; MODIFIERS;
>
> For the TYPEARGLIST the same rules apply as for generic types. Type
> parameters declared in the TYPEARGLIST might be used in the
> PARAMETERLIST, the RESULTTYPE and of course the body of the routine.
>
> Generic routines can be overloaded both by TYPEARGLIST and PARAMETERLIST.
>
> To call a generic routine you use the following syntax:
>
> specialize IDENTIFIER
> <TYPELIST>
> [(PARAMETERS)]
>
> For the TYPELIST the same rules apply as for specializing a generic type.
> If the routine is part of a type or variable or you're using a unit
> name to distinguish a generic routine you need to put that before the
> "specialize":
>
> TYPENAME.specialize IDENTIFIER
> <TYPELIST>
> [(PARAMETERS)]
> VARIABLE.specialize IDENTIFIER
> <TYPELIST>
> [(PARAMETERS)]
> UNITNAME.specialize IDENTIFIER
> <TYPELIST>
> [(PARAMETERS)]
>
> Calls to generic routines are normal factors so they can be used as such
> as the following example shows:
>
> === example begin ===
>
> {$mode objfpc}
>
> generic function Add
> <T>
> (aLeft, aRight: T): T;
> begin
> Result := aLeft + aRight;
> end;
>
> begin
> Writeln(specialize Add
> <String>
> ('Generic ', 'routines') + specialize
> Add
> <String>
> (' with ', 'Free Pascal'));
> end.
>
> === example end ===
>
> Delphi compatibility:
>
> Of course this future is also implemented in a Delphi-compatible way for
> the Delphi modes. There the syntax for declaring a generic function is
> like this:
>
> [class] (procedure|function) IDENTIFIER
> <TYPELIST>
> [(PARAMETERLIST)][:
> RETURNTYPE]; MODIFIERS;
>
> So merely the "generic" keyword is missing. This is analogous when
> calling a generic routine:
>
> IDENTIFIER
> <TYPELIST>
> [(PARAMETERS)]
>
> Because of the missing "specialize" keyword that mark specializations
> complex expressions *do not* work in mode Delphi yet. So assignments of
> function results are okay, but other than that you'll likely encounter
> compiler errors.
>
> Please note that unlike Delphi we *do* support global generic
> functions/procedures even in Delphi mode.
>
> Limitations/ToDos:
>
> The feature is not yet finished and there are some limitations that yet
> need to be overcome or parts that simply don't work yet, this includes,
> but is not necessarily limited to:
>
> - support for complex expressions in Delphi modes (applies to type
> specializations as well)
> - support for pointers to generic routines (this will currently result
> in errors at the best case and internal errors or exceptions at the worst)
> - support for the return value in modes without support for "Result"
> - support for nested generics, most importantly generic methods inside
> generic classes
>
> So please test and report any bugs in the bug tracker. Questions can of
> course be asked here on the mailing list (no, this feature won't be part
> of FPC 3.0.0).
>
> Regards,
> Sven
> _______________________________________________
> fpc-pascal maillist -
> fpc-pascal at .freepascal
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
--
View this message in context: http://free-pascal-general.1045716.n5.nabble.com/Feature-announcement-Generic-functions-procedures-and-methods-tp5723106p5723108.html
Sent from the Free Pascal - General mailing list archive at Nabble.com.
More information about the fpc-pascal
mailing list