<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sv">
	<id>http://wiki.sikvall.se/index.php?action=history&amp;feed=atom&amp;title=Racket%2FPersonreg</id>
	<title>Racket/Personreg - Versionshistorik</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.sikvall.se/index.php?action=history&amp;feed=atom&amp;title=Racket%2FPersonreg"/>
	<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/Personreg&amp;action=history"/>
	<updated>2026-04-06T19:13:02Z</updated>
	<subtitle>Versionshistorik för denna sida på wikin</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket/Personreg&amp;diff=1829&amp;oldid=prev</id>
		<title>Anders: Skapade sidan med &#039;&lt;pre&gt; #lang racket  ;;;;; ;; Enkel personinfodatabas implementerad i Racket ;; Täpp-Anders Sikvall 2026-04-03 anders@sikvall.se ;;;;;  ;; Global lista som håller alla personer, just nu tom (define personer &#039;())  ;; Skapa en person med namngivna parametrar (define (skapa-person          #:förnamn förnamn          #:efternamn efternamn          #:ålder ålder          #:stad [stad &quot;&quot;]           ;Valfria parametrar med defaultvärden          #:telefon [telefon &quot;&quot;])...&#039;</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/Personreg&amp;diff=1829&amp;oldid=prev"/>
		<updated>2026-04-05T12:59:23Z</updated>

		<summary type="html">&lt;p&gt;Skapade sidan med &amp;#039;&amp;lt;pre&amp;gt; #lang racket  ;;;;; ;; Enkel personinfodatabas implementerad i Racket ;; Täpp-Anders Sikvall 2026-04-03 anders@sikvall.se ;;;;;  ;; Global lista som håller alla personer, just nu tom (define personer &amp;#039;())  ;; Skapa en person med namngivna parametrar (define (skapa-person          #:förnamn förnamn          #:efternamn efternamn          #:ålder ålder          #:stad [stad &amp;quot;&amp;quot;]           ;Valfria parametrar med defaultvärden          #:telefon [telefon &amp;quot;&amp;quot;])...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ny sida&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#lang racket&lt;br /&gt;
