SW wykład 6 - Slajd7

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania

<<powrót do strony wykładu

Parametry Semantyka procedur Semantyka procedur, c.d. Semantyka procedur bezparametrowych Przekazywanie przez zmienną Przekazywanie przez wartość Przekazywanie przez nazwę Wejście/wyjście Semantyka wejścia/wyjścia Semantyka wejścia/wyjścia, c.d. Semantyka wejścia/wyjścia, c.d. Programy Problem Nowe podejście Kontynuacje

Klauzule dla wywołania i deklaracji procedur jednoparametrowych z parametrem przekazywanym przez nazwę też są łatwe do napisania.

Przy wywołaniu takiej procedury w danym środowisku sprawdzamy, czy jej identyfikatorowi w środowisku procedur przypisane jest znaczenie procedury jednoparametrowej z parametrem przekazywanym przez nazwę. Następnie wyznaczamy funkcję ze składów w wartości liczbowe (ewaluator) dla wyrażenia będącego parametrem aktualnym, w danym środowisku zmiennych. Odpowiednia modyfikacja składu jest wynikiem przekazanie tego ewaluatora jako argumentu dla znaczenia procedury.

Klauzula dla deklaracji takich procedur powinna zaś po prostu wprowadzić ewaluator odpowiadający parametrowi aktualnemu do środowiska, w którym wyznaczane jest przekształcenie składów opisane ciałem procedury (plus, jak zwykle, zmodyfikować środowisko procedur dla umożliwienia wywołań rekurencyjnych).

Dobrze oddaje to intencję, by zmienne występujące w wyrażeniu będącym parametrem aktualnym takiej procedury wiązać zgodnie ze wskazaniami środowiska zmiennych z chwili wywołania procedur --- a więc tam, gdzie to wyrażenie jest budowane --- a jego wartość wyliczać w składzie bieżącym dla każdego odwołania się do wartości parametru formalnego w ciele procedury.

Pojawia się tu jednak klopot formalny: w środowisku zmiennych przypisaliśmy parametrowi formalnemu nie lokację, lecz ewaluator! Musimy zatem odpowiednio rozszerzyć definicję dziedziny środowisk zmiennych, dopuszczając i taką możliwość. Przy tak rozszerzonej definicji dziedziny środowisk zmieniamy też klauzulę definiującą wartość wyrażenia arytmetycznego będącego zmienną: jeśli zmiennej tej w środowisku przypisana jest lokacja, wartość wyrażenia określamy jak dotychczas. Jeśli zaś jest to ewaluator, to wartość tego wyrażenia określamy aplikując ewaluator do bieżącego składu.

Po tej modyfikacji wszystkie definicje już się domykają i uzyskujemy definicję semantyki dla języka z deklaracjami i wywołaniami procedur z parametrami przekazywanymi przez nazwę.

Jest to jednak tylko jeden z możliwych wariantów semantyki procedur a parametrami przekazywanymi przez nazwę. Nie dopuszcza on bowiem na przykład możliwości przypisywania na parametr formalny jako zmienną w ciele procedury, nawet gdy wywołania wykorzystują jako parametr aktualny zmienną. Wydaje się to zresztą logiczne: jeśli chcemy, by parametr aktualny zawsze był zmienną, to można wykorzystać mechanizm przekazywania parametru przez zmienną. Jeśli zaś dopuszczamy parametry aktualne nie będące zmiennymi (a będące dowolnymi wyrażeniami arytmetycznymi), to nie powinniśmy w ciele procedury wykorzystywać parametru formalnego jako zmiennej (na którą wykonujemy przypisania).

Z drugiej strony, pokazuje to, że z punktu widzenia projektu języka i konstrukcji językowych, zmienne występują w dwóch rolach: jako wyrażenia, które służą określeniu wartości, i jako nazwy dla lokacji, na które wartości można przypisywać. Ważnym pomysłem dla systematycznego projektowania języka okazuje się tu staranne rozdzielenie wyrażeń określających wartości i wyrażeń służących określeniu lokacji. Te dwie klasy wyrażeń nie muszą być rozłączne (na ogół, ta druga jest podklasą tej pierwszej, jako że lokacje można wykorzystać dla określenia przypisanych im w składzie wartości), ale powinny im odpowiadać różne funkcje semantyczne. Nie będziemy dalej w tę tematykę wnikać, odsyłając tylko Państwa do literatury o systematycznym projektowaniu języków programowania.