<head>
        <title></title>
</head>
<body>
<div class="userStyles" style=" font-family: Arial; font-size: 12pt; color: #000000;"> 
<footer class="signatureContainer" style="display:inline;">Oberon, like Modula-2 and PASCAL before it, is a nested-scope language.<br>
<br>
The disagreement appears to originate with August Karlstrom's statement that "... in the Oberon-07 language report the module would not be valid since in<br>
Oberon-07 we cannot access intermediate scopes."  I do not find verbiage to that effect in the language report, cited below.<br>
<br>
In the example at hand, as I read "In addition to its formal parameters and locally declared objects, the objects declared globally are also visible in the procedure." on page 12 of the Oberon-07 report at <a href="https://people.inf.ethz.ch/wirth/Oberon/Oberon07.Report.pdf">Microsoft Word - Oberon07.Report.doc (ethz.ch)</a>, items declared at module M scope are visible inside Q, as are items declared at procedure M.P scope.<br>
<br>
The fully-qualified scope names would be:<br>
<br>
   M<br>
   M.P<br>
   M.P.Q<br>
<br>
The scope M.P.Q, i.e. recursive procedure Q, is entirely contained in procedure scope M.P.  As such, anything declared in M.P is visible to M.P.Q.  Q, standing alone, is unambiguous, i.e., it can only refer to M.P.Q.  As it is called from within M.P.Q, it is a recursive invocation.<br>
<br>
It is important to remember that Wirth et al valued pragmatics as well as pure theory.  When the pure theory and the pragmatics disagree, they would expend the necessary effort to make them agree.<br>
<br>
--John R. Strohm</footer>

<footer class="replyforwardcontainer"><br>
<br>
<span>On Sun, 10 Dec 2023 14:17:54 +0100, August Karlstrom <fusionfile@gmail.com> wrote:</span><br>
<br>
On 2023-12-10 11:19, Diego Sardina wrote:<br>
> For me it's still unambiguous.<br>
<br>
OK, let's take it one more time from the start. The question is whether<br>
this is a valid (although meaningless) module in Oberon-07:<br>
<br>
MODULE M;<br>
<br>
   PROCEDURE P;<br>
      PROCEDURE Q;<br>
         BEGIN<br>
            Q<br>
         END Q;<br>
   END P;<br>
<br>
END M.<br>
<br>
There are three scopes in this module:<br>
<br>
1. the global scope of M<br>
2. the local scope of P<br>
3. the local scope of Q.<br>
<br>
P is declared in the global scope of M, Q is declared in the local scope<br>
of P and nothing is declared in the local scope of Q. Without the sentence<br>
<br>
"The use of the procedure identifier in a call within its declaration<br>
implies recursive activation of the procedure."<br>
<br>
in the Oberon-07 language report the module would not be valid since in<br>
Oberon-07 we cannot access intermediate scopes; Q is called in the local<br>
scope of Q (where nothing is defined) and the global scope has only P so<br>
no Q in sight.<br>
<br>
Now, the quoted sentence above can be read as<br>
<br>
A) an exception to the usual scope rules (in which the module is valid) or<br>
<br>
B) a rule which doesn't "violate" the scope rules (in which the module<br>
is invalid) and which implies that only global procedures can call<br>
themselves.<br>
<br>
If I understand you correctly, Diego, you interpret it as A. The third<br>
possibility is that I'm wrong about "each identifier exists in exactly<br>
one scope"; can Q exist both in the local scope of P *and* in the local<br>
scope of Q?<br>
<br>
Please, tell me where I'm wrong in my reasoning.<br>
<br>
> Did you try that in Project Oberon 2013?<br>
<br>
Yes, the module is accepted by the Project Oberon compiler but on the<br>
other hand this compiler accepts a few other things which is in conflict<br>
with the language report such as for instance structural equivalence of<br>
arrays.<br>
<br>
<br>
/August<br>
--<br>
Oberon@lists.inf.ethz.ch mailing list for ETH Oberon and related systems<br>
https://lists.inf.ethz.ch/mailman/listinfo/oberon<br>
 </footer>
</div>


</body>