HtDP – Tipi di dati – 6 – dalle funzioni ai programmi

c3Proseguo da qui leggendo qui.

Sì, non so tradurre il titolo del capitolo, “conoscenza del dominio” mi suona strano, anche se forse è quello.
Ma lo spiega bene il testo, andate a leggerlo di là. Diventa sempre più difficile il mio compito: non posso|voglio riportare tutto, non voglio tradurre (è inutile), non si può riassumere. Ma continuo perché così sono costretto a leggere tutto attentamente e non metterlo nel “OK, è lì per quando mi servirà”.

Dalle funzioni ai programmi

Not all programs consist of a single function definition. Some require several functions, many also use constant definitions. No matter what, it is always important to design each function of a program systematically, though both global constants and the presence of auxiliary functions change the design process a bit.

Multi-function programs come about because interactive programs automatically need event handling functions, state rendering functions, and possibly more.

For these reasons, we recommend keeping around a list of needed functions or a wish list.
Cosa sia e come dev’essere fatta la fondamentale lista dei desideri dovete leggerlo di là :grin:

Testare

Testing quickly becomes a labor-intensive chore.
Io da piccolo ero spesso costretto a fare il debug di cose scritte da altri, di solito non reperibili. Al solito, non avevano letto attentamente cosa dice Matthias :grin:
Il capitolo “Designing World Programs” spiega passo-passo come fare, lungo ma ottimo. Sì mi sto ripetendo, spesso ma non è colpa mia.

Adesso mi sento anche in colpa perché sospendo qui. C’è parecchio da vedere di là. Riprenderò da “3.7 A Note on Mice and Characters“, ma non subito :mrgreen:

Il problema dell’ora con Python

lazare-clocksUn post di Julien Danjou, Timezones and Python risolve forse, o forse no…
Julien la sa lunga su tante cose, guarda qui.

Recently, I’ve been fighting with the never ending issue of timezones

D’ho, me too! più volte; chissà se oggi si arriva a a qualcosa di utile?

tz0
Ecco, a cosa si riferisce? UTC o locale? Perso.
Julien riporta che Armin Ronacher dice di considerare gli oggetti datetime non specificati diversamente sempre come UTC; è la soluzione che avevo adottato anch’io.
Ma Julien va oltre, forse, vediamo.
Raccomanda di usare sempre oggetti datetime completi di informazione timezone. Per questo c’è pytz.
Inoltre usare il formato ISO8601 sia in input che output.

tz1

OOPS! :oops: pytz mi manca!

provo a installarlo! ATZ! solo per Python 2.7.x, OK, tanto vale fino al 2020.

Devo installare easy_install con

sudo apt-get install python-setuptools

e quindi pytz

sudo easy_install --upgrade pytz

ed ecco:

tz2

Adesso manca iso8601, installo con

sudo easy_install iso8601

tz3

Però non finisce qui; la documentazione di pytz riporta cose interessanti.

The preferred way of dealing with times is to always work in UTC, converting to localtime only when generating output to be read by humans.

Ed è un pasticcio, proprio come quello che avevo fatto io, senza pytz, bocciato :evil:

Ci sono però parecchie cose, forse anche quello che serve:

tz4

Ma forse no. E se… sì Stack Overflow :grin:
Risulta che si può, ma è tutt’altro che facile, non so nemmeno se mettere il link. Lo metto solo per i più avventurosi, qui: Converting datetime.date to UTC timestamp in Python.

Quindi:

  • Python correggi altrimenti lo dico in giro;
  • Usare sempre UTC se avete a che fare con gente lontana, mettendo l’offset a UTC. Pensa te che per certe zone (India, parte del Canada) si va a mezz’ore.

Intanto Ok, panico :mrgreen:

HtDP – Tipi di dati – 5 – come progettare programmi

Matthias_FelleisenContinuo da qui, ma è solo un commento a qui.

Come progettare i programmi

Nell’immagine lì sopra c’è Matthias Felleisen il creatore di Racket. Devo metterla perché quello che dice in questo capitolo è bellissimo. E scritto benissimo. Per fortuna non sono invidioso :wink: Ma sono anche pigro e poco bravo, non traduco :oops: Tanto so che andrete tutti di là (dai commenti risulta un secondo lettore per Lisp e derivati :grin: ottimo). Riporto solo pezzettini, non necessariamente i più importanti, per esempio questa è una vendetta molto tardiva: A good program comes with a short write-up that explains what it does, what inputs it expects, and what it produces. Ideally, it also comes with some assurance that it actually works. In the best circumstances, the program’s connection to the problem statement is evident so that a small change to the problem statement is easy to translate into a small change to the program. Software engineers call this a “programming product.”

