eval

Un post piccolo-piccolo (sono in ferie).
Anche perché devo sempre finire una cosa per giovedì 16 (ma credo che se mi faccio vedere quel giorno si parla solo delle ferie finite, diciamo che posso tirarla lunga fino al 20, lunedì).

Ah! poi –chi mi segue su Twitter magari ne sa già qualcosina– prossimamente grosse novità, con Bit3Lux & Lightuono.


Ma per intanto, anche durante le ferie, con questo caldo c’è qualcuno che –pensa te!– pensa al ‘puter!

E ti fa delle domande come questa, di ieri: devo riportare in relazione una serie di calcoli, completi di espressione matematica e risultato, come questo, in Excel:


È possibile ma un po’ macchinoso, devi dirgli di visualizzare ora la formula (come “testo” se ricordo bene, non ho preso appunti) che come numero. E non puoi fare solo il copia-incolla (non ricordo perché).

Si può fare qualcosa, uno scriptino?

Cerrrto! Proviamo interattivamente con Python


ecco, in caso di errore ti dice cos’è che non va. E il tutto può essere montato in uno script, eccone un assaggino

import sys

formula = '3 * 12 + 6'
try:
	r = eval(formula)
	print r
except:
	print sys.exc_info()[1]

 

import sys

formula = '3 * i2 + 6'
try:
	r = eval(formula)
	print r
except:
	print sys.exc_info()[1]

Questo è solo un abbozzo, da completare eseguendo un ciclo, scrivendo su un file e il tutto con una graziosa interfaccia grafica.

Però, adesso che mi viene in mente, c’è un altro linguaggio di scripting, simpatico, piccolo, ultra-performante, ecco

#!/usr/bin/newlisp

(set-locale "C") ;; ma anche no
(set 'formula "(+ (* 3 12) 6)")
(set 'r (eval-string formula))
(println formula " = " r)
(exit)

 

#!/usr/bin/newlisp

(set-locale "C") ;; ma anche no
(set 'formula "(+ (* 3 i2) 6)")
(set 'r (eval-string formula))
(println formula " = " r)
(exit)

Togliendo l’istruzione set-locale i numeri vengono con la virgola al posto del punto, mica siamo ‘mericani! E notare che la gestione dell’errore è automatica.

Domanda: Ma mica possiamo scrivere le formule in quel modo lì, che non si possono neanche leggere!
Risposta: Mi aspettavo l’obiezione, esiste il modulo infix, ammira:

#!/usr/bin/newlisp

(set-locale "C") ;; ma anche no
(module "infix.lsp")
(set 'formula '"3 * 12 + 6")
(set 'r (eval(INFIX:xlate formula)))
(println formula " = " r)
(exit)

 

#!/usr/bin/newlisp

(set-locale "C") ;; ma anche no
(module "infix.lsp")
(set 'formula '"3 * i2 + 6")
(set 'r (eval(INFIX:xlate formula)))
(println formula " = " r)
(exit)

Osservazione finale: finisci sempre lì, è una mania, ne uscirai?

Uh! a momenti dimenticavo: le formule possono contenere variabili, verifica lasciata come esercizio 😉

dai, non esageriamo!

Posta un commento o usa questo indirizzo per il trackback.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: