Uma calculadora cli que reconhece a sintaxe matemática errada?

0

Estou procurando uma maneira de fazer cálculos rápidos no terminal (usando os utilitários disponíveis no Ubuntu mínimo) e obter erros de falha precisos quando a sintaxe matemática estiver incorreta, por exemplo: cli-calculator "foo+bar" || echo invalid math syntax

Algumas das entradas seriam:

  • 1 + 1 # deve imprimir 2 e devolver um código 0

  • 5/2 # deve imprimir 2.5 e retornar um código 0

  • 1/0 #deve retornar um código diferente de 0

  • foo + bar # deve retornar um código diferente de 0

Eu tentei bc , aritmética integrada do shell, expr , awk , perl e python , mas até agora nenhum satisfez totalmente meus requisitos, então estou procurando alternativas, siga o uso casos:

  • bc , é capaz de realizar operações com números flutuantes, mas não retorna códigos de erro em entradas de sintaxe inválidas

    $ echo "1/0" | bc -l && echo all is fine || echo math syntax error
    Runtime error (func=(main), adr=3): Divide by zero
    all is fine
    $ echo "foo+bar" | bc -l && echo all is fine || echo math syntax error
    0 #should return an error
    all is fine
    
  • Aritmética integrada do shell e expr , não suportam operações com números flutuantes e retornam códigos válidos em entradas matemáticas inválidas

    $ echo $((5/2))
    2 #should return 2.5
    $ echo $((foo+bar))
    0 #should return an error
    $ expr 5 / 2
    2 #should return 2.5
    $ expr foo+bar
    foo+bar #should return an error
    
  • awk | perl , não retorne códigos de status inválidos em entradas matemáticas inválidas.

    $ awk "BEGIN {print foo+bar; exit}"
    0 #should return a non 0 number and probably output an error
    $ echo "foo+bar" | perl -ple '$_=eval'
    0 #should return a non 0 number and probably output an error
    
  • python , suporta operações aritméticas de flutuação e retorna erros de status na sintaxe matemática inválida, mas é lenta.

    $ python -c 'from __future__ import division; from math import *; print(foo+bar)' && echo all fine || echo math syntax error
    NameError: name 'foo' is not defined
    math syntax error #good!
    $ python -c 'from __future__ import division; from math import *; print(5/2)' && echo all fine || echo math syntax error
    2.5' #good!
    all fine
    

Alguma idéia?

    
por Javier López 03.11.2015 / 08:11

2 respostas

3

Que tal calc

sudo apt-get install apcalc

Exemplos

% calc 1/0  
    Error 10001

% calc foo + bar
"foo" is undefined
Error in commands

% calc 5/2
    2.5

ou qalc

% qalc 1/0
error: Division by zero.
1 / 0 = 1 / 0

% qalc foo + bar
error: "foo" is not a valid variable/function/unit.
0 + bar = 1 bar

% qalc 5/2      
5 / 2 = 2.5

bc

echo "1/0" | bc  
Runtime error (func=(main), adr=3): Divide by zero

echo "scale=1; 5/2" | bc
2.5

E isso está correto, 0 + 0 é 0

% echo "foo+bar" | bc
0

Ou gcalccmd , a versão do console de gnome-calculator da calculadora do ambiente de área de trabalho do GNOME.

Exemplos

% gcalccmd    
> 1/0
Error (null)
> foo + bar
Error 3
> 5/2
2,5

Observe que gcalccmd não tem suporte a readline, portanto, apenas os recursos de edição de linha mais básicos estão disponíveis. (Backspace funciona, mas as teclas esquerda / direita não)

    
por A.B. 03.11.2015 / 08:38
1
A

Octave é outra alternativa. É uma ferramenta gratuita muito poderosa com uma sintaxe 'como a ferramenta comercial matlab'. Se você quiser rodá-lo sem um gui, use a opção --no-gui ou o comando octave-cli .

sudo apt-get install octave octave-info

Exemplo baseado em suas expressões "válidas e inválidas":

$ octave --no-gui
GNU Octave, version 4.0.0
Copyright (C) 2015 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type 'warranty'.

Octave was configured for "i686-pc-linux-gnu".

Additional information about Octave is available at http://www.octave.org.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/get-involved.html

Read http://www.octave.org/bugs.html to learn how to submit bug reports.
For information about changes from previous versions, type 'news'.

>> 1+1 #valid
ans =  2
>> 5/2 #valid
ans =  2.5000
>> 1/0 #invalid
warning: division by zero
ans = Inf
>> foo+bar #invalid
error: 'foo' undefined near line 1 column 1
>> foo=1;bar=2  # assign values to foo and bar
bar =  2
>> foo+bar #now valid
ans =  3
>> 
    
por sudodus 08.02.2017 / 09:10