LISPouczek



STRONA SAMOUCZKA JĘZYKA LISP  



powered by FreeFind
główna

lekcje

odnośniki

pliki
<< lekcja 18 | lekcja 20 >>

19. Notacja lambda

W LISP zaimplementowana jest matematyczna notacja funkcji nosząca nazwę notacji lambda, wymyślona przez Alonzo Church'a. Notacja ta charakteryzuje się tym, że jasno w niej widać argumenty funkcji oraz operacje jakie na nich są przeprowadzane. Np. Lx.(3+x), gdzie L to grecka litera lambda, x przed kropką to argument funkcji, natomiast w nawiasie zapisana jest operacja jaką dokonuje funkcja na swoim argumencie. W LISP można łatwo wyrazić ten zapis przy pomocy listy, której pierwszym elementem jest symbol lambda (lambda (x) (+ 3 x)).

Inny przykład: f(x,y) = 3x + y^2, w notacji lambda ma postać: L(x,y).(3x+y^2), zaś w LISP: (lambda (x y) (+ (* 3 x) (* y y))). Jak łatwo zauważyć natacja ta jest szczególnie podobna do instrukcji LISP defun. Tym niemniej wyrażenie lambda nie jest funkcjią, o próba jego obliczenia da komunikata o błędzie. Aby wyrażenie to mogło być poprawnie obliczane, musi zostać stworzone domknięcie leksykalne dla wyrażenia lambda. Można je stworzyć poprzez instrukcję function lub jej skrót #'. To co tak naprawdę robi instrukcja defun, któa jest makrem, to przekształcenie zapisu funkcji w wyrażenie lambda, stowrzenie domknięcia leksyklanego, oraz przypisanie tego domknięcia do atrybuty symbol-function sybolu będącego nazwą funkcji. Gdy interperter LISP napotyka jakiś symbol stojący w miejscu wywołania funkcji, to patrzy na jego atrybut symbol-function i jeśli jest do domknięcie leksykalne, to dokonuj wywołania tego domknięcia z odpowiednimi argumentami. Dięki takiemu zapisowi możliwe jest tworzenie funkcji, których wynikami będą również funkcje, np:

19.1
> (defun dodaj-n (n) 
    (#' (lambda (x) (+ x n)))
  ) => dodaj-n
> (setq f dodaj-n 5)
  #
> (funcall f 10) => 15

Notację lambda można też wykorzystywać do tworzenia anonimowych funkcji aplikowanych przez takie instrukcje jak mapcar -

19.2
> (mapcar #'(lambda (x) (+ x 10)) '(1 2 3 4 5)) => (11 12 13 14 15)



<< lekcja 18 | lekcja 20 >>