Difference between revisions of "With"

From Free Pascal wiki
Jump to navigationJump to search
(add more non-spam)
(→‎Routing: update source code link)
 
(7 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{With}}
+
{{with}}
  
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.
+
The [[Reserved word|reserved word]] <syntaxhighlight lang="pascal" inline>with</syntaxhighlight> allows overriding the scope lookup routing for named scopes for the duration of one [[statement]].
 +
 
 +
== Routing ==
  
== routing ==
 
 
[[Identifier]]s are searched in the following order, until there is a hit:
 
[[Identifier]]s are searched in the following order, until there is a hit:
 +
 
# current [[Block|block]]
 
# current [[Block|block]]
 
# enclosing block, if any
 
# enclosing block, if any
 
# the block enclosing the enclosing block, if any
 
# the block enclosing the enclosing block, if any
 
# … (and so on)
 
# … (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 most recently imported module, that means for instance the [[Unit|unit]] that appears at the end of the [[Uses|<syntaxhighlight lang="pascal" inline>uses</syntaxhighlight>-clause]] list, if any
 
# the penultimate module that has been imported, if any
 
# the penultimate module that has been imported, if any
 
# … (and so on)
 
# … (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 first imported module, that means for instance the first unit appearing in a <syntaxhighlight lang="pascal" inline>uses</syntaxhighlight>-clause, if any
 +
# additional automatically loaded units, for example, in a [[Program|<syntaxhighlight lang="pascal" inline>program</syntaxhighlight>]] if enabled, the [[heaptrc|<syntaxhighlight lang="pascal" inline>heapTrc</syntaxhighlight> unit]] (see procedure {{gitlab|repository|FPC|release_3_2_0/compiler/pmodules.pas#L318-L412|<syntaxhighlight lang="pascal" inline>loaddefaultunits</syntaxhighlight> in <syntaxhighlight lang="text" inline>compiler/pmodules.pas</syntaxhighlight>}} for a full list)
 
# the [[System unit|system unit]] (unless implicit inclusion has been disabled)
 
# the [[System unit|system unit]] (unless implicit inclusion has been disabled)
  
== override ==
+
== Override ==
The lookup order can be temporarily overridden with a <syntaxhighlight lang="pascal" enclose="none">with</syntaxhighlight>-clause.
+
 
It looks like this:
+
The lookup order can be temporarily overridden with a <syntaxhighlight lang="pascal" inline>with</syntaxhighlight>-clause. It looks like this:
 +
 
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
 
with namedScope do
 
with namedScope do
Line 24: Line 28:
 
end;
 
end;
 
</syntaxhighlight>
 
</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
+
This puts <syntaxhighlight lang="pascal" inline>namedScope</syntaxhighlight> at the top of the routing.
* 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
+
Identifiers are looked up in <syntaxhighlight lang="pascal" inline>namedScope</syntaxhighlight> first, before other scopes are considered.
* 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" inline>namedScope</syntaxhighlight> may be
 +
* the name of a [[Unit|<syntaxhighlight lang="pascal" inline>unit</syntaxhighlight>]] that has previously been imported via a [[Uses|<syntaxhighlight lang="pascal" inline>uses</syntaxhighlight>-clause]] in the current section
 +
* the name of a structured variable, that could have named members, i. e.
 +
** a [[Record|<syntaxhighlight lang="pascal" inline>record</syntaxhighlight>]]
 +
** [[Object|<syntaxhighlight lang="pascal" inline>object</syntaxhighlight>]], or
 +
** [[Class|<syntaxhighlight lang="pascal" inline>class</syntaxhighlight>]].
 +
 
 +
If multiple <syntaxhighlight lang="pascal" inline>with</syntaxhighlight>-clauses ought to be nested, there is the short notation:
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
 
with snakeOil, sharpTools do
 
with snakeOil, sharpTools do
Line 50: Line 55:
 
</syntaxhighlight>
 
</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.
+
Note, [[Begin|<syntaxhighlight lang="pascal" inline>begin</syntaxhighlight>]]-[[End|<syntaxhighlight lang="pascal" inline>end</syntaxhighlight>]] are not part of the syntax, but <syntaxhighlight lang="pascal" inline>with</syntaxhighlight> [[Do|<syntaxhighlight lang="pascal" inline>do</syntaxhighlight>]] has to be followed by exactly ''one'' statement.
 
In practice this will always be a compound statement, though.
 
In practice this will always be a compound statement, though.
  
== see also ==
+
== See also ==
 +
 
 
* [[Namespaces|namespaces]]
 
* [[Namespaces|namespaces]]

Latest revision as of 01:35, 7 December 2021

Deutsch (de) English (en) suomi (fi) русский (ru)

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:

  1. current block
  2. enclosing block, if any
  3. the block enclosing the enclosing block, if any
  4. … (and so on)
  5. the most recently imported module, that means for instance the unit that appears at the end of the uses-clause list, if any
  6. the penultimate module that has been imported, if any
  7. … (and so on)
  8. the first imported module, that means for instance the first unit appearing in a uses-clause, if any
  9. additional automatically loaded units, for example, in a program if enabled, the heapTrc unit (see procedure loaddefaultunits in compiler/pmodules.pas for a full list)
  10. 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 a uses-clause in the current section
  • the name of a structured variable, that could have named members, 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 withdo has to be followed by exactly one statement. In practice this will always be a compound statement, though.

See also