Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd 1 2011 Języki i środowiska programowania systemów rozproszonych Wykładowca:

Slides:



Advertisements
Podobne prezentacje
Konstrukcja systemów obiektowych i rozproszonych
Advertisements

C++ wykład 2 ( ) Klasy i obiekty.
Język C/C++ Funkcje.
Programowanie obiektowe
© K.Subieta. Obiektowe języki zapytań 08, Folia 1 kwiecień 2004 Obiektowe języki zapytań Wykładowca: Kazimierz Subieta Polsko-Japońska Wyższa Szkoła Technik.
Wzorce.
© K.Subieta. Obiektowe języki zapytań 14, Folia 1 czerwiec 2004 Obiektowe języki zapytań Wykładowca: Kazimierz Subieta Polsko-Japońska Wyższa Szkoła Technik.
Bazy danych i inżynieria oprogramowania
© K.Subieta. Konstrukcja systemów obiektowych i rozproszonych 3, Folia 1 październik 2004 Konstrukcja systemów obiektowych i rozproszonych Wykładowca:
PROGRAMOWANIE STRUKTURALNE
Kamil Łącki Dominik Strzelichowski
© K.Subieta. Obiektowe języki zapytań 09, Folia 1 maj 2004 Obiektowe języki zapytań Wykładowca: Kazimierz Subieta Polsko-Japońska Wyższa Szkoła Technik.
© K.Subieta. Obiektowe języki zapytań 13, Folia 1 czerwiec 2004 Obiektowe języki zapytań Wykładowca: Kazimierz Subieta Polsko-Japońska Wyższa Szkoła Technik.
© K.Subieta. Obiektowe języki zapytań 07, Folia 1 kwiecień 2004 Obiektowe języki zapytań Wykładowca: Kazimierz Subieta Polsko-Japońska Wyższa Szkoła Technik.
© K.Subieta. Obiektowe języki zapytań 06, Folia 1 kwiecień 2004 Obiektowe języki zapytań Wykładowca: Kazimierz Subieta Polsko-Japońska Wyższa Szkoła Technik.
Generyczne Repozytorium Dokumentów w XML
© K.Subieta. Podejście stosowe 05, Folia 1 Podejście stosowe do obiektowych języków programowania baz danych Wykład 05 Abstrakcyjne modele składu obiektów.
PySBQL Język zapytań dla obiektowych baz danych. Aplikacje bazodanowe Główny nurt budowania aplikacji opiera się na połączeniu: SQL JDBC Java Jak wyświetlić
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 7: Procedury i funkcje © Jan Kaczmarek.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 8: Wykorzystanie procedur i funkcji © Jan Kaczmarek.
Język SQL – zapytania zagnieżdżone (podzapytania)
Podstawy informatyki Rekurencja i rekurencja Grupa: 1A
Kurs Pascala – spis treści
Biblioteki i przestrzenie nazw
C++ wykład 2 ( ) Klasy i obiekty.
Zasady zaliczenia Warunki uzyskania zaliczenia:
Wykład 8 Wojciech Pieprzyca
Obiektowe języki zapytań
Wstęp do programowania obiektowego
Projektowanie i programowanie obiektowe II - Wykład II
Podstawy programowania
Podstawy programowania II
Automatyczne dereferencje w języku SBQL
Podstawy programowania
Podstawy programowania
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Języki i środowiska programowania systemów rozproszonych, Wykład 02, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Języki i środowiska programowania systemów rozproszonych, Wykład 04, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Języki i środowiska programowania systemów rozproszonych, Wykład 11, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Jerzy F. Kotowski1 Informatyka I Wykład 14 DEKLARATORY.
Andrzej Repak Nr albumu
Teoria sterowania 2011/2012Stabilno ść Kazimierz Duzinkiewicz, dr hab. in ż. Katedra In ż ynierii Systemów Sterowania 1 Stabilność Stabilność to jedno.
Języki i środowiska programowania systemów rozproszonych, Wykład 10, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Języki i środowiska programowania systemów rozproszonych, Wykład 09, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Języki i środowiska programowania systemów rozproszonych, Wykład 01 SBA&SBQL, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Języki i środowiska programowania systemów rozproszonych, Wykład 03, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Języki i środowiska programowania systemów rozproszonych, Wykład 01, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Koncepcja procesu Zadanie i proces. Definicja procesu Process – to program w trakcie wykonywania; wykonanie procesu musi przebiegać w sposób sekwencyjny.
Wybrane zagadnienia relacyjnych baz danych
Programowanie obiektowe – język C++
Programowanie obiektowe 2013/2014
SYSTEMY EKSPERTOWE I SZTUCZNA INTELIGENCJA
Podstawy programowania
Programowanie strukturalne i obiektowe C++
Model obiektowy bazy danych
Kurs języka C++ – wykład 4 ( )
Warstwowe sieci jednokierunkowe – perceptrony wielowarstwowe
Wykład 2 Programowanie obiektowe. Programowanie obiektowe wymaga dobrego zrozumienia działania funkcji definiowanych przez użytkownika, w ten sposób będziemy.
Wstęp do systemów informatycznych Diagramy klas. Odbiór świata  Myślenie o dziedzinie problemu powinno być możliwie zbliżone do myślenia o systemie 
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
Temat: Tworzenie bazy danych
Programowanie Obiektowe – Wykład 6
Obiektowe języki zapytań
Obiektowe języki zapytań
Obiektowe języki zapytań
Zapis prezentacji:

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca: Tomasz Kowalski Wykłady przygotowane na podstawie materiałów prof. Kazimierza Subiety Wykład 5 Stos środowisk, rezultaty zapytań, funkcja nested

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Stos środowisk Pojęcie stosu środowisk pojawiło się w informatyce w latach 60-tych. Od tego czasu stos ten jest elementem konstrukcji większości znanych języków, włączając Pascal, C/C++, Smalltalk, Java, itd. Idea jest prosta i oczywista, ale nie jest często dostatecznie dobrze objaśniona w podręcznikach. Przy konstrukcji semantyki języków zapytań musimy wrócić do stosu środowisk. Zasady zarządzania środowiskami programu mają wpływ na technikę i niezawodność programowania. Są one następujące: Środowisko lokalne danego bytu programistycznego ma priorytet w stosunku do środowiska bardziej globalnego. Zasada lokalnego kontekst. Zasada dowolnego zagnieżdżania wołań procedur. environment stack

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Ilustracja działania stosu środowisk Procedura p1 wywołuje procedurę p2, która wywołuje procedurę p3 czas... Sekcja danych globalnych Sekcja lokalnych danych i parametrów procedury p1... Sekcja danych globalnych Wywołanie p1 Sekcja lokalnych danych i parametrów procedury p2 Sekcja lokalnych danych i parametrów procedury p1... Sekcja danych globalnych Wywołanie p2 Sekcja lokalnych danych i parametrów procedury p3 Sekcja lokalnych danych i parametrów procedury p2 Sekcja lokalnych danych i parametrów procedury p1... Sekcja danych globalnych Wywołanie p3 Sekcja lokalnych danych i parametrów procedury p1... Sekcja danych globalnych Wyjście z p2 Wyjście z p1... Sekcja danych globalnych Sekcja lokalnych danych i parametrów procedury p2 Sekcja lokalnych danych i parametrów procedury p1... Sekcja danych globalnych Wyjście z p3

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Wiązanie Wiązanie jest to zastępowanie nazw występujących w tekście programu na byty programistyczne czasu wykonania, np. na adresy RAM, identyfikatory obiektów, adresy startowe procedur, itd. Przykładowo, wiązanie nazwy zmiennej x oznacza zastąpienie tej nazwy przez adres RAM, gdzie przechowywana jest wartość zmiennej x. Wiązanie może być wczesne lub statyczne (early binding, static binding), czyli odbywa się w czasie kompilacji, albo późne lub dynamiczne (late binding, dynamic binding), czyli odbywa się w czasie wykonania. binding

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Przykładowa sytuacja na stosie środowisk Zmienne e, f zadeklarowane wewnątrz bloku l Zmienne c, d i parametry z(55), t(83) procedury p2 Zmienne a, b i parametry x, y procedury p Zmienne i inne byty globalne Wierzchołek stosu Dół stosu Kolejność poszukiwania wiązania dla zmiennej g procedure p1( x, y ) { deklaracje zmiennych a, b;... call p2( 55, 83 );... } procedure p2( z, t ) { deklaracje zmiennych c,d;... { (* blok l *) deklaracje zmiennych e, f; g := 75;... };... } Wykonywany jest blok l w procedurze p2 wywołanej z p1.

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Po co jest mechanizm stosu środowiskowego? Abstrakcja i hermetyzacja. Izolacja. Semantyczna niezależność i ponowne użycie. Wywoływanie procedur z innych procedur. Spójne zarządzanie nazwami użytymi w programie. Realizacja metod transmisji parametrów. Kontrola typologiczna (analiza statyczna). Podane motywacje mają znaczenie dla języków zapytań, pozwalając zrealizować takie ich założenia jak: możliwość dowolnego zagnieżdżania zapytań, możliwość powoływania lokalnych nazw wewnątrz zapytań, możliwość używania nazw z bazy danych łącznie z nazwami zmiennych programistycznych, nazwami procedur, funkcji i metod.

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Stos środowisk w SBA Stos środowisk dostosujemy do wymagań semantyki języków zapytań oraz konstrukcji pochodnych, takich jak perspektywy, procedury bazy danych, itd. Stos będzie spełniać następujące założenia: Będzie zgodny z modelami składu AS0 - AS3. Będzie w jednorodny sposób traktował dane indywidualne i kolekcje. Maksymalny rozmiar stosu nie będzie implementacyjnie ograniczony. Stos będzie składał się z sekcji, gdzie każda sekcja będzie przechowywać informację o pewnym środowisku czasu wykonania, np. środowisku wywołania pewnej funkcji, procedury lub metody, środowisku wnętrza pewnego obiektu, środowisku wnętrza pewnej klasy, środowisku obiektów bazy danych, itd. Rozmiar sekcji nie będzie ograniczony. Na dole stosu umieszczone będą sekcje globalne, do których należą globalne zmienne aplikacji, baza danych, wspólne biblioteki procedur i funkcji, oraz zmienne środowiskowe systemu komputerowego.

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Binder Podstawową strukturą przechowywaną na stosie środowisk jest binder. Binder jest parą, gdzie n jest zewnętrzną nazwą (nazwą zmiennej, stałej, obiektu, funkcji, perspektywy, procedury, metody, itd.), zaś x jest bytem czasu wykonania (zwykle referencją do obiektu). Parę będziemy zapisywać n( x ). Definicję tę uogólnimy. Koncepcja bindera jest bardzo prosta. Zadaniem bindera n(x) jest wiązanie, czyli zastąpienie nazwy n występującej w zapytaniu lub programie na wartość x, będącą bytem czasu wykonania. Dla dowolnej nazwy występującej w programie musi być na stosie odpowiedni binder, który zamieni tę nazwę na byt czasu wykonania. Nazwa, dla której odpowiadający jej binder nie istnieje, nie może być związana, czyli jest błędna. Przy luźnych modelach składu (tzw. półstrukturalnych, semistructured) możemy uznać, że wiązanie takiej nazwy jest puste (jest pustym zbiorem). binder

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Rola binderów Uogólnienie: Binder jest parą n(x), gdzie n może być dowolną zewnętrzną nazwą definiowaną przez programistę, użytkownika, projektanta aplikacji, projektanta bazy danych, itp., zaś x może być dowolnym rezultatem zwracanym przez zapytanie. W podejściu stosowym do języków zapytań stos środowisk składa się z sekcji odpowiadających poszczególnym środowiskom czasu wykonania. Sekcja jest zbiorem binderów do bytów programistycznych odpowiadającego jej środowiska. W budowanej przez nas semantyce bindery będą miały także inne zastosowania, w szczególności, będą niekiedy zwracane jako rezultaty zapytań. Stos środowiskowy będziemy oznaczać ENVS (ENVironment Stack).

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Przykładowy skład i 1 Prac i 5 Prac i 9 Prac i 17 Dział i 22 Dział Obiekty trwałe i 127 Xi 128 Y Obiekty ulotne

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Przykładowy ENVS Sekcja chwilowa przetwarzania Sekcja chwilowa przetwarzania - własności lokalne wywołanej metody Sekcja chwilowa przetwarzania - własności wnętrza aktualnie przetwarzanego obiektu Prac Sekcje danych globalnych Prac(i 1 ) X(i 127 ) Y(i 128 ) N(5) I("Maria") Nazwisko(i 10 ) Zarobek(i 11 ) Adres(i 12 ) PracujeW(i 16 ) Bindery do obiektów/zmiennych nietrwałych aktualnej sesji użytkownika Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) Bindery do globalnych funkcji bibliotecznych Bindery do zmiennych i funkcji środowiska komputerowego Sekcja bazy danych

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Pojęcie stanu Pojedyncza referencja jest szczególnym przypadkiem rezultatu zapytania. W ten sposób, poprzez definicję składu obiektów i stosu ENVS uzyskaliśmy precyzyjną definicje pojęcia stanu. W podejściu stosowym pojęcie stanu (dziedzina Stan) jest definiowane jako stan składu obiektów plus stan stosu środowisk. Brak pojęcia stanu jest bardzo poważną wadą wielu koncepcji i modeli obiektowych, w szczególności standardów SQL-99, XQuery i ODMG. Zgodnie z wcześniejszymi definicjami, semantyka zapytania jest funkcją odwzorowującą stan, czyli skład obiektów oraz stan ENVS, w rezultat. Odwzorowaniem, które będzie podstawą dalszych definicji, jest semantyka pojedynczej nazwy występującej w zapytaniu lub w programie. Czynność ewaluacji takiej nazwy nosi nazwę wiązania. Wiązanie odbywa się na ENVS zgodnie z regułą stosu, które nakazuje przeszukiwanie stosu od jego wierzchołka w kierunku jego podstawy, z pominięciem niektórych sekcji.

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Reguły wiązania nazw Zasady przeszukiwania stosu i wyznaczania rezultatu wiązania są następujące: Dla wiązanej nazwy n, ENVS jest przeszukiwany aż do znalezienia sekcji, w której znajduje się binder oznaczony nazwą n. Po znalezieniu takiej sekcji wyszukiwanie jest zakończone. Wszystkie bindery z tej sekcji oznaczone nazwą n tworzą rezultat przeszukiwania. Rezultat wiązania uzyskuje się poprzez odrzucenie ze znalezionych binderów nazwy n i pozostawienie wyłącznie wartości tych binderów.

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Prac(i 1 ) X(i 127 ) Y(i 128 ) N(5) I("Anna") Nazwisko(i 10 ) Zarobek(i 11 ) Adres(i 12 ) PracujeW(i 16 ) Prac(i 1 ) Prac(i 5 ) Prac(i 9 ) Dział(i 17 ) Dział(i 22 ) start przeszukiwania stosu Mechanizm przeszukiwania stosu - funkcja bind bind( nazwa ) - funkcja wiązania nazw: bind( Prac ) = i 1 bind( Y ) = i 128 bind( I ) = "Anna" bind( Zarobek ) = i 11 bind( Dział ) = { i 17, i 22 } Binder Prac(i 1 ) znajduje się w dwóch sekcjach stosu, ale w tym przypadku wiązanie nazwy Prac zwróci i 1, a nie {i 1, i 5, i 9 }.

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Rezultaty zwracane przez zapytania Oprócz referencji i wartości atomowych zapytania mogą zwrócić bindery. Uogólnienie podanych założeń prowadzi do następującej rekurencyjnej definicji dziedziny Rezultat: Atomowa wartość należąca do V (np. 3, "Kowalski", TRUE, itd.) należy do dziedziny Rezultat. Referencja do obiektu (inaczej identyfikator obiektu) dowolnego typu należąca do I należy do dziedziny Rezultat. W szczególności, do dziedziny Rezultat należą referencje do metod, procedur, funkcji, perspektyw, itd. Jeżeli x Rezultat, zaś n N jest dowolną nazwą, wówczas para n(x) należy do dziedziny Rezultat. Taki rezultat będziemy nazywać nazwaną wartością; w innym kontekście został on już określony jako binder. Jeżeli x 1, x 2, x 3,... są atomowymi wartościami, referencjami lub nazwanymi wartościamy, wówczas struct{ x 1, x 2, x 3,...} Rezultat. Kolejność elementów w strukturze ma znaczenie. Jeżeli x 1, x 2, x 3,... są wyżej wymienionymi rezultatami, wówczas bag{ x 1, x 2, x 3,...} Rezultat oraz sequence{ x 1, x 2, x 3,...} Rezultat.

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Przykłady zbioru Rezultat Atomowe: 25, "Kowalski", i 11, i 18 Złożone: struct{i 1, i 56 } sequence{ i 1, i 6, i 11 } bag{ struct{i 1, i 56 }, struct{i 6, i 72 }, struct{i 11, i 72 }} bag{struct{n("Kowalski"), Zarobek(2500), d(i 56 )}} bag{struct{ Dział(i 56 ), Prac( bag{ struct{ n("Nowak"), s(i 9 ) }, struct{ n("Stec" ), s(i 14 ) }})} Przy pomocy podanych konstruktorów można tworzyć struktury przypominające obiekty. Nie są one jednak obiektami, ponieważ nie można im przypisać własnych identyfikatorów i nie można ich związać z istniejącą lub nową klasą. Używając terminologii ODMG, rezultaty zapytań są literalami. Takiej terminologii nie będziemy stosować.

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Rezultaty zapytań zapisane jako tablice sequence{ i 1, i 6, i 11 } i 1 i 6 i 11 bag{ struct{i 1, i 56 }, struct{i 6, i 72 }, struct{i 11, i 72 }} i 1 i 6 i 11 i 56 i 72 bag{ struct{ n("Nowak"), s(i 9 )}, struct{ n("Stec"), s(i 14 )}, struct{ n("Mikuła" ), s(i 18 )}} n "Nowak" "Stec" "Mikuła" s i 9 i 14 i 18

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Otwieranie nowego zakresu na stosie środowisk W klasycznych językach programowania otwieranie nowego zakresu na wierzchołku ENVS następuje w momencie wywołania procedury (funkcji, metody) lub w momencie wejścia sterowania w nowy blok. Skasowanie tej sekcji następuje w momencie zakończenia działania procedury (funkcji, metody) lub w momencie wyjścia sterowania z bloku. Do klasycznych sytuacji otwierania nowego zakresu na ENVS dołączymy nową. Stanowi ona istotę podejścia stosowego do języków zapytań. Pewne operatory występujące w zapytaniach (zwane niealgebraicznymi) działają na stosie podobnie do wywołań bloków programów. Np. w zapytaniu języka SBQL: Prac where (Nazwisko = Kowalski and Zarobek > 1000) część (Nazwisko = Kowalski and Zarobek > 1000) jest blokiem, który jest ewaluowany w nowym środowisku określonym przez wnętrze obiektu Prac aktualnie testowanego przez operator where. Na stos ENVS jest wkładana nowa sekcja zawierająca bindery do wszystkich wewnętrznych własności (atrybutów, metod, itd.) tego obiektu Prac.

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Ilustracja otwierania nowego zakresu PRAC (i 1 ) PRAC (i 5 ) PRAC(i 9 ) DZIAŁ (i 17 ) DZIAŁ (i 22 ) Nazwisko(i 10 ) Zarobek(i 11 ) Adres(i 12 ) PracujeW(i 16 ) PRAC (i 1 ) PRAC (i 5 ) PRAC(i 9 ) DZIAŁ (i 17 ) DZIAŁ (i 22 ) Stos w momencie ewaluacji zapytania PRAC. Ewaluacja (wiązanie) nazwy PRAC zwraca {i 1, i 5, i 9 } PRAC where (Nazwisko = Kowalski and Zarobek > 1000) Stos w momencie ewaluacji pod-zapytania (Nazwisko = Kowalski and Zarobek > 1000) dla trzeciego obiektu PRAC. Ewaluacja (wiązanie) nazwy Nazwisko zwraca i 10. Ewaluacja (wiązanie) nazwy Zarobek zwraca i 11. Operator where iteruje po rezultacie zapytania PRAC. W każdej iteracji wkłada (i po ewaluacji zdejmuje) sekcję stosu zawierającą bindery do wnętrza kolejnego obiektu PRAC. wiązanie

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Funkcja nested Intencją jest zdefiniowanie funkcji, której argumentem jest referencja do obiektu, zaś wynikiem jest wewnętrzne środowisko tego obiektu, które ma być umieszczone na ENVS. Takie środowisko jest zbiorem binderów. Funkcję nazwaliśmy nested. nested(i 9 ) = { Nazwisko (i 10 ), Zarobek (i 11 ), Adres (i 12 ), PracujeW (i 16 ) } i 9 Prac i 10 Nazwisko Barski i 11 Zarobek 2000 i 16 PracujeW i 13 Miasto Radom i 14 Ulica Wolska i 15 NrDomu 12 i 12 Adres

Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Uogólnienie funkcji nested Dla dowolnej wartości atomowej v V nested( v ) = (zbiór pusty). Dla identyfikatora i obiektu atomowego (nie posiadającego podobiektów) nested( i ) =. Dla obiektu złożonego,,..., }> nested( i ) = { n 1 (i 1 ), n 2 (i 2 ),..., n k (i k ) }. Dla identyfikatora i obiektu pointerowego dla którego istnieje w składzie obiekt nested( i ) = { n 1 (i 1 ) }. Dla dowolnego bindera n(x) nested( n(x) ) = { n(x) }. Jeżeli argumentem funkcji nested jest struktura elementów, wówczas wynik jest sumą teorio-mnogościową rezultatów funkcji nested dla pojedynczych elementów tej struktury nested( struct{ x 1, x 2, x 3,...}) = nested( x 1 ) nested( x 2 ) nested( x 3 )...