Difference between revisions of "With"
From Free Pascal wiki
Jump to navigationJump to search (Created page with "{{With}} The reserved word <syntaxhighlight lang="pascal" enclose="none">with</syntaxhighlight> allows a shortened spelling of records. It is on...") |
(trying to determine where there is spam) |
||
Line 1: | Line 1: | ||
{{With}} | {{With}} | ||
− | The [[Reserved word|reserved word]] <syntaxhighlight lang="pascal" enclose="none">with</syntaxhighlight> | + | The [[Reserved word|reserved word]] <syntaxhighlight lang="pascal" enclose="none">with</syntaxhighlight> allows overriding the scope lookup routing for named scopes for the duration of one statement. |
− | + | == routing == | |
− | <syntaxhighlight> | + | [[Identifier]]s are searched in the following order, until there is a hit: |
− | + | # current [[Block|block]] | |
− | + | # enclosing block, if any | |
− | + | # the block enclosing the enclosing block, if any | |
− | + | # … (and so on) | |
− | + | # the most recently imported module, that means for instance the [[Unit|unit]] that appears at the end of the [[Uses|<syntaxhighlight lang="pascal" enclose="none">uses</syntaxhighlight>-clause]] list, if any | |
− | + | # the penultimate module that has been imported, if any | |
− | + | # … (and so on) | |
+ | # the first imported module, that means for instance the first unit appearing in a <syntaxhighlight lang="pascal" enclose="none">uses</syntaxhighlight>-clause, if any | ||
+ | # the [[System unit|system unit]] (unless implicit inclusion has been disabled) | ||
− | + | == override == | |
− | + | The lookup order can be temporarily overridden with a <syntaxhighlight lang="pascal" enclose="none">with</syntaxhighlight>-clause. | |
+ | It looks like this: | ||
+ | <syntaxhighlight lang="pascal"> | ||
+ | with namedScope do | ||
+ | begin | ||
+ | … | ||
+ | end; | ||
+ | </syntaxhighlight> | ||
+ | This puts <syntaxhighlight lang="pascal" enclose="none">namedScope</syntaxhighlight> at the top of the routing. | ||
+ | Identifiers are looked up in <syntaxhighlight lang="pascal" enclose="none">namedScope</syntaxhighlight> first, before other scopes are considered. | ||
− | + | <syntaxhighlight lang="pascal" enclose="none">namedScope</syntaxhighlight> may be | |
− | + | * the name of a [[Unit|<syntaxhighlight lang="pascal" enclose="none">unit</syntaxhighlight>]] that has previously been imported via a [[Uses|<syntaxhighlight lang="pascal" enclose="none">uses</syntaxhighlight>-clause]] in the current section | |
+ | * the name of a structured variable, that has named fields, i. e. | ||
+ | ** a [[Record|<syntaxhighlight lang="pascal" enclose="none">record</syntaxhighlight>]] | ||
+ | ** [[Object|<syntaxhighlight lang="pascal" enclose="none">object</syntaxhighlight>]], or | ||
+ | ** [[Class|<syntaxhighlight lang="pascal" enclose="none">class</syntaxhighlight>]]. | ||
− | + | If multiple <syntaxhighlight lang="pascal" enclose="none">with</syntaxhighlight>-clauses ought to be nested, there is the short notation: | |
− | + | <syntaxhighlight lang="pascal"> | |
− | + | with snakeOil, sharpTools do | |
− | + | begin | |
+ | … | ||
+ | end; | ||
+ | </syntaxhighlight>which is equivalent to:<syntaxhighlight lang="pascal"> | ||
+ | with snakeOil do | ||
+ | begin | ||
+ | with sharpTools do | ||
+ | begin | ||
+ | … | ||
+ | end; | ||
+ | end; | ||
+ | </syntaxhighlight> | ||
− | + | Note, [[Begin|<syntaxhighlight lang="pascal" enclose="none">begin</syntaxhighlight>]]-[[End|<syntaxhighlight lang="pascal" enclose="none">end</syntaxhighlight>]] are not part of the syntax, but <syntaxhighlight lang="pascal" enclose="none">with</syntaxhighlight> … [[Do|<syntaxhighlight lang="pascal" enclose="none">do</syntaxhighlight>]] has to be followed by exactly ''one'' statement. | |
− | + | In practice this will always be a compound statement, though. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |
Revision as of 13:07, 22 August 2019
The reserved word with
allows overriding the scope lookup routing for named scopes for the duration of one statement.
routing
Identifiers are searched in the following order, until there is a hit:
- current block
- enclosing block, if any
- the block enclosing the enclosing block, if any
- … (and so on)
- the most recently imported module, that means for instance the unit that appears at the end of the
uses
-clause list, if any - the penultimate module that has been imported, if any
- … (and so on)
- the first imported module, that means for instance the first unit appearing in a
uses
-clause, if any - the system unit (unless implicit inclusion has been disabled)
override
The lookup order can be temporarily overridden with a with
-clause.
It looks like this:
with namedScope do
begin
…
end;
This puts namedScope
at the top of the routing.
Identifiers are looked up in namedScope
first, before other scopes are considered.
namedScope
may be
- the name of a
unit
that has previously been imported via auses
-clause in the current section - the name of a structured variable, that has named fields, i. e.
If multiple with
-clauses ought to be nested, there is the short notation:
with snakeOil, sharpTools do
begin
…
end;
which is equivalent to:
with snakeOil do
begin
with sharpTools do
begin
…
end;
end;
Note, begin
-end
are not part of the syntax, but with
… do
has to be followed by exactly one statement.
In practice this will always be a compound statement, though.