Variabili: uso e abuso

CiEUn tweet di un programmatore funzionale che riporta un tweet che –OK, è qui.

v0

OK, pythonisticamente è corretto. [2] è una lista contenente l’intero 2.

v1

In Python, come in taaanti linguaggi ‘normali‘ le variabili sono –come dice il nome– variabili e possono essere ridefinite.
Ma forse Python esagera, consideriamo il ciclo seguente:

v2

Sembra tutto OK, vero?
Ma forse… approfondiamo:

v3

Uhmmm… qui l’indice del ciclo viene modificato all’interno del ciclo stesso ma ciò non turba l’interprete che al giro successivo sa di dover usare l’elemento successivo della lista. La stessa cosa capita se usiamo range(), che infatti produce la lista usata dal ciclo:

v4

OK 😀

Fin qui è tutto abbastanza scontato, tranne per i nuovi che usano solo linguaggi strettamente funzionali (un po’ li invidio) ma a me che sono vecchio è tornata in mente una cosa di tanto tempo fa. Adesso ve la racconto.
Illo tempore ogni computer aveva il suo sistema operativo, proprietario e di solito diverso da tutti gli altri. Anche i compilatori, di sicuro il Fortran e pochi altri. Quando è nato il PC IBM con il DOS di Microsoft è successo che (numero dei sistemi operativi)++, nient’altro; e peraltro tutt’altro che buono. Ma sto divagando.

Riprendo l’esempio che appalla i funzionali, in Fortran 77, quello corrente di allora si ha (uso i al posto di x per le convenzioni implicite del linguaggio):

* c0.f
      i = 1
      do 10, i = 2, 4
          print *, i
10    end do
      print *, i      
      
      end

v5

OK, a parte s/for/do/ e * per dire ‘default’ in print tutto come previsto.

Occorre anche considerare una cosa che tutti i fortrainers davano per scontato: all’uscita del ciclo il contatore è incrementato. Ma è inaffidabile, tra l’altro varia rispetto alla versione precedente del compilatore (Fortran IV).
Vediamo se si può, come in Python, …

* c1.f
      i = 1
      do 10, i = 2, 4
          i = 2 * i
          print *, i
10    end do
      print *, i
      
      end

v6No, nope! come previsto il compilatore GNU segnala la violazione.

Ci può essere un caso più sottile, quello capitatomi (io ero il debugger):

* c2.f
      i = 1
      do 10, i = 2, 4
          call doppio(i)
10    end do
      print *, i
      
      end
      
      subroutine doppio(n)
      n = 2 * n
      print *, n
      end

v7

OOPS! 😳 cos’è successo? I fortrainers lo sanno: le variabili vengono sempre passate per indirizzo a funzioni e subroutines. In questo caso l’indice del ciclo viene modificato all’interno del ciclo stesso ma il compilatore non può saperlo. È cura del programmatore –che queste cose le dovrebbe sapere– diminuire il carico di lavoro al debugger, sempre che il bug venga rilevato, possibilmente presto 😀

Al programmatore era stato senz’altro stato detto anche “cambia il nome alle variabili” che è una frase ce dev’essere interpretata e tradotta in linguaggio normale. Vediamola applicata:

* c3.f
      i = 1
      do 10, i = 2, 4
          call doppio(i)
10    end do
      print *, i
      
      end
      
      subroutine doppio(k)
      n = k
      n = 2 * n
      print *, n
      end

v8OK 😀 C’era un altro motivo per cambiare le variabili, cosa che oggi probabilmente ha meno senso: le variabili locali sono near pointers mentre le globali sono far pointers. Non credo di dire cose nuove, ma forse dimenticate al momento opportuno 😉

: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: