Tag Archives: mming language

Numeri in lettere in Falcon

Di nuovo?

Certo perché per me tradurre in lettere un numero è ormai diventato il mio personale “Hello World!”. L’ho applicato in articoli sul blog personale nei linguaggi Go, Python, e Java e Lua. Questa è la volta di Falcon, un linguaggio di scripting molto interessante.
L’ho scoperto per caso quando, lavorando alla guida tematica alla riga di comando, ho voluto visitare la pagina di wikipedia sui linguaggi di scripting. Nell’elenco compariva anche la misteriosa voce ‘Falcon’…

Il logo di Falcon

Il logo di Falcon

L’Autore principale è l’italiano Giancarlo Niccolai che ha dedicato il nome della sua creatura informatica proprio a Giovanni Falcone, un riconoscimento che gli avrebbe senz’altro fatto piacere…

Ecco il codice della funzione ricorsiva che trasforma un numero nella sua rappresentazione in lettere. La prima cosa che potete notare è che possiamo utilizzare la funzione num2text() prima che sia definita nel listato stampandone l’output a video con il supercompatto operatore > che concatena tutti gli argomenti che lo seguono.
Nel listato si possono trovare cose interessanti appunto, come la disponibilità dell’operatore ternario usato alla riga 11, e del costrutto switch che da solo costituisce il corpo della funzione ricorsiva.
Il linguaggio nasce per l’utilizzo in ambiente reale, è quindi compatto chiaro e semplice e lo si può vedere anche dalla forma del condizionale quando l’istruzione da eseguire è una sola (vedi alle righe 30 e 37).

/*
   script di traduzione di numeri in lettere
*/

> "15236 => ", num2text(15236)
> "348 => "  , num2text(  348)
> "897 => "  , num2text(  897)

// wrapper function
function num2text(v)
    return (v == 0) ? "zero": numToText(v)
end

// ricursive function
function numToText(n)
    switch n
		case 0
			return ""
		case 1 to 19
			return ["uno", "due", "tre", "quattro", "cinque",
					"sei", "sette", "otto", "nove", "dieci",
					"undici", "dodici", "tredici",
					"quattordici", "quindici", "sedici",
					"diciasette", "diciotto", "diciannove"][n-1]
		case 20 to 99
			letter = ["venti", "trenta", "quaranta",
					  "cinquanta", "sessanta",
                      "settanta", "ottanta", "novanta"][floor(n/10)-2]
			t = n % 10
			if t == 1 or t == 8: letter = letter[0:-1]
			return letter + numToText(n % 10)
		case 100 to 199
			return "cento" + numToText(n % 100)
		case 200 to 999
			m = floor(n % 100)
			letter = "cent"
			if m != 8: letter = letter + "o"
			return numToText(floor(n/100)) +
               letter +
               numToText(n % 100)
        case 1000 to 1999
            return "mille" + numToText(n% 1000)
        case 2000 to 999999
            return numToText(floor(n/1000)) +
                   "mila" +
                   numToText(n % 1000)
        case 1000000 to 1999999
	        return "unmilione" + numToText(n % 1000000)
        case 2000000 to 999999999
            return numToText(floor(n/1000000)) +
                   "milioni" +
                   numToText(n % 1000000)
        case 1000000000 to 1999999999
            return "unmiliardo" + numToText(n % 1000000000)
        default
			return numToText(floor(n/1000000000)) +
                    "miliardi" +
                    numToText(n % 1000000000)
	end
end

Un buon primo contatto

Sono stato attirato da Falcon per un paio di motivi: la programmazione ad oggetti tabellare e la disponibilità dei template, ma ci sono tante altre cose interessanti, non ultimo la compilazione del codice in file binari per la macchina virtuale, e tutte le caratteristiche che ancora non conosco 🙂

Alla prossima e…volate alto.
R.

Annunci