[C]lients tend to change their mind about what problem they really want solved. They usually have it almost right, but more often than not, they get some details wrong. Worse, complex logical constructions such as programs almost always suffer from human errors; in short, programmers make mistakes. Eventually someone discovers these errors and programmers must fix them. They need to re-read the programs from a month ago, a year ago, or twenty years ago and change them.

In this book, we present a design recipe that integrates a step-by-step process with a way of organizing programs around problem data.

Progettazione delle funzioni

Al solito non è riassumibile senza banalizzare; si parla di concetti come informazioni e dati. Il programma processa questi dati che trasforma in informazioni.

Software engineers use the slogan model-view-control (MVC) for the way BSL and DrRacket separate data processing from parsing information into data and turning data into information.
Here we use the “batch-io” and “universe” teachpacks to demonstrate how complete programs are designed. That is, this book—starting with this chapter—provides a design recipe for batch and interactive programs to give you an idea of how complete programs are designed. But, keep in mind that the libraries of full-fledged programming languages offer many more tools than these teachpacks.

from information to data, and back

from information to data, and back

Quello che segue è da assimilare tutto. Vale per i niubbi nuovi novizi come anche per chi non lo è più. Certe regole, chiare e tanto semplici da poter sembrare banali e darle per scontate poi risulta che non lo erano, secondo me, nèh! :wink:
Per cui tutti di là.

Esercizi per le dita

Davvero dice così :lol: e propone 5 esercizi semplici per abituarsi a usare le regole enunciate. Ognuno inizia infatti con design e non define.

A questo punto il post sembra corto. Invece no, è tutto di là. E c’è parecchio, pausa, lunga (qui) ma non per voi :grin:

Poi riprenderò da 3.3 Domain Knowledge :mrgreen:

HtDP – Tipi di dati – 4

Tweedledum_tennielContinuo da qui a parlare di quello che c’è qui.

Programmi

You are ready to create simple programs. From a coding perspective, a program is just a bunch of function and constant definitions. Usually one function is singled out as the “main” function, and this main function tends to compose others.

Ci sono due tipi di programmi: batch e interattivi. Anticamente (ai miei tempi) erano tutti batch. Anzi si chiamano batch proprio per via di informare il pacco di schede nel lettore (OK, non così vecchio ma di schede ne ho perforate anch’io). Oggi vincono alla grande gli interattivi, come quelli degli ambienti grafici (GUI), tranne qualche calcolo pesante. Ma anche la REPL è interattiva e c’è da sempre.

This book focuses mostly on programs that interact via graphical user interfaces (GUI); there are other kinds of interactive programs, and you will get to know those as you continue to study computer science.

La pagina di HtDP parte facendo un esempio piccolissimo di programma batch. Vedetelo di la. Io dico soltanto che usiamo due nuove funzioni write-file e read-file. Ci sono anche due dati di tipo speciale: 'stdin e 'stdout, notare l’apice iniziale (in Lisp classico avrebbe un significato completamente differente).

Bello che “[t]his book is not about memorizing facts, but we do expect you to know where to find them.:grin:

Poi ci sono altri esempi e esercizi che vanno fatti per impratichirsi ma niente di nuovo.

Poi s passa a
Interactive Programs
No matter how you look at it, batch programs are old-fashioned. Even if businesses have used them for decades to automate useful tasks, people prefer interactive programs. Indeed, in this day and age, people mostly interact with desktop applications via a keyboard and a mouse generating input events such as key presses or mouse clicks. Furthermore, interactive programs can also react to computer-generated events, for example, clock ticks or the arrival of a message from some other computer.

E si passa a farne uno. Passo-passo e si potrà tornare quando ne sapremo di più, per intanto:

d12

Adesso però ci dice di usare un’espressione di big-bang. big-bang è un Package che vedremo presto, per intanto pensatelo come una libreria di funzioni.
Nella finestra interattiva (quella sotto) iseriamo:
(big-bang 100 [to-draw number->square])
Questa istruzione crea la seguente finestra:

d13

che è lo stato iniziale dell’animazione. Chiudiamo la finestra e creiamo l’animazione:

d14

OK? notare le parentesi quadre ma le tonde sarebbero andate ugualmente bene e le funzioni nuove to-draw, on-tick, sub1, stop-when e zero?. Alcune sono di Racket, altre di big-bang. Siccome sono link attivi potete dovete fare click per saperne di più :grin:

A questo punto le cose diventano interessanti. Occorre inserire nell’area delle definizioni (quella in alto) di DrRacket l’espressione:

(define (reset s ke)
  100)

e nella finestra interattiva inserire:

(big-bang 100
    [to-draw number->square]
    [on-tick sub1]
    [stop-when zero?]
    [on-key reset])

