В вычислительной науке и информатике вложение [1] означает, что информация организована в слои или объекты содержат другие подобные объекты. Это почти всегда относится к самоподобным или рекурсивным структурам в некотором смысле.
Вложенность может означать:
В электронной таблице функции могут быть вложены одна в другую, создавая сложные формулы. Мастер функций приложения OpenOffice.org Calc позволяет перемещаться по нескольким уровням вложенности, [ необходимо дополнительное объяснение ] позволяя пользователю редактировать (и, возможно, исправлять) каждый из них отдельно.
Например:
=ЕСЛИ(СУММ(C8:G8)=0;"Д";"Н")
В этой формуле Microsoft Excel функция СУММ вложена в функцию ЕСЛИ. Сначала формула вычисляет сумму чисел в ячейках от C8 до G8. Затем она решает, равна ли сумма 0, и отображает букву Y, если сумма равна 0, и букву N, если нет.
Естественно, чтобы обеспечить математическое разрешение этих связанных (или лучше: вложенных ) формул, внутренние выражения должны быть предварительно оценены, и это внешнее направление имеет важное значение, поскольку результаты, возвращаемые внутренними функциями, временно используются в качестве входных данных для внешних .
Из-за потенциального накопления скобок только в одной строке кода редактирование и обнаружение ошибок (или отладка ) могут стать несколько неудобными . Вот почему современные среды программирования, а также программы для работы с электронными таблицами, выделяют жирным шрифтом пару, соответствующую текущей позиции редактирования. (Автоматический) контроль балансировки открывающей и закрывающей скобок известен как проверка соответствия скобок .
В языках структурного программирования вложенность связана с включением управляющих структур одна в другую, что обычно обозначается различными уровнями отступов в исходном коде , как это показано в этой простой функции BASIC :
функция LookupCode ( sCode как строка ) как целое число dim iReturnValue как целое число dim sLine , sPath как строка sPath = "C:\Test.dsv" if FileExists ( sPath ) then open sPath for input as # 1 do while not EOF ( 1 ) line input # 1 , sLine if sCode = left ( sLine , 3 ) then 'Действие(я), которые необходимо выполнить End if loop close # 1 End if LookupCode = iReturnValue end function
В этом небольшом и простом примере условный блок «if... then... end if» вложен в блок «do while... loop».
Некоторые языки, такие как Pascal и Ada, не имеют ограничений на объявления в зависимости от уровня вложенности, что позволяет точно вложенные подпрограммы или даже вложенные пакеты (Ada). Вот пример обоих (упрощенный из реального случая):
-- Избавление от проблемы глобальных переменных (нельзя использовать параллельно) -- из набора старых исходников, без необходимости изменять логику или структуру этого кода . -- Процедура Nesting_example_1 тип Buffer_type — это массив ( диапазон целых чисел <>) целых чисел ; procedure Decompress ( compress : in Buffer_type ; decompressed : out Buffer_type ) is -- Вот устаревшие исходные коды, переведенные: package X_Globals is index_in , index_out : Integer ; -- *** ^ Эти переменные являются локальными для Decompress. -- *** Теперь Decompress безопасен для задач. end X_Globals ; -- Методы 1,2,3,... (спецификации) package X_Method_1 is procedure Decompress_1 ; end X_Method_1 ; -- Методы 1,2,3,... (код) package body X_Method_1 is use X_Globals ; procedure Decompress_1 is begin index_in := compress ' First ; -- Здесь код распаковки, метод 1 end Decompress_1 ; end X_Method_1 ; -- Конец устаревших исходных кодов begin X_Method_1 . Decompress_1 ; конец распаковки ; test_in , test_out : Тип_буфера ( 1. . 10_000 );начать распаковку ( test_in , test_out ); конец Nesting_example_1 ;
Вложенные структуры данных также часто встречаются в программировании.
В функциональных языках программирования , таких как Lisp , существует структура данных списка , а также более простая структура данных атома . [2]
( А Т О М С )
Атомы в списке — A, T, O, M и S.
( ( ( ВЛОЖЕННЫЕ ) СПИСКИ ) ( МОГУТ ) ( БЫТЬ ) НЕНУЖНЫМИ ( СЛОЖНЫМИ ) )