LOGO/Parole e liste
Sequenze
[modifica | modifica sorgente]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.
Parole
[modifica | modifica sorgente]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
Liste
[modifica | modifica sorgente]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 | modifica sorgente]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 dicarattere
? print ascii "A 65
butfirst oggetto
obf oggetto
: restituisce la sequenzaoggetto
privata del primo elemento.
? show butfirst [Sopra la panca la capra campa] [la panca la capra campa] ? print butfirst "Sopra opra
butlast oggetto
obl oggetto
: restituisce la sequenzaoggetto
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 asciinumero
? print char 66 B
count oggetto
: restituisce il numero di elementi contenuti inoggetto
? print count [33 trentini venivano giù da Trento] 6 ? print count "trentini 8 ? print count 33 2
emptyp oggetto
: restituiscetrue
seoggetto
è vuoto
? print emptyp [] true ? print emptyp [tutti 33 trotterellando] false ? print emptyp bf bf bf [tutti 33 trotterellando] true
equalp oggetto1 oggetto2
: restituiscetrue
seoggetto1
eoggetto2
sono uguali
? print equalp "trotterellando [trotterellando] false ? make "a "trotterellando ? print equalp :a "trotterellando true
first oggetto
: restituisce il primo elemento dioggetto
? print first [Tre tigri contro tre tigri] Tre
fput oggetto lista
: restituisce una lista con tutti gli elementi dilista
e, aggiunto come primo elementooggetto
? make "a [Tre tigri contro tre tigri] ? show fput 3 butfirst :a [3 tigri contro tre tigri]
item numero oggetto
: restituisce l'elemento di posizionenumero
inoggetto
? print item 3 :a contro
last oggetto
: restituisce l'ultimo elemento dioggetto
? print last :a tigri
list oggetto1 oggetto2
: restituisce una lista formata dai due elementioggetto1
eoggetto2
? 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 elementioggetto1, oggetto2, ...
? show (list "Rosso "di "sera "...) [Rosso di sera ...]
listp oggetto
: restituiscetrue
seoggetto
è una lista
? print listp "lista false ? print listp [] true
lput oggetto lista
: restituisce una lista con tutti gli elementi dilista
e, aggiunto come ultimo elementooggetto
? show lput "spera [bel tempo si] [bel tempo si spera]
memberp oggetto1 oggetto2
: restituiscetrue
seoggetto1
è un elemento dioggetto2
? print memberp "gatta [Tanto va la gatta al lardo] true ? print memberp "gatta [Tanto va la [gatta] al lardo] false
numberp oggetto
: restituiscetrue
seoggetto
è un numero
? print numberp "quarantaquattro false ? print numberp "44 true
sentence oggetto1 oggetto2
: seoggetto1
eoggetto2
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
: restituiscetrue
seoggetto
è una parola
? print wordp [parola] false
oggetto1 = oggetto2
: restituiscetrue
seoggetto1
è uguale aoggetto2
? print "parola = [parola] false ? print "parola = first [parola] true
?