Esercizio: r-cat quasi rifare cat – 4

b2Continuo da qui, c’è ancora molto da fare.
Avendo le funzioni per gestire gli argomenti sulla riga di comando diventa possibile definire un (eventuale) file di output. Però prima devo ricordarmi come gestire i files, cosa che ho già trattato, qui e qui.
La guida è qui: [doc]/reference/file-ports.html.

Un test veloce:

r15

Uhmmm… da migliorare:

r16

OK, molto meglio. Devo ricordarmi dell’opzione #:exists che non è di default a differenza degli altri linguaggi.

Adesso passo a r-cat. Recupero la funzione get-nth da qui, ma non basta: lo script dev’essere razionalizzato, rivisto in profondità (rc5.rkt):

#!/usr/bin/racket
#lang racket

#|
argomenti sulla linea di comando
|#

(define args (vector->list (current-command-line-arguments)))

(define (get-input-file)
  (first args))

(define my-file (get-input-file))

(define (index-of lst ele)
  (for/or ([y lst] [i (in-naturals)] #:when (equal? ele y)) i))

(define (out-num-line?)
  (number? (index-of args "-n")))

(define output-on-file?
  (number? (index-of args "-o")))

(define get-nth
  (lambda (index lst)
    (let loop ((index index) (my-list lst))
      (cond ((null? my-list) lst)
            ((= index 0) (car my-list))
            (else (loop (- index 1) (cdr my-list)))))))

(define (name-out-file lst) ; chiamata solo se output-on-file? è #t
  (define n (index-of lst "-o"))
  (if (lines my-file))
    (for ([line lines])
      (cond
        [(and num? (not output-on-file?))
       (set! nr (+ nr 1))
       (displayln (format "~a ~a" nr line))]
      [(and (not num?) (not output-on-file?))
       (displayln (format "~a" line))]
      [(and (not num?) output-on-file?)
       (displayln (format "~a" line) outp)]
      [(and num? output-on-file?)
       (set! nr (+ nr 1))
       (displayln (format "~a ~a" nr line) outp)]))
  (if output-on-file?
      (close-output-port outp) #t)
  (displayln ""))
(main)

r17

Sì, funziona ma non mi piace: troppi define e set!. Non sono funzionale 😦 Da rivedere ancora 🙄 prossimamente.

:mrgreen:

Posta un commento o usa questo indirizzo per il trackback.

Trackback

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: