[fpc-pascal] How can I implement "thrice" in Free Pascal?
Sven Barth
pascaldragon at googlemail.com
Mon Oct 31 09:20:23 CET 2011
Am 31.10.2011 08:52, schrieb Andrew Pennebaker:
> paycheck.pas:
>
> unit Paycheck;
> interface
> type
> generic TArray<T> = array of T;
> generic TFn<T> = function() : T;
> function GenInt () : TFn<integer>;
> function GenBool() : TFn<boolean>;
> function GenChar() : TFn<char>;
> function GenArray(gen : TFn<T>) : TArray<T>;
> function GenString() : TFn<string>;
> { ... }
>
> I'm getting compiler errors for the generics.
>
> $ fpc example.pas
> Free Pascal Compiler version 2.7.1 [2011/10/31] for i386
> Copyright (c) 1993-2011 by Florian Klaempfl and others
> Target OS: Darwin for i386
> Compiling example.pas
> Compiling paycheck.pas
> paycheck.pas(6,25) Error: Generics without specialization cannot be used
> as a type for a variable
> paycheck.pas(6,25) Fatal: Syntax error, ";" expected but "<" found
> Fatal: Compilation aborted
Ok, you're experiencing two different problems here:
1. you are trying to do inline specializations in the functions
"GenInt", "GenBool", "GenChar" and "GenString". This is not supported in
mode "ObjFPC". You need to use "{$mode delphi}" instead (though I don't
know whether this will indeed work in trunk).
2. Your function "GenArray" is a generic function. These are not yet
supported by FPC (they are on my ToDo list though). Once they are
implemented your declaration will need to look like this:
function GenArray<T>(gen: TFn<T>): TArray<T>;
And you will call them like this:
function Foo: Integer;
...
var
intarray: TArray<Integer>;
begin
intarray := GenArray<Integer>(@Foo);
end.
This does NOT work yet.
Regards,
Sven
More information about the fpc-pascal
mailing list