&lt;br /&gt;
;;;;;&lt;br /&gt;
;; Enkel personinfodatabas implementerad i Racket&lt;br /&gt;
;; Täpp-Anders Sikvall 2026-04-03 anders@sikvall.se&lt;br /&gt;
;;;;;&lt;br /&gt;
&lt;br /&gt;
;; Global lista som håller alla personer, just nu tom&lt;br /&gt;
(define personer &amp;#039;())&lt;br /&gt;
&lt;br /&gt;
;; Skapa en person med namngivna parametrar&lt;br /&gt;
(define (skapa-person&lt;br /&gt;
         #:förnamn förnamn&lt;br /&gt;
         #:efternamn efternamn&lt;br /&gt;
         #:ålder ålder&lt;br /&gt;
         #:stad [stad &amp;quot;&amp;quot;]           ;Valfria parametrar med defaultvärden&lt;br /&gt;
         #:telefon [telefon &amp;quot;&amp;quot;])&lt;br /&gt;
  (define person (list (cons &amp;#039;förnamn förnamn)         ;när man consar par såhär&lt;br /&gt;
                       (cons &amp;#039;efternamn efternamn)     ;måste man använda car/cdr!&lt;br /&gt;
                       (cons &amp;#039;ålder ålder)&lt;br /&gt;
                       (cons &amp;#039;stad stad)&lt;br /&gt;
                       (cons &amp;#039;telefon telefon)))&lt;br /&gt;
&lt;br /&gt;
  (set! personer (cons person personer)) ; lägger till en person i listan personer och returnerar&lt;br /&gt;
  person)                                ; sedan samma person&lt;br /&gt;
&lt;br /&gt;
;; Sökfunktion (oförändrad)&lt;br /&gt;
(define hitta-person&lt;br /&gt;
  (make-keyword-procedure&lt;br /&gt;
   (lambda (keywords keyword-values . rest)&lt;br /&gt;
     (if (empty? keywords)&lt;br /&gt;
         personer&lt;br /&gt;
         (filter (λ (person)&lt;br /&gt;
                   (for/and ([kw keywords]&lt;br /&gt;
                             [val keyword-values])&lt;br /&gt;
                     (let ([field-key (string-&amp;gt;symbol (keyword-&amp;gt;string kw))])&lt;br /&gt;
                       (let ([found (assoc field-key person)])&lt;br /&gt;
                         (and found&lt;br /&gt;
                              (equal? (string-downcase (format &amp;quot;~a&amp;quot; val))&lt;br /&gt;
                                      (string-downcase (format &amp;quot;~a&amp;quot; (cdr found)))))))))&lt;br /&gt;
                 personer)))))&lt;br /&gt;
&lt;br /&gt;
;; Pretty-print funktioner&lt;br /&gt;
(define (pretty-print-person person)&lt;br /&gt;
  (printf &amp;quot;  Förnamn:   ~a\n&amp;quot; (cdr (assoc &amp;#039;förnamn person)))    ;här går det inte använda rest&lt;br /&gt;
  (printf &amp;quot;  Efternamn: ~a\n&amp;quot; (cdr (assoc &amp;#039;efternamn person)))  ;för det är inte en lista, det&lt;br /&gt;
  (printf &amp;quot;  Ålder:     ~a\n&amp;quot; (cdr (assoc &amp;#039;ålder person)))      ;är ett consat par (ålder . 34)&lt;br /&gt;
  &lt;br /&gt;
  (let ([stad (cdr (assoc &amp;#039;stad person))])&lt;br /&gt;
    (when (and stad (not (equal? stad &amp;quot;&amp;quot;)))&lt;br /&gt;
      (printf &amp;quot;  Stad:      ~a\n&amp;quot; stad)))&lt;br /&gt;
  &lt;br /&gt;
  (let ([telefon (cdr (assoc &amp;#039;telefon person))])&lt;br /&gt;
    (when (and telefon (not (equal? telefon &amp;quot;&amp;quot;)))&lt;br /&gt;
      (printf &amp;quot;  Telefon:   ~a\n&amp;quot; telefon)))&lt;br /&gt;
  &lt;br /&gt;
  (newline))&lt;br /&gt;
&lt;br /&gt;
(define (pretty-print-persons lst)&lt;br /&gt;
  (if (empty? lst)&lt;br /&gt;
      (displayln &amp;quot;  Inga personer hittades.&amp;quot;)&lt;br /&gt;
      (for ([p (reverse lst)])&lt;br /&gt;
        (pretty-print-person p))))&lt;br /&gt;
&lt;br /&gt;
;; Spara och ladda – Lispformat (.dat)&lt;br /&gt;
(define data-fil &amp;quot;personer.dat&amp;quot;) ;default filnamn&lt;br /&gt;
&lt;br /&gt;
(define (spara-personer [filnamn data-fil]) ;men i anrop kan du ge eget namn&lt;br /&gt;
  (with-output-to-file filnamn&lt;br /&gt;
    (λ () (write personer))&lt;br /&gt;
    #:exists &amp;#039;replace) ;om filen finns, skriv över den&lt;br /&gt;
  (printf &amp;quot;* Sparat ~a personer till \&amp;quot;~a\&amp;quot;\n&amp;quot;&lt;br /&gt;
          (length personer) filnamn))&lt;br /&gt;
&lt;br /&gt;
(define (ladda-personer [filnamn data-fil])&lt;br /&gt;
  (if (file-exists? filnamn)&lt;br /&gt;
      (begin&lt;br /&gt;
        (set! personer (with-input-from-file filnamn read))&lt;br /&gt;
        (printf &amp;quot;* Laddat ~a personer från \&amp;quot;~a\&amp;quot;\n&amp;quot; (length personer) filnamn))&lt;br /&gt;
      (printf &amp;quot;! Filen \&amp;quot;~a\&amp;quot; finns inte.\n&amp;quot; filnamn)))&lt;br /&gt;
&lt;br /&gt;
;; Spara och ladda – CSV-format (för enkel redigering)&lt;br /&gt;
(require csv-writing csv-reading)&lt;br /&gt;
(define csv-fil &amp;quot;personer.csv&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
;; Hjälpfunktion: person → CSV-rad&lt;br /&gt;
(define (person-&amp;gt;csv-row person)&lt;br /&gt;
  (list (format &amp;quot;~a&amp;quot; (cdr (assoc &amp;#039;förnamn person)))&lt;br /&gt;
        (format &amp;quot;~a&amp;quot; (cdr (assoc &amp;#039;efternamn person)))&lt;br /&gt;
        (format &amp;quot;~a&amp;quot; (cdr (assoc &amp;#039;ålder person)))&lt;br /&gt;
        (format &amp;quot;~a&amp;quot; (cdr (assoc &amp;#039;stad person)))&lt;br /&gt;
        (format &amp;quot;~a&amp;quot; (cdr (assoc &amp;#039;telefon person)))))&lt;br /&gt;
&lt;br /&gt;
;; SPARA till CSV&lt;br /&gt;
(define (spara-personer-csv [filnamn csv-fil])&lt;br /&gt;
  (define rubriker (list (list &amp;quot;Förnamn&amp;quot; &amp;quot;Efternamn&amp;quot; &amp;quot;Ålder&amp;quot; &amp;quot;Stad&amp;quot; &amp;quot;Telefon&amp;quot;)))&lt;br /&gt;
  (define rader (map person-&amp;gt;csv-row (reverse personer)))   ; reverse så ordningen blir &amp;quot;naturlig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  (with-output-to-file filnamn #:exists &amp;#039;replace&lt;br /&gt;
    (λ ()&lt;br /&gt;
      (display-table rubriker)&lt;br /&gt;
      (display-table rader)))&lt;br /&gt;
  &lt;br /&gt;
  (printf &amp;quot;* Sparat ~a personer till CSV-filen \&amp;quot;~a\&amp;quot;\n&amp;quot; (length personer) filnamn))&lt;br /&gt;
&lt;br /&gt;
;; LADDA från CSV&lt;br /&gt;
(define (ladda-personer-csv [filnamn csv-fil])&lt;br /&gt;
  (if (file-exists? filnamn)&lt;br /&gt;
      (let* ([reader (make-csv-reader (open-input-file filnamn))]&lt;br /&gt;
             [all-rows (csv-&amp;gt;list reader)] ;konvertera från csv till Lisp lista&lt;br /&gt;
             [data-rows (if (empty? all-rows) &amp;#039;() (rest all-rows))]) ; hoppa över rubrik-rad&lt;br /&gt;
&lt;br /&gt;
        (define nya-personer&lt;br /&gt;
          (for/list ([row data-rows])&lt;br /&gt;
            (list (cons &amp;#039;förnamn (list-ref row 0))&lt;br /&gt;
                  (cons &amp;#039;efternamn (list-ref row 1))&lt;br /&gt;
                  (cons &amp;#039;ålder (list-ref row 2))        ; behåll som sträng eller konvertera &lt;br /&gt;
                  (cons &amp;#039;stad (list-ref row 3))         ; med string-&amp;gt;number om du vill&lt;br /&gt;
                  (cons &amp;#039;telefon (list-ref row 4)))))&lt;br /&gt;
&lt;br /&gt;
        (set! personer (append nya-personer personer))  ; eller (set! personer nya-personer) om du vill ersätta&lt;br /&gt;
        (printf &amp;quot;* Laddat ~a personer från CSV-filen \&amp;quot;~a\&amp;quot;\n&amp;quot; (length nya-personer) filnamn))&lt;br /&gt;
      (printf &amp;quot;! CSV-filen \&amp;quot;~a\&amp;quot; finns inte.\n&amp;quot; filnamn)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;; SORTERA PERSONER&lt;br /&gt;
;; Sorterar först på efternamn över hela listan&lt;br /&gt;
;; därefter på efternamn. Då blir det som det ska&lt;br /&gt;
(define (sortera-personer)&lt;br /&gt;
  ;; Steg 1: Sortera på förnamn&lt;br /&gt;
  (set! personer&lt;br /&gt;
        (sort personer&lt;br /&gt;
              (λ (p1 p2)&lt;br /&gt;
                (string-ci&amp;lt;? (cdr (assoc &amp;#039;förnamn p1))        ;string-ci är &amp;quot;string case insensitive&amp;quot;&lt;br /&gt;
                             (cdr (assoc &amp;#039;förnamn p2))))))    &lt;br /&gt;
&lt;br /&gt;
  ;; Steg 2: Sortera på efternamn (detta blir den slutgiltiga ordningen)&lt;br /&gt;
  (set! personer&lt;br /&gt;
        (sort personer&lt;br /&gt;
              (λ (p1 p2)&lt;br /&gt;
                (string-ci&amp;lt;? (cdr (assoc &amp;#039;efternamn p1))&lt;br /&gt;
                             (cdr (assoc &amp;#039;efternamn p2))))))&lt;br /&gt;
&lt;br /&gt;
  personer)   ; returnerar den sorterade listan (bra för kedjad användning)&lt;br /&gt;
&lt;br /&gt;
;; ================================================================&lt;br /&gt;
;; Exempel på användning&lt;br /&gt;
;; ================================================================&lt;br /&gt;
&lt;br /&gt;
;; Skapa testpersoner, detta behöver vi bara göra en gång för sedan skrivs den till disk och&lt;br /&gt;
;; vi behöver därefter bara hämta den vid behov!&lt;br /&gt;
&lt;br /&gt;
(skapa-person #:förnamn &amp;quot;Anna&amp;quot;      #:efternamn &amp;quot;Andersson&amp;quot; #:ålder 34  #:stad &amp;quot;Stockholm&amp;quot; #:telefon &amp;quot;070-123 45 67&amp;quot;)&lt;br /&gt;
(skapa-person #:förnamn &amp;quot;Rickard&amp;quot;   #:efternamn &amp;quot;Nilsson&amp;quot;   #:ålder 28  #:stad &amp;quot;Kista&amp;quot;)&lt;br /&gt;
(skapa-person #:förnamn &amp;quot;Enar&amp;quot;      #:efternamn &amp;quot;Nilsson&amp;quot;   #:ålder &amp;quot;74&amp;quot; #:stad &amp;quot;Färjestaden&amp;quot;)&lt;br /&gt;
(skapa-person #:förnamn &amp;quot;Anna&amp;quot;      #:efternamn &amp;quot;Svensson&amp;quot;  #:ålder 45  #:stad &amp;quot;Malmö&amp;quot;)&lt;br /&gt;
(skapa-person #:förnamn &amp;quot;Johan&amp;quot;     #:efternamn &amp;quot;Larsson&amp;quot;   #:ålder 31  #:stad &amp;quot;Stockholm&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
(sortera-personer)&lt;br /&gt;
&lt;br /&gt;
(spara-personer-csv &amp;quot;personlista.csv&amp;quot;) &lt;br /&gt;
&lt;br /&gt;
(displayln &amp;quot;=== Personer efter skapande ===&amp;quot;)&lt;br /&gt;
(pretty-print-persons (hitta-person))&lt;br /&gt;
&lt;br /&gt;
;; Spara både binärt och CSV&lt;br /&gt;
(displayln &amp;quot;\n=== Sparar till disk (både .dat och .csv) ===&amp;quot;)&lt;br /&gt;
(spara-personer &amp;quot;personlista.dat&amp;quot;)&lt;br /&gt;
(spara-personer-csv &amp;quot;personlista.csv&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
;; Rensa minnet (simulerar omstart)&lt;br /&gt;
(set! personer &amp;#039;())&lt;br /&gt;
(displayln &amp;quot;\n=== Listan rensad ===&amp;quot;)&lt;br /&gt;
(pretty-print-persons (hitta-person))&lt;br /&gt;
&lt;br /&gt;
;; Ladda tillbaka&lt;br /&gt;
(displayln &amp;quot;\n=== Laddar från Lispdata ===&amp;quot;)&lt;br /&gt;
(ladda-personer &amp;quot;personlista.dat&amp;quot;)&lt;br /&gt;
(pretty-print-persons (hitta-person))&lt;br /&gt;
&lt;br /&gt;
(set! personer &amp;#039;()) ; Nolla listan igen&lt;br /&gt;
&lt;br /&gt;
(ladda-personer-csv &amp;quot;personlista.csv&amp;quot;)&lt;br /&gt;
(displayln &amp;quot;\n=== Personer efter laddning från CSV ===&amp;quot;)&lt;br /&gt;
(pretty-print-persons (hitta-person))&lt;br /&gt;
&lt;br /&gt;
;; Exempel på sökning efter laddning&lt;br /&gt;
(displayln &amp;quot;\n=== Sök efter laddning (förnamn anna) ===&amp;quot;)&lt;br /&gt;
(pretty-print-persons (hitta-person #:förnamn &amp;quot;anna&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
</feed>