LOGO/Parole e liste

Sequenze

modifica

In Logo ci sono due tipi di dati: parole e liste. Entrambe sono delle sequenze di elementi.

Le funzioni base che si applicano a tutte le sequenze sono:

  • first: restituisce il primo elemento,
  • bf: restituisce la sequenza privata del primo elemento,
  • last: restituisce l'ultimo elemento,
  • bl: restituisce la sequenza privata dell'ultimo elemento.

Una parola è una sequenza di caratteri. Per definire una parola si scrivono i caratteri preceduti dal doppio apice. Il seguente comando:

? make "variabile "contenuto
? print :variabile
contenuto

associa alla parola variabile la parola contenuto.

E i numeri? In Logo i numeri sono semplicemente un sottoinsieme delle parole, ma a differenza di queste, per non appesantire la sintassi, si scrivono senza le virgolette iniziali:

? make "variabile 54
? print :variabile / 6
9

Una parola può essere definita in modo ricorsivo:

parola=<parola vuota>
o
parola=<carattere> seguito da una <parola>

Una procedura che riceve una parola e stampa i suoi caratteri uno sotto l'altro:

to stampagiu :parola
if emptyp :parola [stop]
print first :parola
stampagiu bf :parola
end

? stampagiu "casa
c
a
s
a
? stampagiu 4569
4
5
6
9

Una procedura che riceve una parola e stampa le parole triangolari derivate:

to triangolare :parola
if emptyp :parola [stop]
print :parola
stampagiu bf :parola
end

? triangolare "scala
scala
cala
ala
la
a

Una lista è una sequenza di parole o di liste. Per definire una lista si usano le parentesi quadre:

? make "lista [questa è una lista]
? print :lista
questa è una lista

Per semplicità le parole all'interno di una lista non devono essere precedute dai doppi apici.

Ma una lista può essere molto più complessa dato che può contenere liste che possono contenere liste che possono...

Le funzioni first e bf funzionano anche con le liste quindi le due procedure precedenti possono essere applicate anche alle liste:

? stampagiu [sopra la panca la capra campa, sotto la panca la cara crepa.]
sopra 
la 
panca 
la 
capra 
campa, 
sotto 
la 
panca 
la 
cara 
crepa.

? triangolo [adesso io ti vedo]
adesso io ti vedo
io ti vedo
ti vedo
vedo

Visto che le due funzioni precedenti si comportano altrettanto bene sia che ricevano come argomento una parola sia che ricevano una lista, è più sensato cambiare il nome del parametro da parola in sequenza:

to stampagiu :sequenza
if emptyp :sequenza [stop]
print first :sequenza
stampagiu bf :sequenza
end

<pre>
to triangolare :sequenza
if emptyp :sequenza [stop]
print :sequenza
stampagiu bf :sequenza
end

Questo cambiamento ha effetto solo per il programmatore, per quanto riguarda l'interprete Logo, il parametro potrebbe avere qualunque nome, anche: jhgsdc.

Primitive

modifica

legenda

  • con carattere si intende una parola di lunghezza 1;
  • con oggetto, oggetto1, ... si intende indifferentemente una parola o una lista;
  • con parola, parola1, ... si intende una parola, che può essere anche un numero;
  • con lista, lista1, ... si intende una lista.
  • con numero si intende un numero naturale.

Di seguito sono elencate altre primitive che si applicano a parole e liste.

  • ascii carattere: restituisce il codice ascii di carattere
 ? print ascii "A                    
 65                                  
  • butfirst oggetto o bf oggetto: restituisce la sequenza oggetto privata del primo elemento.
? show butfirst [Sopra la panca la capra campa]
[la panca la capra campa]                         
? print butfirst "Sopra                         
opra                                            
  • butlast oggetto o bl oggetto: restituisce la sequenza oggetto privata dell'ultimo elemento.
? show butlast [sotto la panca la capra crepa] 
[sotto la panca la capra]                         
  • char numero: restituisce il carattere che ha codice ascii numero
? print char 66                                 
B                                               
  • count oggetto: restituisce il numero di elementi contenuti in oggetto
? print count [33 trentini venivano giù da Trento]
6                                                 
? print count "trentini                           
8                                                 
? print count 33                                  
2                                                 
  • emptyp oggetto: restituisce true se oggetto è vuoto
? print emptyp []                                 
true                                              
? print emptyp [tutti 33 trotterellando]          
false                                             
? print emptyp bf bf bf [tutti 33 trotterellando] 
true                                              
  • equalp oggetto1 oggetto2: restituisce true se oggetto1 e oggetto2 sono uguali
? print equalp "trotterellando [trotterellando]   
false                                             
? make "a "trotterellando                         
? print equalp :a "trotterellando                 
true                                              
  • first oggetto: restituisce il primo elemento di oggetto
? print first [Tre tigri contro tre tigri]        
Tre                                               
  • fput oggetto lista: restituisce una lista con tutti gli elementi di lista e, aggiunto come primo elemento oggetto
? make "a [Tre tigri contro tre tigri]            
? show fput 3 butfirst :a                        
[3 tigri contro tre tigri]
  • item numero oggetto: restituisce l'elemento di posizione numero in oggetto
? print item 3 :a                                 
contro                                            
  • last oggetto: restituisce l'ultimo elemento di oggetto
? print last :a                                   
tigri                                             
  • list oggetto1 oggetto2: restituisce una lista formata dai due elementi oggetto1 e oggetto2
? make "p "questa_è_una_parola                    
? make "l [questa è una lista]                    
? show list :p :l                                 
[questa_è_una_parola [questa è una lista]]        
  • (list oggetto1 oggetto2 ...): restituisce una lista formata da tutti gli elementi oggetto1, oggetto2, ...
? show (list "Rosso "di "sera "...)               
[Rosso di sera ...]                               
  • listp oggetto: restituisce true se oggetto è una lista
? print listp "lista
false
? print listp []
true
  • lput oggetto lista: restituisce una lista con tutti gli elementi di lista e, aggiunto come ultimo elemento oggetto
? show lput "spera [bel tempo si]
[bel tempo si spera]
  • memberp oggetto1 oggetto2: restituisce true se oggetto1 è un elemento di oggetto2
? print memberp "gatta [Tanto va la gatta al lardo]
true
? print memberp "gatta [Tanto va la [gatta] al lardo]
false
  • numberp oggetto: restituisce true se oggetto è un numero
? print numberp "quarantaquattro
false
? print numberp "44
true
  • sentence oggetto1 oggetto2: se oggetto1 e oggetto2 sono parole restituisce una lista che le contiene, se sono liste restituisce una lista con tutti gli elementi della prima seguiti da tutti quelli della seconda
? show sentence :p :p
[questa_è_una_parola questa_è_una_parola]
? show sentence :l :l
[questa è una lista questa è una lista]
? show sentence :p :l
[questa_è_una_parola questa è una lista]
  • (sentence oggetto1 oggetto2 ...): come la funzione precedente ma con un numero variabile di argomenti
? show (sentence :p :l :p :l)
[questa_è_una_parola questa è una lista questa_è_una_parola questa è una lista]
  • word parola1 parola2: restituisce una parola ottenuta concatenando i due argomenti
? print word "abra "cadabra
abracadabra
  • (word parola1 parola2 ...): come la funzione precedente ma con un numero variabile di argomenti
? print (word "va "lan "ga)
valanga
  • wordp oggetto: restituisce true se oggetto è una parola
? print wordp [parola]
false
  • oggetto1 = oggetto2: restituisce true se oggetto1 è uguale a oggetto2
? print "parola = [parola]
false
? print "parola = first [parola]
true

?