100 porte, diversi linguaggi – 2

279

Continuo da qui.
Intanto una precisazione:
Domanda: perché quei linguaggi quando ce ne sono tanti altri anche molto conosciuti che non compaiono?
Risposta: diversi motivi. Alcuni linguaggi sono proprietari e non freeware (C#, Delphi, Mathematica, MatLab, Visual Basic), a volte legati a un particolare sistema operativo (C#, Delphi, Visual Basic). Poi ci sono quelli ancora troppo nuovi, almeno per me e il mio coautore mysteriouso (Rust, Scala), quelli che troppo lispici (Common Lisp, Clojure) o troppo per il web (Clojure, Coffee Script, Dart). Poi ci sono quelli no a prescindere (C++, Go, Java, Julia). Ci sono anche i rivali di Python (Lua, Ruby).
Ecco si vede che la scelta è molto personale; ci sono quelli che uso (usiamo) con esclusioni arbitrarie.

Per esempio il C++ è immediato:

#include 
using namespace std;
 
int main()
{
  bool is_open[100] = { false };
 
  // do the 100 passes
  for (int pass = 0; pass < 100; ++pass)
    for (int door = pass; door < 100; door += pass+1)
      is_open[door] = !is_open[door];
 
  // output the result
  for (int door = 0; door < 100; ++door)
    cout << "door #" << door+1 << (is_open[door]? " is open." : " is closed.") << endl;
  return 0;
}

d11

Ma, non so se capita solo a me, il C++ è considerato troppo difficile. Non in questo caso dove non ci sono i soliti spauracchi quali puntatori, classi, templates, … In effetti l’esempio è troppo semplice. Capita che a scuola qualche esame con dentro il C/C++ ti costringono a darlo ma è uno di quelli che poi servono solo diversamente 😉 e in pratica si usano cose più semplici.

Lo stesso discorso vale per Java dove c’è da sapere un sacco di cose, ti devi specializzare e poi userai solo quello. Più semplice ma rientra nella categoria anche Go. Uno dei miei contatti si è convertito al 100% ma solo lui e, a quanto ne so, non tenta di fare proseliti (poi adesso ha cambiato continente, attendo il ritorno).

Il fatto fondamentale è che c’è Python. Per Python sono disponibili librerie per tutto quello che serve, quasi. Ed è relativamente semplice, almeno fin quando non si tentano di usare certe particolarità (i decoratori, p.es.) o cose che non si sa perché ci sono (lambda) e altre di cui si può fare a meno (list comprehension). Python ha sostituito il Basic per quasi tutto in Windows. Vero che manca una GUI come si deve e non pare sia prevista per il futuro.
In alternativa a Python c’è chi usa Lua o Ruby. Ma dovendo scegliere l’ecosistema di Python è migliore e anche più conosciuto.
Per cui Python (quasi sempre).

Rispetto al codice del post precedente vorrei fare un paio di considerazioni, correzioni. Lo script di Python è OK ma –secondo me– non corretto. Funziona ma in caso di successive modifiche potrebbe generare confusione il ciclo troppo generico. In fondo si tratta di aggiungere una riga di codice e diventa tutto più chiaro:

doors = [False] * 100 
for i in range(100):
    for j in range(i, 100, i+1):
        doors[j] = not doors[j]
for i in range(100):
    if doors[i]:
        print("Door %d:" % (i+1), "is open")

La questione è in qualche misura solo teorica: se lo script fosse più complesso sarebbe (dovrebbe davvero essere) composto di funzioni, in questo caso 2, una che calcola e una che visualizza il risultato.
E qui emerge un’altra questione: la programmazione funzionale (FP).
Così come ceri linguaggi sono considerati difficili anche la FP è difficile; non è vero ma bisogna abituarsi. E se non è necessaria probabilmente si può non usare.

Per esempio prendi lo script per Racket: è diverso, bisogna vedere come le funzioni si chiamano l’un l’altra per capire cosa succede. Anche se DrRacket (ottimo davvero) in modalità di debug rende tutto facile. Però volendo si poteva scrivere in modo molto divrso, più simile a quello usuale (si sa che sono un aspirante lisper e a volte…). Lo script di newLISP è quasi compatibile (newLISP è simile, anche se non esattamente uguale, a Scheme, il Lisp corrente, Common Lisp avrebbe bisogno, secondo me, di una versiona aggiornata, svecchiante, lo stesso che è capitato con tanti altri linguaggi, tipo Basic, Fortran, Perl). Ecco la mia versione: No, aspetta, prossimamente, ci sono un paio di cose da vedere 😦 🙄

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