-
Notifications
You must be signed in to change notification settings - Fork 53
/
Specification.txt
220 lines (172 loc) · 5.61 KB
/
Specification.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
-------------------------------------------------------------------------
NOTE: this document was left here only for historical purposes,
refer to REAMDE.md for the current spec.
NOTA: questo documento è obsoleto ed è qui solo per memoria storica, in
quanto rappresenta la prima specifica proposta per il linguaggio.
README.md contiene l'attuale versione.
-------------------------------------------------------------------------
Proposte per la definizione di un linguaggio di programmazione esoterico "Monicelli"
Il "main" del programma inizia in corrispondenza di:
Lei ha clacsonato
che da il via alla supercazzola (cioè al programma)
Il programma termina con l'istruzione
vaffanzum
che equivale a
return
Può essere usato anche per terminare le funzioni restituendo un valore di ritorno:
vaffanzum antani
*** Tipi di dato ***
* Necchi -> int
* Mascetti -> char
* Perozzi -> float
* Melandri -> bool
* Sassaroli -> double
I puntatori si dichiarano anteponendo "conte" al nome della variabile
quindi
conte Mascetti
è
char*
*** Dichiarazione variabili ***
Si usa la sintassi:
voglio il <nome>, <tipo>[, come fosse <espressione>]
Esempio:
voglio il cappellano, Necchi
dichiara la variabile "cappellano" di tipo int
e:
voglio lo scrittoio, conte Mascetti
dichiara la variabile "scrittoio" di tipo "char*"
Eventualmente si può anche inizializzare immediatamente la variabile usando l'operatore di assegnamento (spiegato meglio nel seguito)
voglio il cappellano, Necchi, come fosse 4
Ogni volta che si deve utilizzare una variabile, è possibile precederla con un articolo.
La concordanza dell'articolo non è semanticamente verificata, ma ci si assicura sintatticamente
che l'articolo sia effettivamente un articolo.
*** Operatori ***
definiti a parole, per meglio integrarsi graficamente nella supercazzola.
Aritmetici
* più
* meno
* per
* diviso
Di shift:
con scappellamento a <direzione> per X
dove X e il numero di posizioni dello shift e direzione può essere
* sinistra
* destra
Esempio:
antani con scappellamento a destra per 2
equivale a
antani >> 2
Di confronto
* minore di
* maggiore di
* minore o uguale a
* maggiore o uguale a
Di assegnamento
è "come fosse".
Perciò:
vicesindaco come fosse antani per due a destra
equivale a
vicesindaco = antani >> 2
Operatore di output (postfisso):
a posterdati
Esempio:
antani a posterdati
Stampa la variabile "antani" a video
Operatore di input:
mi porga <variabile>
Esempio
mi porga il cappellano
richiede all'utente di inserire il valore della variabile "cappellano" da standard input
*** Cicli ***
Stuzzica-Brematura
Stuzzica il palato eseguendo almeno una volta il corpo del ciclo, ed eventualmente lo brematura altre volte.
Sintassi:
stuzzica
<corpo del ciclo>
e brematura anche, se <condizione>
*** Costrutto di selezione (switch+if) ***
"Che cos'è"
È l'unico costrutto di selezione, facente funzione sia di if, sia di switch
Sintassi:
che cos'è <articolo> <variabileDiControllo>?
<ipotesi>:
<codice>
<ipotesi>:
<codice>
[tarapia tapioco: #Else/default, opzionale
<codice>
]
e velocità di esecuzione.
<ipotesi> può essere:
* <espressione>:
il codice viene eseguito se il risultato dell'espressione è uguale alla variabileDiControllo
* <op_confronto> <espressione>:
il codice viene eseguito se è vero che: <variabileDiControllo> <op_confronto> <espressione>
Esempio:
che cos'è il genio?
fantasia:
antani come se fosse vicesindaco per due
intuizione:
mi porga il cappellano
zingarata come fosse cappellano più uno
zingarata a posterdati
maggiore di mobiletto:
genio a posterdati
tarapia tapioco:
mi porga il cappello
e velocita di esecuzione
Che corrisponde a (pseudocodice):
switch(genio) {
case genio=fantasia:
antani = vicesindaco*2
case genio=intuizione:
input cappellano
zingarata = cappellano+1
print zingarata
case genio > mobiletto:
print genio
default:
input cappello
}
*** Funzioni ***
Una funzione può essere definita con la sintassi:
blinda la supercazzola <nome> [con <parametro>[, <parametro>]].
<codice>
O scherziamo?
che definisce la funzione <nome> con i parametri in ingresso specificati
Le funzioni sono invocate con la sintassi:
brematurata la supercazzola <nome> con [<parametro>[, <parametro>]]
*** Eccezioni ***
Esiste un'unica eccezione possibile (di fatto, corrispondente a segnalare un errore non gestibile e
causa la terminazione del programma).
L'eccezione può essere lanciata tramite la frase:
avvertite don ulrico
Esempio:
che cos'è il thermos?
un oggetto:
barilotto come se fosse antani per due
> 0:
thermos come se fosse thermos meno 1
tarapia tapioco:
avvertite don ulrico
e velocità di esecuzione
Che corrisponde a (pseudocodice):
switch(thermos) {
case thermos==oggetto:
barilotto = antani * 2
case thermos>0:
thermos = thermos-1
default:
raise exception
}
*** Commenti ***
Ogni riga iniziata da "bituma" è un commento e viene completamente ignorata dal compilatore
Esempio:
bituma il codice che esegue la FFT
*** Asserzioni ***
ho visto la <condizione>!
verifica che la condizione risulti vera, altrimenti avverte don Ulrico (ossia, lancia un'eccezione)
Esempio:
ho visto il cappellano come fosse la lavagna!
equivale a
assert(cappellano==lavagna)