3. Wykład 3:
Sprawy formalne:
Zajęcia odbywają się w każdy poniedziałek i co drugi wtorek. Najbliższy harmonogram:
wt. 11.03
pon. 17.03
pon. 31.03
wt. 01.04
Czego oczekujemy od języka przetwarzania symbolicznego - revisited:
- na poziomie kodu źródłowego: odpowiednio wysoki poziom abstrakcji bez bawienia się w szczegóły manipulacji
- na poziomie manipulacji odpowiednia efektywność czasowa działania na strukturach, ze szczególnym uwzględnieniem implementacji w postaci zespołu wskaźników poszczególnych symboli
- translator powinien mieć wbudowane rozwiązanie przeszukiwania rozwiązań (odpowiednie pętle, techniki za pomocą odpowiednich instrukcji)
Przykład w języku LISP:
Definicja funkcji wydobywającej z listy listę dwuelementową złożoną z pierwszego i ostatniego elementu:
(defun skrajne-elementy (lista) (cons (first lista) (last lista)))
; Można sobie przeformatować dla czytelności (
defun skrajne-elementy(lista)
cons (first lista) (last lista)
Omówienie:
LISP składa się na podstawowym poziomie z atomów: liczby i symbole. Instrukcja defun definiuje funkcję. Pierwszy element jest nazwą, drugi to lista argumentów, trzeci listą instrukcji. Wszystkie te elementy są listami! W języku LISP nie istnieje coś takiego jak instrukcja. Wszystko jest wywołaniem procedury. Nie ma zwykłych instrukcji postaci np. instrukcji charakterystycznych dla języka C.
Wszelkie przekazywanie danych pomiędzy procedurami odbywa się przez wartości zwracane przez funkcje. Stają się one argumantami dla innych funkcji. W ten sposób możemy np. zrealizować instrukcję przypisania bez przypisywania pod zmienną.
Istnieje odpowiednia procedura (funkcja), nawet cała rodzina, która jest implementacją operacji przypisania. Używamy jednak tylko wtedy, gdy to jest wygodne bądź uzasadnione:
(setf x y) - przypisz liście
Wartość zwracana jest wartością przypisywaną.
Wywołanie procedury jest listą. Pierwszy element to nazwa procedury wywoływanej, następne są interpretowane jako argumenty. Tak jak w przykładzie, first i last są po prostu wywołaniami odpowiednich procedur na argumencie lista. Obydwie zwracają listę.
cons jest procedurą wbudowaną tworzącą listę przyrostowo, z głowy i ogona. Pierwszy element dołączany na początek, drugi argument jest listą - ogonem. Istnieje coś takiego,