vesii
vesii

Reputation: 3128

Using the TYPE keyword in Pascal

I'm trying to understand the definition of the keyword TYPE in pascal. I understand that typedef in C just gives a new name to the type (alasing). But as I understand TYPE in Pascal does not work that way. It will create a new unique type.

I was trying to search and create a simple example which shows the mechanism of TYPE. I tried to create an example which creates some types and a function. After that, it pass each time one of the types to that function. It should fail because the function should get only one type, which proves that those types are not just aliasing. Due to my lack of knowledge of Pascal syntax, I failed each time.

Could you share a simple short program which proves the power of TYPE?

EDIT:

I have created the following example:

program Check;
TYPE
    Meters = Real; Seconds = Real;

VAR
    m: Meters; s: Seconds;

Procedure PRINT_SEC(s: Seconds);
    Begin
        WriteLn(s, ' sec');
    end;

Begin
    PRINT_SEC(s);
    PRINT_SEC(m);
end.

Output:

0.0000000000000000E+000 sec
0.0000000000000000E+000 sec

But why it does not fail? I passed m which has type Meters no? Also, How can I initialize those variables?

Upvotes: 2

Views: 1456

Answers (2)

LU RD
LU RD

Reputation: 34889

Variables like m and s are defined by a type. In this case both types origins from a real type. That is called a type alias. They are compatible, both as a type and by assignment.

If you want a distinct type (in Freepascal and delphi), define:

type Seconds = type real; 

That would have made the print procedure to only accept the Seconds type argument. Note that variables of Seconds and Meters declared as distinct types still are assignment compatible.

To initialize variables, just assign a value:

s := 42.0;

Note: most types are named starting with a T. Like TSeconds. Just to distinct them from variables. It is a common convention (in pascal).

Upvotes: 3

Stuart
Stuart

Reputation: 1438

First a minor point, in Pascal, the keyword TYPE does not create types. The keyword TYPE must occur before type definitions, but it is the type definitions which MAY create types. Not all type definitions create types.

The Pascal Standard says the following:

A type-definition shall introduce an identifier to denote a type.

which means a type definition introduces (i.e. creates or redefines) an identifier which denotes (i.e. is an alias for) a type.

The Pascal Standard defines a type definition as:

type-definition = identifier '=' type-denoter

type-denoter = type-identifier | new-type

new-type = new-ordinal-type | new-structured-type | new-pointer-type

Which means that a type definition is a identifier, followed by the equal side, followed by a type denoter. A type denoter is either a type identifier or a new type.

So a type identifier introduces an identifier that denotes (i.e. is an alias for) either another type identifier or a new-type. A type is created only in the case where the type denoter is a new type.

So in your example:

TYPE
    Meters = Real; Seconds = Real;

The type denoter in both type definitions is the type identifier Real, so Meters and Seconds are both aliases for Real.

Yes, in Pascal, Real is not a Type, it is a built-in type identifier for the real type.

The Pascal Standard says

The required type identifier real shall denote the real-type.

So real is actually a type identifier and not a type. It is as if, there is an invisible type definition.

TYPE
    Real = real-type;

where real-type is the actual real type.

Upvotes: 4

Related Questions