Argomenti opzionali

f1Buon anno, nèh! Dopo le feste (che comunque ho passato con Python) riprendo finalmente Racket ❤❤❤
Nel frattempo ho dimenticato tutto— qualcosa, per esempio com’è già che si fa per avere una procedura con argomenti opzionali?
Racket (e Scheme) usano una sintassi diversa da altri linguaggi della famiglia Lisp, il punto. Ecco un esempio elementare, suddiviso in due files:

1 – ciao.rkt:

#lang racket/base

(provide ciao)

(define (ciao . chi)
  (display "ciao")
  (when (not (null? chi))
    (display " ")          ;; usare car, non first,
    (display (car chi)))   ;; manca in racket/base
  (displayln "!"))

2 – test-ciao.rkt:

#lang racket/base

(require "ciao.rkt")

(displayln "liscio:")
(ciao)
(displayln "con nome:")
(ciao "Juhan")

v0

Una cosa che mi ha sorpreso (e non so se è un errore mio) è che first e car non sono esattamente intercambiabili. Forse first non è presente in racket/base ma non ho trovato niente in proposito nella documentazione, chissà 🙄

Naturalmente degli argomenti opzionali ne avevo già parlato, copiando, qui.
OK, vediamo se ricordo bene (devo riprendermi dalle feste, sono un po’ arrugginito), file var-args.rkt:

#lang racket/base

(define (2-arg+opt uno due . rst)
  (displayln uno)
  (displayln due)
  (displayln rst))

;; test
(2-arg+opt "Alpha" "Beta")
(2-arg+opt "Alpha" "Beta" "Gamma")
(2-arg+opt "Alpha" "Beta" "Gamma" "Delta")
(2-arg+opt "Uno solo")

v1

OK, tutto come previsto, compreso l’errore finale.

Gli argomenti opzionali sono una lista, ma per quello niente panico 😉 file var-args-mod.rkt:

#lang racket/base

(define (2-arg+opt uno due . rst)
  (displayln uno)
  (displayln due)
  (displayln rst)
  (printf "~a argomenti opzionali\n" (length rst))
  (define varg rst)
  (displayln varg)
  (for ((i varg))
      (displayln (car varg))
    (set! varg (cdr varg)))
  (display "\n"))

;; test
(2-arg+opt "Alpha" "Beta")
(2-arg+opt "Alpha" "Beta" "Gamma")
(2-arg+opt "Alpha" "Beta" "Gamma" "Delta")

v2

Però, ora che ci penso esiste for/list, sembra fatta apposta file var-args-mod-fl.rkt:

#lang racket/base

(define (2-arg+opt uno due . rst)
  (displayln uno)
  (displayln due)
  (displayln rst)
  (printf "~a argomenti opzionali\n" (length rst))
  (for/list ((i rst))
      (displayln i))
  (display "\n"))

;; test
(2-arg+opt "Alpha" "Beta")
(2-arg+opt "Alpha" "Beta" "Gamma")
(2-arg+opt "Alpha" "Beta" "Gamma" "Delta")

v3

È incredibile come una settimana di pythonismi intensivi influisca sulle mie capacità racketistiche; devo smettere 🙄

:mrgreen:

Posta un commento o usa questo indirizzo per il 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: