Menu Chiudi

Blockly: istruzioni per l’uso 2

Librerie di funzioni

Secondo articolo dedicato al generatore di codice Blockly, la serie vuole rendere disponibile quanto appreso utilizzando questo strumento nel corso delle attività del progetto. Fa seguito a Blockly: istruzioni per l’uso 1.

Affrontiamo un piccolo problema che si presenta quando si crea una libreria di funzioni (non di blocchi) aggiunta ai blocchi predefiniti. Per esempio la libreria dedicata all’approssimazione di numeri trascendenti presente su questo stesso blog.

Il problema a cui facciamo riferimento è questo: se si trascina sul piano di lavoro una funzione di una libreria che fa uso a sua volta di un’altra funzione della stessa libreria, sul tavolo di lavoro appare una funzione fasulla, che non contiene blocchi, con lo stesso nome di quella che serve. In altre parole, non viene posta sul tavolo di lavoro la funzione giusta ma ne viene creata una vuota appositamente. Ovviamente la funzione principale non funziona più correttamente.

Le librerie

Blockly permette di modificare il menu di blocchi disponibili nella pagina in modo abbastanza semplice (ma non così semplice da essere alla portate di un neofita). in questo modo, senza definire nuovi blocchi appositamente progettati, si possono rendere disponibili funzioni e procedure già pronte. Un buon esempio di questo meccanismo si può trovare nella pagina dedicata alla libreria per i numeri trascendenti che si trova qui, la libreria è stata aggiunta ai blocchi predefiniti (come mostrato nella figura che segue).

La libreria Trascendenti
Il menu di blocchi è stato modificato aggiungendo la voce Number Theory che contiene tre insiemi di procedure/funzioni: Arithmetic derivative, Trascendental number e Utilities. Il secondo insieme è stato selezionato mostrando il contenuto: una serie di funzioni (per comodità le funzioni sono mostrate compattate, collassando i blocchi che le compongono).

Ogni funzione che si trova in uno degli insiemi citati si può trascinare sul tavolo di lavoro e appare completa una volta esplosi i blocchi.

La funzione PrimoSuccessivo esplosa sul tavolo di lavoro
In questa figura si vede la funzione PrimoSuccessivo: la funzione è stata presa dall’insieme Utilities, trascinata sul piano di lavoro ed esplosa. Ora è pronta per essere usata.

Funzioni annidate

Come anticipato, l’annidamento delle funzioni non funzione molto bene. Nella figura che segue è mostrato un esempio (che fa riferimento ancora alla libreria Trascendenti). Per comprendere appieno quello che succede, è bene sapere che la funzione ScomporreInFattori richiama, al suo interno, la funzione PrimoSuccessivo.

Un esempio di malfunzionamento quando si trascina sul piano di lavoro la funzione principale
Abbiamo trascinato sul piano di lavoro la funzione ScomporreInFattori, Blockly ha analizzato questa procedura e si è accorto che richiama un’altra funzione: PrimoSuccessivo ma invece di aggiungere la funzione corretta (che appartiene anch’essa alla libreria e che è disponibile insieme alle altre) ha creato una funzione vuota con lo stesso nome e gli stessi parametri.

A questo punto, per qualche motivo, non si riesce più a trascinare sul piano di lavoro la funzione PrimoSuccessivo corretta, nemmeno eliminando quella fasulla!

Come rimediare

Allo stato attuale, c’è un solo modo per rimediare a questo errore: trascinare sul piano di lavoro prima le funzioni di livello più basso, quelle richiamate all’interno di altre procedure, e poi le procedure principali procedendo dal basso verso l’alto (bottom-up).

Quindi è bene documentare in modo corretto le proprie librerie indicando in particolare per ogni funzione quali sono le funzioni richiamate come fatto, per esempio, per la libreria Trascendenti.

Un esempio di come procedere per trascinare sul piano di lavoro una funzione che ne richiama altre
Qui ci sono le stesse funzioni viste nell’esempio precedente, questa volta però la funzione PrimoSuccessivo è stata trascinata sul piano di lavoro prima della funzione ScomporreInFattori (che la richiama). In questo modo tutto funziona correttamente!

Articoli correlati