Lijsten
In Scheme is een lijst een fundamentele gegevensstructuur die wordt gebruikt om waarden te groeperen. Lijsten zijn geordende verzamelingen elementen waarbij elk element van elk type kan zijn, inclusief een andere lijst. Lijsten worden in Scheme veel gebruikt voor zowel gegevensopslag als programmastructuur.
Voorbeeld 1: Eenvoudige lijst
(list 1 2 3)- Creëert een lijst met drie elementen:
1,2en3.
Resultaat: (1 2 3)
Lijstelementen openen
Elementen in een lijst zijn toegankelijk via de procedures car en cdr:
carhaalt het eerste element van een lijst op.cdrhaalt de rest van de lijst op (alles behalve het eerste element).
Voorbeelden
(define my-list (list 1 2 3))
(car my-list) ; Retrieves the first element
(cdr my-list) ; Retrieves the rest of the listResultaat:
(car my-list)retourneert1(cdr my-list)retourneert(2 3)
Eenvoudige recursie: itereren door een lijst
Door car recursief aan te roepen op de cdr van een lijst, kunt u elk element één voor één verwerken totdat de lijst wordt doorlopen. Dit vormt de basis van veel algoritmen voor lijstverwerking.
Voorbeeld: elk element van een lijst afdrukken
Hier is een eenvoudige recursieve functie om elk element in een lijst af te drukken:
(define (print-elements lst)
(if (null? lst)
(lumi-message "done")
(begin
(lumi-message (number->string (car lst))) ;; Print the first element
(print-elements (cdr lst))))) ;; Process the rest of the list- Basisscenario: Als de lijst leeg is (
null? lst), stop dan de recursie. - Recursief hoofdlettergebruik: Druk het eerste element af (
car lst) en roep vervolgens de functie op in de rest van de lijst (cdr lst).
Voorbeeldgebruik
(print-elements (list 1 2 3))Uitgang:
"1""2""3"
Resultaat: “klaar”
Hoe het werkt
- De functie haalt het eerste element van de lijst op met
caren verwerkt dit. - Vervolgens roept het zichzelf aan met de rest van de lijst (
cdr). - Dit proces herhaalt zich totdat de lijst leeg is (
null? lst).
Voorbeeld 2: Gemengde typen
Lijsten kunnen elementen van verschillende typen bevatten, waaronder tekenreeksen, booleans, getallen, andere lijsten of zelfs het resultaat van expressies:
(list 42 "hello" #t (list 1 2) (+ 3 4))- Hierdoor ontstaat een lijst met:
- Een nummer (
42) - Een string (
"hello") - Een boolean (
#t) - Nog een lijst (
(1 2)) - Het resultaat van een uitdrukking (
(+ 3 4), die resulteert in7)
- Een nummer (
Resultaat: (42 "hello" #t (1 2) 7)
Deze voorbeelden demonstreren de veelzijdigheid van lijsten in Scheme, waardoor ze een krachtig hulpmiddel zijn voor het organiseren en manipuleren van gegevens.
Lijsten samenstellen
De cons procedure wordt gebruikt om een nieuwe lijst samen te stellen door een element te combineren met een bestaande lijst.
(cons new-element existing-list)Voorbeeld
(cons 0 (list 1 2 3))- Voegt
0toe aan het begin van de lijst(1 2 3).
Resultaat: (0 1 2 3)
Controleren op lijsten
De list? procedure controleert of een bepaalde waarde een lijst is.
(list? value)Voorbeeld: lijst?
(list? (list 1 2 3)) ; Checks if (list 1 2 3) is a list
(list? 42) ; Checks if 42 is a listResultaat:
(list? (list 1 2 3))retourneert#t(waar)(list? 42)retourneert#f(onwaar)
Bewerkingen op lijsten
Scheme biedt verschillende ingebouwde procedures voor het werken met lijsten, waaronder:
length: Geeft het aantal elementen in een lijst terug.append: Combineert twee of meer lijsten in één.reverse: Geeft een nieuwe lijst terug met elementen in omgekeerde volgorde.
(length (list 1 2 3)) ; Returns 3
(append (list 1 2) (list 3 4)) ; Returns (1 2 3 4)
(reverse (list 1 2 3)) ; Returns (3 2 1)Resultaat:
(length (list 1 2 3))retourneert3(append (list 1 2) (list 3 4))retourneert(1 2 3 4)(reverse (list 1 2 3))retourneert(3 2 1)####list-refgebruiken
De procedure list-ref haalt het element op bij een gespecificeerde index van een lijst (op nul gebaseerde index).
(list-ref lst index)lst: De lijst waaruit het element moet worden opgehaald.index: een op nul gebaseerde index die aangeeft welk element moet worden geretourneerd.
Voorbeeld: lijstref
(list-ref (list 10 20 30 40) 2) ; Retrieves the element at index 2Resultaat: 30
Geneste lijsten
Lijsten in Schema kunnen andere lijsten als elementen bevatten, waardoor een geneste structuur ontstaat.
Voorbeeld: een geneste lijst maken
(define nested-list (list (list 1 2) (list 3 4) (list 5)))- Creëert een lijst van drie elementen, waarvan elk zelf een lijst is.
Resultaat: ((1 2) (3 4) (5))
Toegang tot geneste gegevens
Om toegang te krijgen tot elementen binnen een geneste lijst, kunt u combinaties van car en cdr gebruiken om door de structuur te navigeren.
Voorbeeld: toegang tot elementen
(car nested-list) ; Retrieves the first element: (1 2)
(car (car nested-list)) ; Retrieves the first element of the first sublist: 1
(cdr (car nested-list)) ; Retrieves the rest of the first sublist: (2)
(car (cdr (car nested-list))) ; Retrieves the second element of the first sublist: 2Uitleg
car nested-list:- Haalt het eerste element van
nested-listop, namelijk(1 2).
- Haalt het eerste element van
car (car nested-list):- Haalt het eerste element van
(1 2)op, namelijk1.
- Haalt het eerste element van
cdr (car nested-list):- Haalt de rest van
(1 2)op, wat(2)is.
- Haalt de rest van
car (cdr (car nested-list)):- Haalt het eerste element van
(2)op, namelijk2.
- Haalt het eerste element van
Voorbeeld: toegang krijgen tot elementen uit andere sublijsten
(car (cdr nested-list)) ; Retrieves the second sublist: (3 4)
(car (car (cdr nested-list))) ; Retrieves the first element of the second sublist: 3Met deze aanpak kunt u systematisch navigeren en toegang krijgen tot specifieke elementen in een geneste lijst, wat een krachtige flexibiliteit biedt bij het werken met hiërarchische gegevens.
Samenvatting
- Lijsten in Scheme zijn veelzijdige en essentiële datastructuren.
- Gebruik
listom een lijst te maken,carencdrom toegang te krijgen tot elementen, enconsom lijsten samen te stellen. - Ingebouwde procedures zoals
length,append,reverseenlist-refmaken lijstbewerkingen eenvoudig en efficiënt. - Lijsten kunnen worden genest, waardoor complexe datastructuren voor geavanceerde gebruiksscenario’s mogelijk worden.