Open main menu
Home
Random
Recent changes
Special pages
Community portal
Preferences
About Wikipedia
Disclaimers
Incubator escapee wiki
Search
User menu
Talk
Dark mode
Contributions
Create account
Log in
Editing
Man or boy test
(section)
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
==Explanation== There are three Algol features used in this program that can be difficult to implement properly in a compiler: # '''[[Nested function]] definitions''': Since ''B'' is being defined in the local context of ''A'', the body of ''B'' has access to symbols that are local to ''A'' β most notably ''k'', which it modifies, but also ''x1'', ''x2'', ''x3'', ''x4'', and ''x5''. This is straightforward in the Algol descendant [[Pascal (programming language)|Pascal]], but not possible in the other major Algol descendant [[C (programming language)|C]] (without manually simulating the mechanism by using C's address-of operator, passing around pointers to local variables between the functions). # '''[[Function reference]]s''': The ''B'' in the recursive call <code>A(k, B, x1, x2, x3, x4)</code> is not a call to ''B'', but a reference to ''B'', which will be called only when ''k'' is greater than zero. This is straightforward in standard Pascal ([[ISO 7185]]), and also in C. Some variants of Pascal (e.g. older versions of [[Turbo Pascal]]) do not support procedure references, but when the set of functions that may be referenced is known beforehand (in this program it is only ''B''), this can be worked around. # '''Constant/function dualism''': The ''x1'' through ''x5'' parameters of ''A'' may be numeric constants or references to the function ''B'' β the <code>x4 + x5</code> expression must be prepared to handle both cases as if the formal parameters ''x4'' and ''x5'' had been replaced by the corresponding actual parameter ([[call by name]]).<ref>{{Cite journal |last=Wichmann |first=B. A. |date=1972-02-01 |title=Five ALGOL Compilers |url=https://academic.oup.com/comjnl/article-lookup/doi/10.1093/comjnl/15.1.8 |journal=The Computer Journal |language=en |volume=15 |issue=1 |page=8 |doi=10.1093/comjnl/15.1.8 |issn=0010-4620|url-access=subscription }}</ref> This is probably more of a problem in [[statically typed]] languages than in dynamically typed languages, but the standard workaround is to reinterpret the constants 1, 0, and β1 in the main call to ''A'' as functions without arguments that return these values. These things are, however, not what the test is about; they are merely prerequisites for the test to at all be meaningful. What the test is ''about'' is whether the different references to ''B'' resolve to the ''correct'' instance of ''B'' β one that has access to the same ''A''-local symbols as the ''B'' that created the reference. A "boy" compiler might, for example, instead compile the program so that ''B'' always accesses the topmost ''A'' call frame.
Edit summary
(Briefly describe your changes)
By publishing changes, you agree to the
Terms of Use
, and you irrevocably agree to release your contribution under the
CC BY-SA 4.0 License
and the
GFDL
. You agree that a hyperlink or URL is sufficient attribution under the Creative Commons license.
Cancel
Editing help
(opens in new window)