INPUT EN OUTPUT

Een programma laden

Tot hiertoe zij we er van uitgegaan dat alle functiedefinities en functie-aanroepen in het Lispinteractiesysteem plaatsvinden. In praktijk gaat het er natuurlijk anders aan toe. Programma's worden geschreven in een aangepaste editor die specifieke Lisp ondersteuning biedt (bijv. haakjesmatching, automatische indentatie, evaluatie van definities en functieaanroepen vanuit de editor). Wanneer een programma klaar is kan het ingeladen worden met behulp van de procedure (LOAD string), waarbij de string de naam van de in te laden file is. De preciese semantiek van LOAD hangt af van de Scheme versie waarmee gewerkt wordt, en van het operating systeem van de machine waarop de Scheme werkt.

Bij een file die wordt geladen is het alsof alle definities en aanroepen in de file ingetikt zouden worden in het Lisp interactiesysteem. Commentaar (al wat ; volgt op een regel) wordt genegeerd.

File input en output

Poorten (ports) zijn speciale datatypes die characters kunnen produceren (input ports) en accepteren (output ports). Meestal zijn ports geassocieerd met files, hoewel in principe ook bijv. printers of beeldschermen verbonden kunnen zijn met ports.

(call-with-output-file "junk" (lambda (out)
                                 (do ((c 0 (+ c 1)))
                                     ((= c 10))
                                   (write c out)
                                   (newline out))))

; Resulteert in een file met naam junk en inhoud:
0
1
2
3
4
5
6
7
8
9

Input

Output

> (read)
> (appels en peren)
(appels en peren)
> (read-char)appel
#\a
ERROR: unbound variable:  ppel
> (read-char)                ; representatie van newline is #\nl
#\nl
> (read-char)&
#\&
> (peek-char)&
#\&
ERROR: unbound variable:  &
> (peek-char)12
#\1
12
> (newline)


> (write "appelflap")
"appelflap"
> (display "appelflap")
appelflap
> (write-char #\A)
A#

Het volgende programma leest een tekst uit een input file, en telt hoeveel keer elke letter van het alfabet voorkomt in die tekst.

(define (tel-letters file-naam)
  (with-input-from-file file-naam
     (lambda ()
        (let ((results (make-vector 26 0)))
          (do ((c (read-char) (read-char)))
              ((eof-object? c) (vector->list results))
             (if (char-alphabetic? c)
                 (if (char-upper-case? c)
                     (let ((index (- (char->integer c) 65)))
                        (vector-set! results index
                                     (+ 1 (vector-ref results index))))
                 (let ((index (- (char->integer c) 97)))
                    (vector-set! results index
                                 (+ 1 (vector-ref results index)))))))))))

(tel-letters "chapter-1")  ; Sectie 1 van dit document, inclusief opmaakcodes
                           ; van a/A ot z/Z

(950 192 276 533 2374 161 369 189 983 133 205 581 475 1226 717 368 0
832 653 891 271 305 124 27 47 88)

Walter Daelemans <Walter.Daelemans@kub.nl>
Last modified: Tue Mar 18 14:57:23 1997