cioè alla pressione di un tasto rilevata dalla funzione on-key viene chiamata reset, funzione che abbiamo appena definito.

Adesso provate a premere un tasto mentre il quadrato decresce e stupite :wink:
Ma è solo l’inizio (cit.), di là trovate tutto, altre funzioni di big-bang come on-key, on-mouse, …
Vero che vedete tutto di là?
E se disorientati, anzi in ogni caso:

Take a deep breath.

By now, you may feel that these first two chapters are overwhelming. They introduced so many new concepts, including a new language, its vocabulary, its meaning, its idioms, a tool for writing down texts in this vocabulary, running these so-called “programs,” and the inevitable question of how to create them when presented with a problem statement. To overcome this feeling, the next chapter takes a step back and explains how to design programs systematically from scratch, especially interactive programs. So take a breather and continue when ready.

Continuo prossimamente da “3 How To Design Programs:mrgreen:

HtDP – Tipi di dati – 3

f0Continuo da qui, ma c’è tutto qui.

Comporre funzioni

A program rarely consists of a single function definition and an application of that function. Instead, a typical program consists of a “main” function or a small collection of “main event handlers.” All of these use other functions—built-in primitives as well as functions that you define—and turn the result of one function application into the input for another. In analogy to middle school mathematics, we call this way of defining functions composition, and we call these additional functions auxiliary functions or helper functions.

Ecco un esempio, una lettera, questo è il programma:

#lang racket
(define (letter fst lst signature-name)
  (string-append
    (opening fst)
    "\n\n"
    (body fst lst)
    "\n\n"
    (closing signature-name)))
 
(define (opening fst)
  (string-append "Dear " fst ","))
 
(define (body fst lst)
  (string-append
   "We have discovered that all people with the last name " "\n"
   lst " have won our lottery. So, " fst ", " "\n"
   "hurry and pick up your prize."))
 
(define (closing signature-name)
  (string-append
   "Sincerely,"
   "\n\n"
   signature-name))

d10

Conviene probabilmente vedere cosa capita con il debugger, far eseguire un passo per volta. Per questo fare click su Debug e poi inserire l’espressione (letter "Matthew" "Fisler" "Felleisen") seguita da Invio nella Interactions Window (quella in basso). A questo punto premendo il pulsante Step si vede come viene eseguito il programma.

d11

Chiaro? Vogliamo vederlo in dettaglio a parole, dai!

L’esecuzione parte dalla prima espressione –composta, contiene subespressioni come vedremo tra poco– letter. letter si aspetta tre parametri, fst, lst e signature-name. Non ho cambiato i nomi delle variabili che sarebbero nome, cognome e nome-firma. Questi nomi vengono precisati dalla valutazione della funzione, con l’istruzione che inseriamo nella finestra di interazione. Varranno pertanto rispettivamente “Matthew”, “Fisler” e “Felleisen”. Tornando al programma vediamo che c’è una chiamata a string-append, che già conosciamo, concatena le stringhe che le vengono passate. Nel nostro caso le passiamo 5 stringhe di cui la seconda e la quarta sono “\n\n” che sta per a-capo (newline, in piemontese inglese). Le altre stringhe sono non letterali ma saranno tornate da funzioni. Pertanto l’esecuzione del programma salta ala riga (define (opening fst) ...) dove costruisce la stringa “Dear Matthew,” e questa stringa viene ritornata al punto dove la funzione è stata chiamata. Una cosa che anticipo (o forse è stato detto ma mi sono distratto –capita): una funzione restituisce l’ultimo valore calcolato. Tornati in letter alla stringa vengono aggiunti i 2 a-capo e poi si passa a body con i parametri fst e lst. body costruisce anche lei una stringa, questa: “We have discovered that all people with the last name \n Fisler have won our lottery. So, Matthew, \n hurry and pick up your prize.” Come vedete i parametri sono stati sostituiti (in gergo “consumati”) dai loro valori.
Tornati a letter e aggiunta la stringa di body a quella in costruzione si aggiunge la successiva e si passa a closing con il parametro signature-name. closing –indovina– costruisce una stringa che verrà tornata e aggiunta a quella in costruzione.
Il programma finisce lì, era stato lanciato con una chiamata a letter e letter è completata, ritorna la stringa costruita. Questa:

Dear Matthew,

We have discovered that all people with the last name
Fisler have won our lottery. So, Matthew,
hurry and pick up your prize.

Sincerely,

Felleisen

Atz! non ho vinto, sarà per un’altra volta.

Ci sarebbe ancora una cosa da dire sul programma appena visto (cercate di capirlo bene, è facile e fatto come si deve) ma vedo di trattenermi. Perché prima o poi arriva.
Invece faccio il bravo, seguo il testo.

