Nesting (computing)
Organization of information or objects into (usually self-similar) layers
- 6 min read
- 3 chapters
Related on Lably
Through Computer science, Object (computer science) and Self-similarity
Terminology
Nesting can mean:
- nested calls:
- using several levels of subroutines
- recursive calls
- nested levels of parentheses in arithmetic expressions
- nested blocks of imperative source code such as nested if-clauses, while-clauses, repeat-until clauses etc.
- information hiding:
- nested function definitions with lexical scope
- nested data structures such as records, objects, classes, etc.
- nested virtualization, also called recursive virtualization: running a virtual machine inside another virtual machine
Sign in to keep reading
2 more chapters are free with a Lably account.
In spreadsheets
In a spreadsheet functions can be nested one into another, making complex formulas. The function wizard of the OpenOffice.org Calc application allows to navigate through multiple levels of nesting, letting the user to edit (and possibly correct) each one of them separately.
For example:
=IF(SUM(C8:G8)=0,"Y","N")
In this Microsoft Excel formula, the SUM function is nested inside the IF function. First, the formula calculates the sum of the numbers in the cells from C8 to G8. It then decides whether the sum is 0, and it displays the letter Y if the sum is 0, and the letter N if it is not.
Naturally, to allow the mathematical resolution of these chained (or better: nested) formulas, the inner expressions must be previously evaluated, and this outward direction is essential because the results that the internal functions return are temporarily used as entry data for the external ones.
Due to the potential accumulation of parentheses in only one code line, editing and error detecting (or debugging) can become somehow awkward. That is why modern programming environments -as well as spreadsheet programs- highlight in bold type the pair corresponding to the current editing position. The (automatic) balancing control of the opening and closing parenthesis is known as brace match checking.
With current Excel versions, LAMBDA functions can be used to create named custom functions in a formula and call the functions recursively.
In programming
Control structures
In structured programming languages, nesting is related to the enclosing of control structures one into another, usually indicated through different indentation levels within the source code, as it is shown in this simple BASIC function:
<span id="mwSw"></span><span class="k" id="mwTA">function</span><span class="w" id="mwTQ"> </span><span class="nf" id="mwTg">LookupCode</span><span class="p" id="mwTw">(</span><span class="n" id="mwUA">sCode</span><span class="w" id="mwUQ"> </span><span class="ow" id="mwUg">as</span><span class="w" id="mwUw"> </span><span class="kt" id="mwVA">string</span><span class="p" id="mwVQ">)</span><span class="w" id="mwVg"> </span><span class="ow" id="mwVw">as</span><span class="w" id="mwWA"> </span><span class="kt" id="mwWQ">integer</span> <span class="w" id="mwWg"> </span><span class="k" id="mwWw">dim</span><span class="w" id="mwXA"> </span><span class="n" id="mwXQ">iReturnValue</span><span class="w" id="mwXg"> </span><span class="ow" id="mwXw">as</span><span class="w" id="mwYA"> </span><span class="kt" id="mwYQ">integer</span> <span class="w" id="mwYg"> </span><span class="k" id="mwYw">dim</span><span class="w" id="mwZA"> </span><span class="n" id="mwZQ">sLine</span><span class="p" id="mwZg">,</span><span class="w" id="mwZw"> </span><span class="n" id="mwaA">sPath</span><span class="w" id="mwaQ"> </span><span class="ow" id="mwag">as</span><span class="w" id="mwaw"> </span><span class="kt" id="mwbA">string</span><span class="w" id="mwbQ"> </span> <span class="w" id="mwbg"> </span><span class="n" id="mwbw">sPath</span><span class="o" id="mwcA">=</span><span class="s" id="mwcQ">"C:\Test.dsv"</span> <span class="w" id="mwcg"> </span><span class="k" id="mwcw">if</span><span class="w" id="mwdA"> </span><span class="n" id="mwdQ">FileExists</span><span class="p" id="mwdg">(</span><span class="n" id="mwdw">sPath</span><span class="p" id="mweA">)</span><span class="w" id="mweQ"> </span><span class="k" id="mweg">then</span> <span class="w" id="mwew"> </span><span class="n" id="mwfA">open</span><span class="w" id="mwfQ"> </span><span class="n" id="mwfg">sPath</span><span class="w" id="mwfw"> </span><span class="k" id="mwgA">for</span><span class="w" id="mwgQ"> </span><span class="n" id="mwgg">input</span><span class="w" id="mwgw"> </span><span class="ow" id="mwhA">as</span><span class="w" id="mwhQ"> </span><span class="p" id="mwhg">#</span><span class="mi" id="mwhw">1</span> <span class="w" id="mwiA"> </span><span class="k" id="mwiQ">do</span><span class="w" id="mwig"> </span><span class="k" id="mwiw">while</span><span class="w" id="mwjA"> </span><span class="k" id="mwjQ">not</span><span class="w" id="mwjg"> </span><span class="n" id="mwjw">EOF</span><span class="p" id="mwkA">(</span><span class="mi" id="mwkQ">1</span><span class="p" id="mwkg">)</span> <span class="w" id="mwkw"> </span><span class="n" id="mwlA">line</span><span class="w" id="mwlQ"> </span><span class="n" id="mwlg">input</span><span class="w" id="mwlw"> </span><span class="p" id="mwmA">#</span><span class="mi" id="mwmQ">1</span><span class="p" id="mwmg">,</span><span class="w" id="mwmw"> </span><span class="n" id="mwnA">sLine</span> <span class="w" id="mwnQ"> </span><span class="k" id="mwng">if</span><span class="w" id="mwnw"> </span><span class="n" id="mwoA">sCode</span><span class="o" id="mwoQ">=</span><span class="n" id="mwog">left</span><span class="p" id="mwow">(</span><span class="n" id="mwpA">sLine</span><span class="p" id="mwpQ">,</span><span class="w" id="mwpg"> </span><span class="mi" id="mwpw">3</span><span class="p" id="mwqA">)</span><span class="w" id="mwqQ"> </span><span class="k" id="mwqg">then</span> <span class="w" id="mwqw"> </span><span class="c" id="mwrA">'Action(s) to be carried out</span> <span class="w" id="mwrQ"> </span><span class="k" id="mwrg">End</span><span class="w" id="mwrw"> </span><span class="k" id="mwsA">if</span> <span class="w" id="mwsQ"> </span><span class="k" id="mwsg">loop</span> <span class="w" id="mwsw"> </span><span class="n" id="mwtA">close</span><span class="w" id="mwtQ"> </span><span class="p" id="mwtg">#</span><span class="mi" id="mwtw">1</span> <span class="w" id="mwuA"> </span><span class="k" id="mwuQ">End</span><span class="w" id="mwug"> </span><span class="k" id="mwuw">if</span> <span class="w" id="mwvA"> </span><span class="n" id="mwvQ">LookupCode</span><span class="o" id="mwvg">=</span><span class="n" id="mwvw">iReturnValue</span> <span class="k" id="mwwA">end</span><span class="w" id="mwwQ"> </span><span class="k" id="mwwg">function</span>
In this small and simple example, the conditional block “if... then... end if” is nested inside the “do while... loop” one.
Some languages such as Pascal and Ada have no restrictions on declarations depending on the nesting level, allowing precisely nested subprograms or even nested packages (Ada). Here is an example of both (simplified from a real case):
<span id="mwyQ"></span><span class="c1" id="mwyg">-- Getting rid of the global variables issue (cannot be used in parallel)</span> <span class="c1" id="mwyw">-- from a set of old sources, without the need to change that code's</span> <span class="c1" id="mwzA">-- logic or structure.</span> <span class="c1" id="mwzQ">--</span> <span class="kd" id="mwzg">procedure</span> <span class="nf" id="mwzw">Nesting_example_1</span> <span class="kr" id="mw0A">is</span> <span class="kd" id="mw0Q">type</span> <span class="kt" id="mw0g">Buffer_type</span> <span class="kr" id="mw0w">is</span> <span class="kr" id="mw1A">array</span><span class="p" id="mw1Q">(</span><span class="kt" id="mw1g">Integer</span> <span class="kr" id="mw1w">range</span> <span class="p" id="mw2A"><>)</span> <span class="kr" id="mw2Q">of</span> <span class="kt" id="mw2g">Integer</span><span class="p" id="mw2w">;</span> <span class="kd" id="mw3A">procedure</span> <span class="nf" id="mw3Q">Decompress</span><span class="p" id="mw3g">(</span> <span class="nv" id="mw3w">compressed</span> <span class="p" id="mw4A">: </span> <span class="nv" id="mw4Q">in</span> <span class="nv" id="mw4g">Buffer_type</span><span class="p" id="mw4w">;</span> <span class="nv" id="mw5A">decompressed</span><span class="p" id="mw5Q">: </span><span class="nv" id="mw5g">out</span> <span class="nv" id="mw5w">Buffer_type</span> <span class="p" id="mw6A">)</span> <span class="kr" id="mw6Q">is</span> <span class="c1" id="mw6g">-- Here are the legacy sources, translated:</span> <span class="kd" id="mw6w">package</span> <span class="nc" id="mw7A">X_Globals</span> <span class="kr" id="mw7Q">is</span> <span class="n" id="mw7g">index_in</span><span class="p" id="mw7w">,</span> <span class="n" id="mw8A">index_out</span><span class="p" id="mw8Q">:</span> <span class="kt" id="mw8g">Integer</span><span class="p" id="mw8w">;</span> <span class="c1" id="mw9A">-- *** ^ These variables are local to Decompress.</span> <span class="c1" id="mw9Q">-- *** Now Decompress is task-safe.</span> <span class="kr" id="mw9g">end</span> <span class="nf" id="mw9w">X_Globals</span><span class="p" id="mw-A">;</span> <span class="c1" id="mw-Q">-- Methods 1,2,3,... (specifications)</span> <span class="kd" id="mw-g">package</span> <span class="nc" id="mw-w">X_Method_1</span> <span class="kr" id="mw_A">is</span> <span class="kd" id="mw_Q">procedure</span> <span class="nf" id="mw_g">Decompress_1</span><span class="p" id="mw_w">;</span> <span class="kr" id="mwAQA">end</span> <span class="nf" id="mwAQE">X_Method_1</span><span class="p" id="mwAQI">;</span> <span class="c1" id="mwAQM">-- Methods 1,2,3,... (code)</span> <span class="kd" id="mwAQQ">package</span> <span class="kd" id="mwAQU">body</span> <span class="nc" id="mwAQY">X_Method_1</span> <span class="kr" id="mwAQc">is</span> <span class="kn" id="mwAQg">use</span> <span class="n" id="mwAQk">X_Globals</span><span class="p" id="mwAQo">;</span> <span class="kd" id="mwAQs">procedure</span> <span class="nf" id="mwAQw">Decompress_1</span> <span class="kr" id="mwAQ0">is</span> <span class="kr" id="mwAQ4">begin</span> <span class="n" id="mwAQ8">index_in</span><span class="p" id="mwARA">:=</span> <span class="n" id="mwARE">compressed</span><span class="p" id="mwARI">'</span><span class="na" id="mwARM">First</span><span class="p" id="mwARQ">;</span> <span class="c1" id="mwARU">-- Here, the decompression code, method 1</span> <span class="kr" id="mwARY">end</span> <span class="nf" id="mwARc">Decompress_1</span><span class="p" id="mwARg">;</span> <span class="kr" id="mwARk">end</span> <span class="nf" id="mwARo">X_Method_1</span><span class="p" id="mwARs">;</span> <span class="c1" id="mwARw">-- End of the legacy sources</span> <span class="kr" id="mwAR0">begin</span> <span class="n" id="mwAR4">X_Method_1</span><span class="p" id="mwAR8">.</span><span class="n" id="mwASA">Decompress_1</span><span class="p" id="mwASE">;</span> <span class="kr" id="mwASI">end</span> <span class="nf" id="mwASM">Decompress</span><span class="p" id="mwASQ">;</span> <span class="n" id="mwASU">test_in</span><span class="p" id="mwASY">,</span> <span class="n" id="mwASc">test_out</span><span class="p" id="mwASg">:</span> <span class="n" id="mwASk">Buffer_type</span><span class="p" id="mwASo">(</span><span class="mf" id="mwASs">1.</span><span class="p" id="mwASw">.</span><span class="mi" id="mwAS0">10_000</span><span class="p" id="mwAS4">);</span> <span class="kr" id="mwAS8">begin</span> <span class="n" id="mwATA">Decompress</span><span class="p" id="mwATE">(</span><span class="n" id="mwATI">test_in</span><span class="p" id="mwATM">,</span> <span class="n" id="mwATQ">test_out</span><span class="p" id="mwATU">);</span> <span class="kr" id="mwATY">end</span> <span class="nf" id="mwATc">Nesting_example_1</span><span class="p" id="mwATg">;</span>
Data structures
Nested data structures are also commonly encountered in programming.
Lisp
In the functional programming languages, such as Lisp, a list data structure exists as does a simpler atom data structure.
- Simple lists hold only atoms.
<span id="mwAVE"></span><span class="p" id="mwAVI">(</span><span class="w" id="mwAVM"> </span><span class="nv" id="mwAVQ">A</span><span class="w" id="mwAVU"> </span><span class="no" id="mwAVY">T</span><span class="w" id="mwAVc"> </span><span class="nv" id="mwAVg">O</span><span class="w" id="mwAVk"> </span><span class="nv" id="mwAVo">M</span><span class="w" id="mwAVs"> </span><span class="nv" id="mwAVw">S</span><span class="w" id="mwAV0"> </span><span class="p" id="mwAV4">)</span>
The atoms in the list are A, T, O, M, and S.
- Nested lists hold both atoms and other lists.
<span id="mwAWk"></span><span class="p" id="mwAWo">(</span><span class="w" id="mwAWs"> </span><span class="p" id="mwAWw">(</span><span class="w" id="mwAW0"> </span><span class="p" id="mwAW4">(</span><span class="w" id="mwAW8"> </span><span class="nv" id="mwAXA">N</span><span class="w" id="mwAXE"> </span><span class="nv" id="mwAXI">E</span><span class="w" id="mwAXM"> </span><span class="nv" id="mwAXQ">S</span><span class="w" id="mwAXU"> </span><span class="no" id="mwAXY">T</span><span class="w" id="mwAXc"> </span><span class="nv" id="mwAXg">E</span><span class="w" id="mwAXk"> </span><span class="nv" id="mwAXo">D</span><span class="w" id="mwAXs"> </span><span class="p" id="mwAXw">)</span><span class="w" id="mwAX0"> </span><span class="nv" id="mwAX4">L</span><span class="w" id="mwAX8"> </span><span class="nv" id="mwAYA">I</span><span class="w" id="mwAYE"> </span><span class="nv" id="mwAYI">S</span><span class="w" id="mwAYM"> </span><span class="no" id="mwAYQ">T</span><span class="w" id="mwAYU"> </span><span class="nv" id="mwAYY">S</span><span class="w" id="mwAYc"> </span><span class="p" id="mwAYg">)</span><span class="w" id="mwAYk"> </span><span class="p" id="mwAYo">(</span><span class="w" id="mwAYs"> </span><span class="nv" id="mwAYw">C</span><span class="w" id="mwAY0"> </span><span class="nv" id="mwAY4">A</span><span class="w" id="mwAY8"> </span><span class="nv" id="mwAZA">N</span><span class="w" id="mwAZE"> </span><span class="p" id="mwAZI">)</span><span class="w" id="mwAZM"> </span><span class="p" id="mwAZQ">(</span><span class="w" id="mwAZU"> </span><span class="nv" id="mwAZY">B</span><span class="w" id="mwAZc"> </span><span class="nv" id="mwAZg">E</span><span class="w" id="mwAZk"> </span><span class="p" id="mwAZo">)</span><span class="w" id="mwAZs"> </span><span class="nv" id="mwAZw">U</span><span class="w" id="mwAZ0"> </span><span class="nv" id="mwAZ4">N</span><span class="w" id="mwAZ8"> </span><span class="nv" id="mwAaA">N</span><span class="w" id="mwAaE"> </span><span class="nv" id="mwAaI">E</span><span class="w" id="mwAaM"> </span><span class="nv" id="mwAaQ">C</span><span class="w" id="mwAaU"> </span><span class="nv" id="mwAaY">E</span><span class="w" id="mwAac"> </span><span class="nv" id="mwAag">S</span><span class="w" id="mwAak"> </span><span class="nv" id="mwAao">S</span><span class="w" id="mwAas"> </span><span class="nv" id="mwAaw">A</span><span class="w" id="mwAa0"> </span><span class="nv" id="mwAa4">R</span><span class="w" id="mwAa8"> </span><span class="nv" id="mwAbA">I</span><span class="w" id="mwAbE"> </span><span class="nv" id="mwAbI">L</span><span class="w" id="mwAbM"> </span><span class="nv" id="mwAbQ">Y</span><span class="w" id="mwAbU"> </span><span class="p" id="mwAbY">(</span><span class="w" id="mwAbc"> </span><span class="nv" id="mwAbg">C</span><span class="w" id="mwAbk"> </span><span class="nv" id="mwAbo">O</span><span class="w" id="mwAbs"> </span><span class="nv" id="mwAbw">M</span><span class="w" id="mwAb0"> </span><span class="nv" id="mwAb4">P</span><span class="w" id="mwAb8"> </span><span class="nv" id="mwAcA">L</span><span class="w" id="mwAcE"> </span><span class="nv" id="mwAcI">E</span><span class="w" id="mwAcM"> </span><span class="nv" id="mwAcQ">X</span><span class="w" id="mwAcU"> </span><span class="p" id="mwAcY">)</span><span class="w" id="mwAcc"> </span><span class="p" id="mwAcg">)</span>

