Quiza si el problema lo planteas de otra manera, en vez de que python tenga que intepretar la expresión, creando un nuevo lenguaje, a ver si me explico, que a python le llegue la r y sea el que sepa que lo que se quiere es una raiz cuadrada. Algo parecido a lo que se planteo en este concurso de programación: https://contest.tuenti.net/Questions?id=10
Yo lo solucione así: https://github.com/jjgomera/tuenti-challenge-2/blob/master/10_Coding_m00re_and_m00re.py Como ves los nombres son ridiculos, pero por lo demas si entiendes lo que hace quiza sea así como quieres que python haga los cálculos, sin tener que acudir a eval. Además podrías permitir al usuario que configurara a su gusto las operaciones, si r para raiz cuadrada no le gusta puedes hacer dialogos para configurar los "accesos" para cada operación El 24 de enero de 2013 16:32, manuel <manuelcorte...@gmail.com> escribió: > Hola Chema, muchas gracias por tu respuesta. > > Al respecto de la ONCE, conozco bien lo que desarrollan, y lo que funciona > bien, es muy caro y al menos no llega a México si no es por una de sus > filiales, que encima aumentan más lo que cuesta. Tienen un editor > matemático, llamado Lambda, si no me equivoco, que te corre por 30 días y > todo; es 100% cerrado, y lo peor de todo es que al igual que pasa con > muchos lectores de pantalla, magnificadores, síntesis de voz, > reconocimiento de habla, etc, es que como son sectores de mercado muy > específico, la demanda es menor y el precio más alto. Claro, no hay nada en > contra de esto, pero no puedes modificar nada de lo que ellos te den, y si > por x o y razón vemos algo que no se contempla, para lo cual se usan estas > TI, tendré menos posibilidades de ponerme a la par rápidamente. > > Pero es muy cierto que no tengo mucha idea de lo que mencionas para hacer > la calculadora con cambios de estado, con lo que creo que continuaré > pasando código por eval en forma de cadena, y restringiendo a este para que > ejecute la menor cantidad de código no matemático posible. > > Lo que hago ahora es algo sencillo, pero no sé si esté del todo bien. El > programa toma una cadena, por ejemplo "R25" que es la representación de la > raíz de 25 (tuve problemas con el símbolo de raíz, creo que era debido a la > codificación); luego, en una clase se define un diccionario que tiene como > clave cada uno de los signos que llaman a una función que se pueden ver en > la calculadora, en este caso la "R", y como valor la función Python a la > que pertenecen, en este ejemplo, como cuando ejecuto eval() ya tengo > importado todo math, sería "sqrt". > > Ahora bien, solo es cuestión de reemplazar y eso lo hace una función, que > busca en una cadena si existe la clave del diccionario, y si existe, lo > reemplaza con su valor, y le suma un paréntesis izquierdo, de este modo, la > parte de "R25" quedaría como "sqrt(25". Siempre se le suma un paréntesis > derecho a la cadena en la última función que se ejecuta antes que se mande > a eval, ya que si se deja así no funcionará. Ahora, al terminar esta > expresión, Python recibe "sqrt(25)", y puede reconocerlo. > > Un problema que se me planteó después, es ¿qué sucedería si alguien hace > algo como "R25+R9"? El código que recibiría Python sería algo como > "sqrt(25+sqrt(9)"; por lo que además de lo anterior, hice un procedimiento > para que viera si hay signos, y si los hay, colocara un paréntesis > izquierdo y un derecho antes y después del signo, para que la suma anterior > se pudiera ver como "sqrt(25)+(sqrt(9))". > > Aún tengo mis dudas de que esto sea algo útil, ya que los paréntesis > aunque dan el resultado esperado, creo que no es la mejor idea, pero más o > menos esto es lo que actualmente se hace, y mi razón de escribir a la > lista. Si esto está bien, solo falta usar scipy para darme funciones de > cálculo estadístico, pero lo más seguro es que haya formas más inteligentes > de hacer esto. > > Justamente para esto preguntaba acerca de la sintaxis, porque supongo que > una vez terminado, sería más sencillo hacer que el parser se adapte a la > entrada de texto, que intentar moldear la cadena para que Python la > reconozca, pero no tengo mucha luz al respecto. Gracias, y saludos. > El 24/01/13 17:16, Chema Cortes escribió: > > El día 23 de enero de 2013 18:34, manuel <manuelcorte...@gmail.com> >> escribió: >> >> Otra de las cosas que quisiera preguntar, es si se podría conseguir un >>> resultado de un porcentaje, pero escrito de la siguiente forma: 25+50%. >>> >>> En GCalctool, esto se hace, pero no sé leer el código; no entiendo de muy >>> buena forma cómo lo hacen; se asume que el 50% debe ser del número 25, >>> pero >>> cuando haces 25% se obtiene un 0.25, donde se asume no sé qué, se >>> multiplica >>> 25*1/100, y se obtiene el resultado. >>> >> Hay un modo sencillo de hacer la calculadora que es dar los resultados >> parciales a medida que se van aplicando los operadores. Por ejemplo, >> cuando sumas números, cada vez que se pulsa la tecla + se obtiene cada >> resultado parcial de la suma. >> >> Tal como lo planteas, tu idea es algo más complicada. Lo simple sería >> escribir la operación como si fuera una expresión python y dejar que >> la evalúe el intérprete. Si lo quieres hacer de otro modo, tendrás que >> empezar por distinguir qué operadores son totalizadores (cálculos >> parciales y totales) y en qué posición actúan (prefix/infix/sufix). >> Tal como creo que intuyes, no es nada fácil y necesitarás conocer algo >> de "teoría de máquinas de estados finitos" para entenderlo, algo que >> se sale bastante de un proyecto de final de curso. >> >> No tengo una recomendación clara que te pueda ayudar. Si sientes >> curiosidad, tal vez podría buscarte algo de código para hacer una >> calculadora. >> >> >> Sobre lo que preguntas del tanto por ciento, se suelen representan los >> números reales del 0 al 1 como factores multiplicativos, para lo que >> se muestran multiplicados por 100 o por 1000, añadiendo el sufijo % ó >> ‰ (unicode U+2030) respectivamente. Así, por ejemplo, el 50% >> representa al factor 0.5, más conocido por 1/2 >> >> En el caso de 25+50% se trataría de una operación de >> descuentos/incrementos, donde a 25 le sumas un 50% (de 25). El porqué >> el operador % funciona ahora así en lugar de limitarse a convertir 50% >> en 0.5 se debe a que la calculadora ha cambiado de estado al iniciarse >> la suma. En una suma, el 50% se toma como operación de incremento en >> lugar de factor multiplicativo. Es un ejemplo de funcionamiento de >> máquina de estados finitos. >> >> >> Por otra parte, no sé si conoces la Fundación ONCE española. Se dedica >> a adaptar dispositivos y aplicaciones a usuarios con deficiencia >> visual o motora (tiflotecnología) a través de su centro CIDAT >> (http://cidat.once.es). Mira en su FTP. >> >> Así mismo, existe una calculadora llamada ATCalc que se adapta a tus >> necesidades. Es programable (en pascal), lo que te puede dar ideas >> para tu calculadora: >> >> http://atcalc.sourceforge.net/**indexESP.htm<http://atcalc.sourceforge.net/indexESP.htm> >> >> >> >> >> > > > ______________________________**_________________ > Python-es mailing list > Python-es@python.org > http://mail.python.org/**mailman/listinfo/python-es<http://mail.python.org/mailman/listinfo/python-es> > FAQ: http://python-es-faq.wikidot.**com/<http://python-es-faq.wikidot.com/> >
_______________________________________________ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/