Funkcje
Funkcje są podstawową koncepcją w Scheme, zapewniającą środki do enkapsulacji logiki, umożliwienia ponownego wykorzystania kodu i efektywnej struktury skryptów. Dzięki funkcjom możesz tworzyć modułowe, łatwe w utrzymaniu skrypty, które obsługują szeroki zakres zadań, od podstawowych operacji po zaawansowane przepływy pracy w Lumi.
Ta sekcja służy jako wprowadzenie do funkcji w schemacie i stanowi podstawę do zrozumienia ich typów, definicji i zastosowań. W kolejnych sekcjach zagłębimy się w konkretne typy funkcji i ich unikalne możliwości.
Minimalna składnia i wyrażenia
Kod schematu składa się z wyrażeń. Wyrażenie zwraca wartość. Składnia jest jednolita: nawiasy tworzą wywołanie, a nazwa operatora lub funkcji znajduje się na początku.
(+ 1 2) ; Adds 1 and 2, resulting in 3
(if #t 1 0) ; Evaluates to 1 because the condition is true
(list 1 2 3) ; Creates a list: (1 2 3)Ponieważ wszystko jest wyrażeniem, przepływ sterowania w naturalny sposób wpasowuje się w ten sam styl, co wywołania funkcji.
Dlaczego funkcje mają znaczenie
Funkcje odgrywają kluczową rolę w schemacie z kilku powodów:
- Ponowne wykorzystanie kodu: Unikaj powtórzeń, hermetyzując logikę w komponentach wielokrotnego użytku.
- Modułowość: Podziel złożone zadania na mniejsze, łatwiejsze do wykonania części.
- Zachowanie dynamiczne: Akceptuj parametry, aby obsługiwać różne wejścia lub dostosowywać się do różnych sytuacji.
- Wyższa abstrakcja: Uprość logikę, skupiając się na tym, „co” funkcja robi, a nie na „jak” to robi.
Przegląd typów funkcji
Scheme oferuje różnorodne konstrukcje funkcji, każda dostosowana do konkretnych przypadków użycia:
Nazwane funkcje Są to standardowe funkcje zdefiniowane za pomocą
define. Stanowią one podstawę większości skryptów.(define (square x) (* x x))Funkcje anonimowe Są to nienazwane funkcje zdefiniowane inline, zwane także funkcjami lambda, przeznaczone do jednorazowego użytku.
(lambda (x) (* x x))Funkcje wyższego rzędu Funkcje, które przyjmują inne funkcje jako argumenty lub zwracają funkcje jako wyniki, umożliwiając zaawansowane abstrakcje, takie jak mapowanie, filtrowanie i redukcja.
(map (lambda (x) (* x x)) '(1 2 3 4)) ; Returns (1 4 9 16)
Ogólna składnia funkcji
Funkcje w schemacie mają prostą i spójną składnię:
(define (function-name parameter1 parameter2 ...)
body-expression)function-name: Nazwa funkcji.parameter1, parameter2, ...: Argumenty przyjmowane przez funkcję.body-expression: Logika wykonywana w momencie wywołania funkcji.
Przykład:
(define (add x y)
(+ x y))
(add 3 5) ; Returns 8Skutki uboczne i stan globalny
W Lumi wiele przydatnych procedur ma skutki uboczne: modyfikują obraz, zmieniają rysunek, zapisują plik lub wyświetlają wynik.
- Wyodrębnij skutki uboczne w małych, wyraźnie nazwanych procedurach.
- Unikaj zmiany kontekstu globalnego, jeśli nie jest to konieczne.
- Kiedy zmieniasz kontekst (kolory, pędzle itp.), zawiń pracę
lumi-context-pushilumi-context-pop, aby przywrócić stan użytkownika.