In general, when a problem refers to distinct tasks of computation, a program should consist of one function per task and a main function that puts it all together. We formulate this idea as a simple slogan:

Define one function per task.

The advantage of following this slogan is that you get reasonably small functions, each of which is easy to comprehend, and whose composition is easy to understand. Later, we see that creating small functions that work correctly is much easier than creating one large function. Better yet, if you ever need to change a part of the program due to some change to the problem statement, it tends to be much easier to find the relevant program parts when it is organized as a collection of small functions.

Segue un esempio che conviene fare di là.
Basta, pausa :mrgreen:

Visto nel Web – 187

Non so se posso usare Internet, sia per il Garante e l’hyperDr. che spero di aver frainteso (indagherò ancora). Come se non bastasse la salute che è quella che è e poi è anche mancata la corrente. Ma intanto ecco cosa ho visto nel Web.

pace-12-giugno
Questo sito utilizza i cookie
::: m4gny

Lux
Lux is a new programming language in the making. It’s meant to be a functional, statically-typed Lisp that will run on several platforms, such as the Java Virtual Machine and JavaScript interpreters.
::: LuxLang

Should I Learn Scheme or Common Lisp?
non che sia completamente d’accordo, anzi…
::: YouTube

Il chiarimento del Garante privacy sui cookie: un disastro. A rischio moltissimi siti italiani
::: Valigia Blu

A year with Go
una valutazione molto critica, negativa; ovviamente di parte ma interessante; di Andrew Thompson so che è un’über-nerd ma nient’altro
::: Ramblings of a caremad developer

20120523-151535

Il chiarimento del chiarimento del Garante Privacy chiarisce che avevamo capito bene
::: mante

Beginning Programming (PHP)
::: Stanford Online

Lubit, un sistema per tutti!
lan come si usava una volta e come potrebbe essere usata profiquamente anche oggi — Lubit rockz :grin:
::: the secrets of ubuntu

Il primo semestre di CoderDojo Voghera: qualche numero e considerazione …
un’iniziativa bellissima
::: CoderDojo Voghera

A proposito di #VeryBello
::: lctr82

The IPFS Project
qualcuno lo usa?
::: IPFS

1908127_888676284531127_7395861982419873372_n

Welcome to America: Here’s your Linux computer
::: opensource.com

ghost.py
ghost.py is a webkit web client written in python
::: jeanphix

gatspy: General tools for Astronomical Time Series in Python
::: AstroML

#biscotti e macelleria (2 etti di cookie law?)
::: marcolaudonio

Nanobot on a breeze by Tom Gauld
::: ulaulaman

rust

Time for a new OS… why not try #Ubuntu?
::: DellCaresPRO

Notizie varie (e cookie!)
::: La fumettista curiosa

La rivoluzione silenziosa dell’anarchico di Telegram
::: StartupItalia!

Cipolla e il Garante
::: IWA Italy

start typing…
::: GeoPattern

Google and Facebook Cancel Satellite Plans
::: Slashdot ::: Slashdot

expo for dummies

A Computer That Operates On Water Droplets
per chi legge Terry Pratchett sa che non sarebbe una novità, c’è HEX :grin.
::: Slashdot

Deadlines
normale amministrazione
::: CommitStrip

Cookie Law: il buonsenso non la consentirebbe
::: manteblog

LispyScript
A javascript With Lispy Syntax And Macros!
::: LispyScript

German Parliament May Need To Replace All Hardware and Software To Stop Malware
::: Slashdot

How Instagram Is Transforming Professional Cooking
::: Wired

Elias Palaniuc

Nope()
::: _wirepair

Please do us a solid and disable your ad blocker
::: N_O_D_E_

The Death Of The Von Neumann Architecture
la solita fregatura del software proprietario; adesso ancora peggio
::: codersnotes

Ecco l’ #infografica riepilogativa del Garante Privacy sulla #cookielaw
::: diritto2punto0

E se Umberto Eco avesse “ragione”? Gli imbecilli, internet e le rivoluzioni culturali
::: Giornalismo d’altri ::: Il Post ::: chiaralalli ::: manteblog ::: la Stampa ::: Comune-info

11401186_568641156610769_6891925342388086547_n

Cookie e privacy: istruzioni per l’uso
::: Garante Privacy

How Much Python Do You Need To Know To Be Useful?
::: Slashdot

Window managers -5- 2bwm
avendo tempo…
::: Extended Reality

TeX Live
::: TeX Users Group

now

HtDP – Tipi di dati – 2

l4Continuo da qui. La versione originale cui rimando continuamente è qui.

Aritmetica delle immagini

Images represent symbolic data somewhat like strings. Like strings, you used DrRacket to insert images wherever you would insert an expression into your program, because images are values just like numbers and strings.

