Ricerca nel sito web

Inizia a programmare in Racket scrivendo un gioco "indovina il numero".


Racket è un ottimo modo per imparare una lingua delle famiglie Scheme e Lisp.

Sono un grande sostenitore dell’apprendimento di più linguaggi di programmazione. Ciò è dovuto principalmente al fatto che tendo ad annoiarmi con le lingue che uso di più. Mi insegna anche modi nuovi e interessanti di affrontare la programmazione.

Scrivere lo stesso programma in più lingue è un buon modo per apprenderne le differenze e le somiglianze. In precedenza, ho scritto articoli che mostravano lo stesso programma di tracciamento di dati di esempio scritto in C e C++, JavaScript con Node.js e Python e Octave.

Questo articolo fa parte di un'altra serie sulla scrittura di un gioco "indovina il numero" in diversi linguaggi di programmazione. In questo gioco il computer sceglie un numero compreso tra 1 e 100 e ti chiede di indovinarlo. Il programma va in loop finché non fai un'ipotesi corretta.

Imparare una nuova lingua

Contenuto relativo

Avventurarsi in una nuova lingua è sempre imbarazzante: mi sento come se stessi perdendo tempo poiché sarebbe molto più veloce utilizzare gli strumenti che conosco e utilizzo sempre. Per fortuna all’inizio sono anche molto entusiasta di imparare qualcosa di nuovo e questo mi aiuta a superare il dolore iniziale. E una volta che apprendo una nuova prospettiva o una soluzione a cui non avrei mai pensato, le cose diventano interessanti! Imparare nuove lingue mi aiuta anche a trasferire nuove tecniche ai miei strumenti vecchi e testati.

Quando inizio a imparare una nuova lingua, di solito cerco un tutorial che mi introduca alla sua sintassi. Una volta che ho familiarità con la sintassi, inizio a lavorare su un programma che conosco e cerco esempi che si adattino alle mie esigenze.

Cos'è la racchetta?

Racket è un linguaggio di programmazione della famiglia Scheme, che è un dialetto del Lisp. Il Lisp è anche una famiglia di linguaggi, il che può rendere difficile decidere con quale "dialetto" iniziare quando si vuole imparare il Lisp. Tutte le implementazioni hanno vari gradi di compatibilità e questa pletora di opzioni potrebbe allontanare i neofiti. Penso che sia un peccato perché queste lingue sono davvero divertenti e stimolanti!

Iniziare con Racket ha senso perché è molto maturo e versatile e la comunità è molto attiva. Poiché Racket è un linguaggio simile al Lisp, una caratteristica importante è che utilizza la notazione del prefisso e molte parentesi. Le funzioni e gli operatori vengono applicati a un elenco di operandi prefissandoli:

(function-name operand operand ...)

(+ 2 3)
↳ Returns 5

(list 1 2 3 5)
↳ Returns a list containing 1, 2, 3, and 5

(define x 1)
↳ Defines a variable called x with value of 1

(define (f x y) (* x x))
↳ Defines a function called f with two parameters called x and y that returns their product.

Questo è praticamente tutto quello che c'è da sapere sulla sintassi di Racket; il resto è imparare le funzioni dalla documentazione, che è molto approfondita. Ci sono altri aspetti della sintassi, come argomenti di parole chiave e virgolette, ma non sono necessari per questo esempio.

Padroneggiare Racket potrebbe essere difficile e la sua sintassi potrebbe sembrare strana (specialmente se sei abituato a linguaggi come Python), ma lo trovo molto divertente da usare. Un grande vantaggio è l'ambiente di programmazione di Racket, DrRacket, che è di grande supporto, soprattutto quando si inizia a usare il linguaggio.

Le principali distribuzioni Linux offrono versioni pacchettizzate di Racket, quindi l'installazione dovrebbe essere semplice.

Indovina il gioco dei numeri in Racket

Ecco una versione del programma "indovina il numero" scritto in Racket:

#lang racket

(define (inquire-user number)
  (display "Insert a number: ")
  (define guess (string->number (read-line)))
  (cond [(> number guess) (displayln "Too low") (inquire-user number)]
        [(< number guess) (displayln "Too high") (inquire-user number)]
        [else (displayln "Correct!")]))

(displayln "Guess a number between 1 and 100")
(inquire-user (random 1 101))

Salva questo elenco in un file chiamato guess.rkt ed eseguilo:

$ racket guess.rkt

Ecco alcuni esempi di output:

Guess a number between 1 and 100
Insert a number: 90
Too high
Insert a number: 50
Too high
Insert a number: 20
Too high
Insert a number: 10
Too low
Insert a number: 12
Too low
Insert a number: 13
Too low
Insert a number: 14
Too low
Insert a number: 15
Correct!

Comprendere il programma

Esaminerò il programma riga per riga. La prima riga dichiara la lingua in cui è scritto il listato: #lang racket. Questo potrebbe sembrare strano, ma Racket è molto bravo a scrivere interpreti per nuovi linguaggi specifici del dominio. Niente panico, però! Puoi usare Racket così com'è perché è molto ricco di strumenti.

Ora passiamo alla riga successiva. (define ...) viene utilizzato per dichiarare nuove variabili o funzioni. Qui definisce una nuova funzione chiamata inquire-user che accetta il parametro number. Il parametro number è il numero casuale che l'utente dovrà indovinare. Il resto del codice tra parentesi della procedura define è il corpo della funzione inquire-user. Notare che il nome della funzione contiene un trattino; questo è lo stile idiomatico di Racket per scrivere un nome di variabile lungo.

Questa funzione richiama se stessa in modo ricorsivo per ripetere la domanda finché l'utente non indovina il numero giusto. Nota che non sto usando i loop; Sento che ai programmatori Racket non piacciono i loop e utilizzano solo funzioni ricorsive. Questo approccio è tipico di Racket, ma se preferisci, i loop sono un'opzione.

Il primo passo della funzione inquire-user chiede all'utente di inserire un numero scrivendo quella stringa sulla console. Quindi definisce una variabile chiamata guess che contiene qualunque cosa l'utente abbia inserito. La funzione read-line restituisce l'input dell'utente come una stringa. La stringa viene quindi convertita in un numero con la funzione string->number. Dopo la definizione della variabile, la funzione cond accetta una serie di condizioni. Se una condizione è soddisfatta, esegue il codice all'interno di quella condizione. Queste condizioni, (> numero indovinato) e (< numero indovinato), sono seguite da due funzioni: un displayln che fornisce indizi all'utente e una chiamata inquire-user. La funzione si richiama automaticamente quando l'utente non indovina il numero giusto. La clausola else viene eseguita quando le due condizioni non sono soddisfatte, ovvero l'utente inserisce il numero corretto. Il cuore del programma è questa funzione richiedi informazioni all'utente.

Tuttavia, la funzione deve ancora essere richiamata! Innanzitutto, il programma chiede all'utente di indovinare un numero compreso tra 1 e 100, quindi chiama la funzione inquire-user con un numero casuale. Il numero casuale viene generato con la funzione random. Devi informare la funzione che vuoi generare un numero compreso tra 1 e 100, ma la funzione random genera numeri interi fino a max-1, quindi ho usato 101.

Prova Racchetta

Imparare nuove lingue è divertente! Sono un grande sostenitore del poliglottismo dei linguaggi di programmazione perché apporta approcci e approfondimenti nuovi e interessanti alla programmazione. Racket è una grande opportunità per iniziare a imparare a programmare con un linguaggio simile al Lisp. Ti suggerisco di provarlo.

Articoli correlati: