Michele Liberi software

versione 1.03, 1 settembre 2022

Michele Liberi
mail: mliberi@gmail.com
cell: 3485211456

liberix

pol, calcolo di espressioni

Il comando pol è la versione potenziata del comando expr.

L'esigenza di sviluppare pol è nata perché mi serviva un modo per generare da shell script un numero progressivo ad unicità garantita. Per ottenere questo risultato era fondamentale che il caricamento del valore corrente da file, l'incremento, ed il salvataggio, fossero un'unica operazione atomica.

Ad esempio il comando pol :c.pol = N + N 1

  1. mette un lock sul file .pol in modo che un altro tentativo parallelo di accedere allo stesso file venga messo in attesa
  2. carica il set di variabili dal file .pol
  3. incrementa di una unità il valore della variabile N
  4. salva il set di variabili sul file
  5. toglie il lock

Inoltre il comando pol fornisce alle shell script la capacità di eseguire calcoli floating point in doppia precisione.

Nell'esempio che segue definisco la funzione pol_eval che calcola un'espressione (in notazione polacca diretta) ed assegna il risultato ad una variabile della shell. Da notare il fatto che, per motivi di efficienza, la funzione pol_eval lancia il comando pol solo la prima volta, e lo lascia attivo in background.

function pol_eval # result expr { test "$pol_in" ||{ pol_in=/tmp/pol.$$.in pol_out=/tmp/pol.$$.out mkfifo $pol_in $pol_out pol :s2 :i <$pol_in >$pol_out & exec 7>$pol_in 6<$pol_out rm -f $pol_in $pol_out } typeset rc=$1; shift echo "$@" >&7 read $rc <&6 } # successione di Fibonacci x=0.00 y=1.00 while ((1)) do pol_eval z + $x $y echo $z x=$y y=$z done

La valutazione delle espressioni avviene in notazione polacca: l'operatore viene posto prima degli operandi. Ad esempio l'espressione 1+2 in notazione polacca diventa + 1 2.

Gli elementi di una espressione sono:

Esempi:

espressionerisultato
+ 3 58
- 7 16
/ 10 33.33333333333333
:s2 / 10 33.33
^ 2 525
[ 93
! 424
= A 44
* A 28
= A + A 15

Le espressioni da valutare possono essere date su linea di comando, oppure lette da un file di input, che può essere standard input.

Tra un'espressione e l'altra pol può interpretare ed eseguire dei comandi, introdotti dal carattere ':' (due punti):

Rispetto al comando standard expr, il comando pol:

Per ulteriori informazioni sulle opzioni disponibile lanciare pol -h.