To work with images, use the “2htdp/image” teachpack.

The first kind concerns the creation of basic images:

  • circle produces a circle image from a radius, a mode string, and a color string;
  • ellipse produces an ellipse from two radii, a mode string, and a color string;
  • line produces a line from two points and a color string;
  • rectangle produces a rectangle from a width, a height, a mode string, and a color string;
  • text produces a text image from a string, a font size, and a color string;
  • triangle produces an upward-pointing equilateral triangle from a size, a mode string, and a color string.

Dai mica copio tutto, andate a vedere di là. Ma poi tornate, nèh! :grin:

d4

To save, (right) click on the image and use the pop-up menu to save the image.

Provate guardando regular-polygon.
Ci sono parecchie funzioni da vedere, le dimensioni dell’immagine sono in image-width e image-height. Per comporre le figure c’è la serie overlay. empty-scene crea uno sfondo delle dimensioni specificate, place-image –OK, si capisce dal nome :wink:

d5

Aritmetica dei booleani

We need one last kind of primitive data before we can design programs: Boolean values. There are only two kinds of Boolean values: true and false.
Ci sono tre funzioni or, and e not:

  • or ritorna vero se almeno un valore è vero (true, #t);
  • and ritorna vero se tutti i valori sono veri;
  • not ritorna il booleano complementare.

Adesso una cosa che per praticità faccio nella REPL (sapete che sono vecchio); inoltre siamo ancora all’inizio, non definiamo una procedura ma semplici variabili, come vedrete:

d6

Ecco come fare, c’è l’istruzione if:

d7

questo perché if valuta la prima subexpression che deve ritornare un booleano; se questo è vero esegue la seconda subexpression altrimenti la terza.

Oltre che = ci sono altre primitive, <, <=, >, >=.
Le stringhe sono comparate non con = ma con string=? e simili (string<=?, …). Le immagini si comparano con image=? e simili.

Ci sono poi casi in cui capitano cose diverse da come ci si aspetta, per esempio:

d8

Ovvio, è un numero complesso.

Funzioni e programmi

As far as programming is concerned, arithmetic is half the game. The other half is “algebra.” Of course, our notion of “algebra” relates to the school notion of algebra just as much as the notion of “arithmetic” from the preceding chapter relates to the ordinary notion of grade-school arithmetic. The creation of real programs involves variables and thus functions, meaning basic notions from algebra. Once we can deal with functions, we can move on to programs, which “compose” functions to achieve their overall purpose.

oops! ho copiato tutto; spero che il prof non se ne accorga :wink:

Funzioni

From a high-level perspective, a program is a function. A program, like a function in mathematics, consumes inputs, and it produces outputs. Ma diversamente dalla mate possiamo avere non solo numeri ma stringhe, immagini e altro ancora.

Every BSL programs consists of definitions, usually followed by an expression that involves those definitions. There are two kinds of definitions, constant definitions and function definitions.

La definizione di una costante è semplice (define nome valore) quella di funzione un po’ più articolata.

(define (nome-funzione parametro-1 parametro-2 parametro-n) (espressione-corpo-della-funzione))

I parametri sono tutti opzionali, l’espressione-corpo-della-funzione può essere (di solito lo è) composta da subespressioni.
Esempi (cambio, quelli del testo sono troppo semplici:

d9

pausa ma compito a casa: ci sono nel testo esempi e una decina di esercizi, facilissimi. La prossima volta riprendo da 2.2 Composing Functions :mrgreen:

HtDP – Tipi di dati – 1

x_012

Prima di cominciare il capitolo I una nota e una notizia di quelle che fanno bene (a me, certo): ho almeno un follower per Racket, purtroppo non tanto vicino, ma chissà…
Ieri mi ha chiesto una cosa che penso possa interessare anche altri:
Q: dove trovo i documenti cui fai riferimento?
A: dipende dalle impostazioni di installazione ma puoi scoprirlo facilmente dalla REPL, così:

d0

Sì, Firefox scrive un messaggio d’errore ma è solo per far vedere che deve fare tutto lui, niente di che.
Piuttosto, per abitudine ho usato un alias: alias rre='racket -il xrepl'.
Oppure, più tradizionalmente in DrRacket la prima voce del menu Help fa la stessa cosa.

Una nota prima di iniziare

Il sito HtDP è molto didascalico, non si può riassumere, se non per prendere appunti che rimandano comunque là. C’è poi un’altra cosa ancora: il testo è scritto molto bene, chiaro, comprensibile. Non mi è ancora capitato di trovare frasi da interpretare, sospendere il giudizio cercando l’esempio chiarificatore. Questo a differenza di altre cose che ho visto recentemente dove a volte… È un vizio che ho anch’io quando uso un linguaggio LOLloso, non lo faccio più (quasi) :wink:

Per cui solo note e rimandi (spesso impliciti) alla fonte.

Dati

Every programming language comes with a language of data and a language of operations on data.
Il compito del programmatore è di combinare questi due tipi di dati.

Aritmetica

Nei post precedenti abbiamo visto come scrivere un’espressione:

(nome-di-un-operazione-primitiva argomento1 argomento2 …)

esempio:

(+ 1 2)

+ somma gli argomenti che seguono e restituisce il valore di questa somma.
C’è subito un’estensione:

(+ 1 (+ 1 (+ 1 1) 2) 3 (+ 2 2) 5)

che si comporta così; parte dalle sub-espressioni più interne sostituendole con il loro valore sino a ottenere un solo valore, vale a dire:

(+ 1 (+ 1 (+ 1 1) 2) 3 (+ 2 2) 5)
(+ 1 (+ 1 2 2) 3 4 5)
(+ 1 5 3 4 5)
18

Questa è la regola fondamentale del Lisp e derivati. È talmente fondamentale che mi sono fiondato a scrivere dimenticandomi quello che avevo appena detto. Mi ricompongo :wink:

Aritmetica dei numeri

Most people think “numbers” and “operations on numbers” when they hear “arithmetic.” “Operations on numbers” means adding two numbers to yield a third; subtracting one number from another; or even determining the greatest common divisor of two numbers. If we don’t take arithmetic too literally, we may even include the sine of an angle, rounding a real number to the closest integer, and so on.

Abbiamo visto che usiamo la notazione prefissa: (+ 3 4), that is, in prefix notation form. Here are some of the operations on numbers that our language provides: +, -, *, /, abs, add1, ceiling, denominator, exact->inexact, expt, floor, gcd, log, max, numerator, quotient, random, remainder, sqr, and tan. We picked our way through the alphabet, just to show the variety of operations. Explore what these do in the interactions area, and then find out how many more there are and what they do.

Nel testo tutte queste parole sono link che rimandano alla definizione, ecco abs:

d1

You will find there that in addition to operations, BSL also recognizes the names of some widely used numbers, for example, pi and e. You might not know e if you have not studied calculus. It’s a real number, close to 2.718, commonly called “Euler’s constant.”

Importante leggere quello che segue sulla precisione dei numeri, i razionali per esempio. Da noi 2/3 è un numero (razionale, appunto). Some of BSL’s numeric operations cannot produce an exact result. For example, using the sqrt operation on 2 produces an irrational number that cannot be described with a finite number of digits. Because computers are of finite size and BSL must somehow fit such numbers into the computer, it chooses an approximation. Nel mio caso non riposta il prefisso #i come indicato sul sito, non credo sia importante.

A questo punto c’è un esercizio da fare: The direct goal of this exercise is to create an expression that computes the distance of some specific Cartesian point (x,y) from the origin (0,0).

d2

OK, la mia versione è leggermente diversa ma è chiara vero? Si parte dalle espressioni più interne e –OOPS! già detto :wink:

Aritmetica delle stringhe

Dai leggetelo di là, anche perché sono cose già viste. Si parla di string-append, string-length, string-ith, number->string e substring.

string-ith è nuova, vediamo:

d3

notare che si comincia a contare da zero, sapete i matematti … :wink:

Pausa? OK :mrgreen:

HtDP – prologo: come programmare – 3

l12Continuo da qui.

Diversi modi per calcolare

L’animazione del razzo di ieri era piuttosto rozza, quando questo tocca terra sparisce ma i razzi non fanno così!
Segue spiegone che non ricopio, non voglio un post tutto blu!
In questo prologo vengono introdotti, quasi di soppiatto, elementi di programmazione, (vatti fidare di certi prof!), per esempio ecco la condizione che da noi si chiama cond. Vogliamo definire la funzione sign(x), così:

sign

Io qui userei a REPL ma mi adeguo, DrRacket:

r17

Nota perso: le parentesi sono intercambiabili purché corrispondenti.

In general, a conditional expression has the shape

(cond
[ConditionExpression1 ResultExpression1]
[ConditionExpression2 ResultExpression2]
....
[ConditionexpressionN ResultExpressionN])

That is, a conditional expressions consists of many conditional lines. Each line contains two expressions: the left one is often called condition and the right one is called result. To evaluate a cond expression, DrRacket evaluates the first condition expression, ConditionExpression. If the evaluation of ConditionExpression1 yields true, DrRacket replaces the cond expression with the first result expression (ResultExpression1) and evaluates it. Whatever value DrRacket obtains is the result of the entire cond expression. If the evaluation of ConditionExpression1 yields false, DrRacket drops the first line and moves on to the second line, which is treated just like the first one. In case all condition expressions evaluate to false, DrRacket signals an error.

This is a good time to explore what the STEP button does. Click STEP for the above sign program. When the new window comes up, click the right and left arrows there.

Chiaro vero? Adesso si può mettere la condizione nell’animazione, vedetela di là, alla fine il programma è questo qui:

r18

Un programma, tante definizioni

Finora abbiamo la scena di 100×100 pixel ma se il capo la vuole di 400×200 dovremmo cambiare i numeri 5 volte. E un programma vero ha molte più linee di quest’esempio. Insomma ci conviene fare un passo avanti.
The tool to achieve this simplicity with BSL is define. In addition to defining functions, you can also introduce constant definitions, which assign some name to a constant. The general shape of a constant definition is straightforward:

(define Name Expression)

Thus, for example, if you write down

(define HEIGHT 100)

in your program, you are saying that HEIGHT always represents the number 100. The meaning of such a definition is what you expect. Whenever DrRacket encounters HEIGHT during its calculations, it uses 100 instead. Of course, you can also add

(define WIDTH 100)

to your program to have one single place where you specify the width of the scene.

r19

The program in figure consists of three definitions: one function definition and two constant definitions. The number 100 occurs only twice: once as the value of WIDTH and once as the value of HEIGHT.

When DrRacket evaluates (animate create-rocket-scene.v4), it replaces HEIGHT with 100 and WIDTH with 100 every time it encounters these names. To experience the joys of real programmers, change the 100 next to HEIGHT into a 400 and click RUN. You see a rocket descending and landing in a 100 by 400 scene. One small change did it all.

In modern parlance, you have just experienced your first program refactoring. Every time you re-organize your program to prepare yourself for likely future change requests, you refactor your program. Put it on your resume. It sounds good, and your future employer probably enjoys reading such buzzwords, even if it doesn’t make you a good programmer. What a good programmer would never live with, however, is that the program contains the same expression three times:

r20

che vuol dire che chi legge il programma o Racket quando lo esegue deve riprendere quei dati e rifare la stessa cosa; ci conviene definire un’altra costante, ROCKET-CENTER-TO-BOTTOM (non metto la figura, c’è di là con tutta la spiegazione). Insomma alla fine otteniamo un programma come si deve:

r21

Nota: il punto-virgola segna l’inizio di un commento, lui e il resto della linea sono ignorati da Racket ma sono utilissimi per gli umani (fidatevi!). Toh! lo dice anche HtDP, quasi con le stesse parole :grin:

Notare che sono spariti i numeri che in un programma è facile dimenticare a cosa si riferiscono e se si possono cambiare, sono conosciuti come magic numbers e sono da evitare, definendoli con un nome.

Nota perso: a differenza di CL le costanti si definiscono con define e non con defparameter; chissà le variabili?

Ancora una definizione

Real rockets don’t descend at a constant speed. Real cars don’t stop on the spot. They decelerate, which is the opposite of accelerate. What this really means is that an object first travels at a constant speed and then the driver hits the brakes or the pilot fires some engines. The effect of using the brakes or firing the engines is to change the speed slowly.

Uh! introduce l’accelerazione, l’animazione e il programma diventano più realistici, vedeteli di là.

Adesso sei un programmatore

The claim that you are a programmer may have come as a surprise to you at the end of the preceding section but it is true. You know all the mechanics that there is to know.

Sai che la programmazione consiste di calcoli aritmetici su numeri, stringhe, immagini e quant’altro il linguaggio supporta. Sai che ci sono definizioni di funzioni e costanti. Il tutto consiste nell’organizzarele correttamente. E sai che ci sono delle librerie (le teachpacks) piene di funzioni che l’help spiega cosa fanno.

You might think that you still don’t know enough to write programs that react to keystrokes, mouse clicks, and so on. As it turns out, you do. In addition to the animate function, the “universe” teachpack provide other functions that hook up your programs to the keyboard, the mouse, the clock and other moving parts in your computer. Indeed, it even supports writing programs that connect your computer with anybody else’s computer around the world. So this isn’t really a problem.

From a theoretical perspective, you are missing the ability to define functions that run forever. This may sound useless and difficult to achieve. It is neither but it is too early to introduce this idea concretely.

In short, you have seen almost all the mechanics of putting together programs. If you read up on all the functions that are available, you can write programs that play interesting computer games, run simulations, or keep track of business accounts. The question is whether this really means you are a programmer.

Stop! Think! Don’t turn the page yet.
Fermo lì! Pensaci! Non girare la pagina adesso.

No!

C’è un sacco di gente e libri che ti promettono di diventare un programmatore finito in 21 giorni o anche meno. Naturalmente non è vero, roba da Silvio. Non vogliamo essere berlüscati vero?

The rest of this book is all about these things; very little of the book’s content is about the mechanics of BSL or other HtDP languages. The book shows you how good computer programmers think about problems, and—promise!—you will even learn to see that these ideas of problem solving apply to other situations in life, e.g., the work of doctors and journalists, lawyers and engineers, or car mechanics and photographers.

Oh, and by the way, the rest of the book uses a tone that is appropriate for a serious text.

What the book is not about
Many early books on programming and even some of today’s books teach you a lot about the authors’ favorite application discipline for programming: mathematics, physics, music, accounting, and so on. To some extent that is natural, because programming is useful in those areas. Then again, it forces you to know a lot (or at least something) about those disciplines. This book really focuses on programming and problem solving and what computer science can teach you in this regard. We have made every attempt to minimize the use of knowledge from other areas; for those few occasions when we went too far, we apologize.

Sostituite il termine book con site. E, a costo di ripetermi, questi profs rockzs :mrgreen:

HtDP – prologo: come programmare – 2

programmer_joke13Continuo a leggere HtDP, proseguendo da qui.

Immagini

Before we show you how to do some “real” programming, let’s discuss one more kind of data to spice things up: images.
To insert images such as this rocket into DrRacket, use the Insert menu and select the “Insert image …” item.

Ahemmm, oggi mi sa che devo usare DrRacket.

r10

In contrast to many other programming languages, BSL understands images, and it supports an arithmetic of images just as it supports an arithmetic of numbers or strings. In short, your programs can calculate with images, and you can do so in the interactions area. [Can] create libraries that others may find helpful. Using such libraries is just like expanding your vocabularies with new words or your programming vocabulary with new primitives. We call such libraries teachpacks because they are helpful with teaching.

Si possono fare cose come

r11

(require 2htdp/image) specifies that you wish to add the “image” library. Alternatively, use the “Language” drop-down menu, choose “Add Teachpack …” and pick “image”.

In realtà da menu ottengo un nope:

r12

Si possono creare le proprie immagini:

r13

You should know about two more operations: empty-scene and place-image. The first creates a scene, a special kind of rectangle. The second places an image into such a scene:

r14

And now you’re basically ready to write programs that make rockets fly.

Input e output –non i soliti, sono termini di Racket/BSL

The programs you have written so far are pretty boring. You write down an expression or several expressions; you click RUN; you see some results. If you click RUN again, you see the exact same results.
That’s good news and bad news. It is good because programming and computing ought to be a natural generalization of using a calculator. It is bad because the purpose of programming is to deal with lots of data and to get lots of different results, with more or less the same calculations.

Segue spiegone per principianti, salto. Alla fine si arriva a (define (y x) (* x x)) che definisce la funzione y come x * x.

The define says “consider y a function”, which like an expression, computes a value. A function’s value, though, depends on the value of something called the input, which we express with (y x). Since we don’t know what this input is, we use a name to represent the input. Following the mathematical tradition, we use x here to stand in for the unknown input but pretty soon, we shall use all kinds of names.

E lo spiegone continua, chiaro, esaustivo, Matthias e colleghi sono prof come si deve :grin:
Una nota di terminologia: quando applico la funzione y a un valore, p.es. (y 1) ho che: [t]he (y 1) is called a function application in DrRacket … and in mathematics, too. Your teachers just forgot to tell you.

Allora, riassumo ma è da leggere là.

(define (FunctionName InputName) BodyExpression)

è una definizione di funzione (function definition), si riconosce perché inizia con define. È composta da due nomi e un espressione, etc. Naturalmente i parametri (parameters) (in questo caso il secondo nome) possono essere di più, come pure le espressioni componenti il corpo (body) della funzione.

(FunctionName ArgumentExpression)

è un’applicazione di funzione. Ovvio.

Functions can input more than numbers, and they can output all kinds of data, too.
Adesso a noi:

Beh, dovete seguire l’esercizio, alla fine ottenete qualcosa di simile:

r15

e con un click su Run:

r16

OK, post difficile, cioè no semplicissimo ma che dovete vederlo di là. E a me vengono in mente tante domande che spero di poter soddisfare prossimamente. In sintesi le animazioni non m’interessano più di tanto; posso fare qualcosa di serio con le immagini (pulsanti con icona, p.es.). So che siamo solo all’inizio, anzi nel prologo, Ankh-Morpork non è stata costruita in un giorno (cit.) per cui attendo fiducioso.
Intanto pausa :mrgreen:

Iscriviti

Ricevi al tuo indirizzo email tutti i nuovi post del sito.

Unisciti agli altri 88 follower