LISP 1

Lisp

LAB 01 - Wprowadzenie

Programowanie funkcyjne – Co to jest?

Paradygmat funkcyjny polega na tym, że pisząc program, tworzymy coraz bardziej skomplikowane pojęcia matematyczne, aż do osiągnięcia celu. Pojęcia te mają postać stałych i funkcji, stąd nazwa programowanie funkcyjne. Oczywiście tworzone funkcje są wykonywalne, tzn. dostarczając argumentów możemy obliczyć ich wartości.

W "czystym" programowaniu funkcyjnym nie występuje jednak pojęcie zmiennej ani przypisania. Nie ma też pętli jako konstrukcji związanych z czasem i zmianą. Tworzenie programu polega na tworzeniu coraz to bardziej złożonych funkcji i stałych oraz na obliczaniu wartości wyrażeń.

Jeśli nie ma zmiennych, przypisania ani pętli, to co jest? Zamiast operacji mamy obliczanie wyrażeń. Zamiast przypisań mamy definiowanie stałych i funkcji (funkcje to w pewnym sensie też stałe, tylko o bardziej skomplikowanej naturze). Zamiast pętli mamy rekurencję.

Charakterystyczne dla programowania funkcyjnego jest to, że często bardzo łatwo jest napisać poprawny program, przepisując sformułowanie problemu, choć zwykle nie jest to najefektywniejszy program.

LISP (ang. LISt Processing) jest językiem programowania zorientowanym na programowanie funkcyjne. Jest to jeden z najstarszych języków programowania (pochodzi z tych samych czasów co Algol, Fortran). Prace nad Lispem, traktowanym, jako narzędzie do obliczeń na strukturach symbolicznych, rozpoczęto w 1958 w MIT, pod kierunkiem Johna McCarthy’ego. Pierwsza implementacja powstała w 1960 roku. Na początku był popularny tylko w kręgach akademickich, obecnie cieszy się coraz większą popularnością. Spośród wielu dialektów tego język najpopularniejszym stał się dialekt Scheme.

Matematyczne podstawy języka Lisp stanowi rachunek lambda wprowadzony przez Churcha. Podstawowe cechy języka to:

- złożenie funkcji to podstawowa struktura sterowania

- obliczenia powtarzalne są opisywane jedynie przy pomocy rekursji

- użycie dynamicznych struktur listowych, jako podstawowych elementów języka

Program w Lispie jest ciągiem wyrażeń i definicji. Definicje są interpretowane deklaratywnie tzn., są zapamiętywane i od razu można z nich skorzystać. Wyrażenia interpretowane są imperatywnie, co oznacza, że są obliczane natychmiast.

- reprezentacja programów, jako obiektów języka, co pozwala na wygodną manipulację nimi przy tworzeniu bardziej złożonych struktur.

Podstawy programowania w Lispie

Notacja prefiksowa

W powszechnej praktyce stosuje się notację infiksową. Polega ona na tym, że funktory od dwóch argumentów wpisuje się pomiędzy nimi np. 7+3

Notacja prefiksowa polega na wpisywanie funktora przed jego argumentami (używane jest to matematyce i w analizach teoretycznych). Np.≤7 + 2 5 oznacza 7≤2+5

Tradycyjnemu zapisowi f(x,y) odpowiada (f x y)

Podstawowe obliczenia

W najprostszy sposób możemy pracować z Lispem w trybie interpretera:

> znak zachęty, po którym wprowadzamy formuły,
rezultat obliczeń.

Na przykład:

> (+ 4 9)
13

> (- 5 7)
-2

> (/ 15.0 2)
7.5

W każdym powyższym przypadku, wprowadzona formuła to tak naprawdę lista, której pierwszym elementem jest symbol funkcji, a pozostałe elementy to argument tej funkcji.

Kilka dodatkowych przykładów:

> (atom 123)
T

> (numberp 123)
T

> (atom :foo)
T

ATOM i NUMBERP to predykaty. Predykaty zwracają wartość prawda (T) lub fałsz. NIL to jedyna wartość fałsz w LISPIE, wszystkie inne jest prawdą. Jeśli predykat nie ma innych użytecznych wartości do zwrócenia, zazwyczaj zwraca wartość T (prawda). ATOM zawraca wartość T jeśli jego argumentem jest atom. Analogicznie NUMBERP zwraca T jeśli jego argumentem jest liczba.

Do wyliczenia wartości każdej z powyższych form, LISP najpierw ocenia argumenty (od lewej do prawej), następnie ocenia pierwszy element, żeby pobrać jego funkcję, następnie stosuje funkcję do jej argumentów. Poza pewnymi wyjątkami, żeby obliczyć wartość listy LISP zawsze:

1) Oblicza argumenty z lewej do prawej

2) Pobiera funkcję związana z pierwszym argumentem

3) Stosuje znalezioną funkcję do jej argumentów.

Pamiętajmy, że atomy mogą być również formami LISPU. Kiedy chcemy obliczyć atom, po prostu dostajemy jego wartość:

> 17.95
17.95

>*FEATURES*
(:ANSI-CL :CLOS :COMMON-LISP)

>"Hello, world!"
"Hello, world!"

Zmienna *FEATURES* jest predefiniowana w LISPIE – jej wartość zależy od system, w którym się pracuje.

Funkcja może zwracać każdą ilość liczb albo wartości (jak?)

Żeby zwrócić wiele wartości należy użyć formy VALUES. Przykład:

> (values 1 2 3 :hi "Hello")
1
2
3
:HI

"Hello"

Zauważmy, ze każda wartość występuje w nowej linii.

Standardowe funkcje

Funkcje matematyczne - W tej grupie znajdują się funkcje o argumentach i wartościach liczbowych, między innymi obliczające wartości matematycznych funkcji elementarnych, takich jak funkcja potęgowa, wykładnicza i logarytmiczna, funkcje trygonometryczne itd. W większości mają one łatwe do odgadnięcia nazwy i sposób działania zgodny z oczekiwaniami. Wymieniamy tylko kilka z nich.


Wyszukiwarka

Podobne podstrony:
Zadania Lisp
autocad lisp, Cad Algorytmy
autocad lisp, Cad AutoLISP
al1 lisp 04' id 54559 Nieznany (2)
autocad lisp, Cad 2D
Lab3 LISP
Lisp przyklady
autocad lisp, Cad ProjektLSP
Cad LISP
autocad lisp, Cad Programowanie
knw 2004 LISP
W LISP zaimplementowana jest matematyczna notacja funkcji nosząca nazwę notacji lambda
polecenia lisp
Lisp podstawy
Gabriel & Steele The Evolution of Lisp
lisp index
lisp 2
lisp 15

więcej podobnych podstron