EJERCICIOS: 6.1- En la sección 6.1.1 vimos que la mayoría de los operadores aritméticos binarios son asociativos por la izquierda (left-to-right) en la mayoría de los lenguajes de programación. Al mismo tiempo, vimos en la sección 6.1.3 que la mayoría de los compiladores son libres de evaluar los operandos de un operador binario en cualquier orden. Son estas sentencias contradictorias?? Porqué?? A mi parecer estas sentencias son contradictorias, ya que si en un lenguaje existe la asociatividad por la izquierda (resuelve de izquierda a derecha en una expresión aritmética los operadores de igual precedencia), no me parece coherente que el compilador pueda evaluar libremente la expresión en el orden que mejor le parezca. Por lo que recomiendo al programador hacer uso adecuado de los paréntesis a la hora de programar, ya que la mayoría de los compiladores no violan el ordenamiento impuesto por los parentesis en una expresión. 6.2 - Trasladar la siguiente expresión a notación postfija y a notación prefija: [- b + sqrt (4*a*c)]/(2*a) Se necesita un simbolo especial para la negación unaria? Notación Prefija: (/ (+ (- 0 b) (sqrt (* (* a c) 4))) (* 2 a)) Notación Postfija: (((0 b -) ((4 (a c *) *) sqrt) +) (2 a *) /) Particularmente, no se necesitó un simbolo especial para la negación unaria (aunque podría ser necesario en los lenguajes que poseen este tipo de notaciones). Se usó el simbolo de negación binaria trasladando la expresión - b, en 0 - b = - b. 6.3 - En Lisp, la mayoría de los operadores aritmeticos estan definidos para tomar dos o más argumentos. De esta forma (* 2 3 4 5) da como resultado 120, y (- 16 9 4) da como resultado 3. Muestre que los parentesis son necesarios para quitar la ambiguedad en las expresiones aritmeticas de Lisp (en otras palabras, dar un ejemplo de una expresión cuyo significado no es claro cuando los parentesis son removidos). En la sección 6.1.1 vimos que la precedencia y la asociatividad no influyen en la notación prefija ni en postfija. Exprese con otras palabras este hecho para hacer explícita esta suposición. Expresión: a + b + c - d Expresión en Lisp: (- (+ a b c) d) Expresión sin paréntesis: - + a b c d = ?? Completamente ambigua Expresión escrita correctamente en Lisp: (- (+ (+ a b) c) d) Expresión correcta sin paréntesis: - + + a b c d = a + b + c – d Las expresiones escritas tanto en notación prefija como en postfija no utilizan ni las reglas de precedencia ni las reglas de asociatividad ya que: 1) Precedencia: Ejemplo: a+ b * c El operador de multiplicación (*) tiene mayor precedencia en todos los lenguajes de programación que el operador de suma (+) por lo tanto la sub-expresión b*c en un lenguaje con notación infija se resuelve primero; mientras que en un lenguaje con notación prefija o postfija no existe la precedencia ya que los paréntesis aclaran de que forma se quiere evaluar la expresión (+ a (* b c)) = a + (b*c) ó (* (+ a b) c) = (a+b) * c 2) Asociatividad: Ejemplo: a + b – c En la mayoría de los lenguajes de programación con notación infija los operadores (+) y (-) tienen igual precedencia, por lo que la evaluación de la expresión va a depender si se resuelve por la derecha o por la izquierda. En cambio en lenguajes con notación prefija o postfija la asociatividad por la derecha o por la izquierda tambien viene dada por como se coloquen los paréntesis en la expresión (- (+ a b) c) Asociativa por la izquierda (+ a (- b c)) Asociativa por la derecha 6.6 - Lenguajes que usan el modelo de variables por referencia támbien tienden a emplear recolección de basura automatica. Es este hecho más que una coincidencia? Explique El hecho de que un lenguaje use el modelo de variables por referencia implica la utilización de una mayor cantidad de apuntadores que se crean a cada momento con la creación de un objeto, por lo que al programador se le hace muy engorroso estar pendiente de todas las posibles referencias colgadas que se pueden ir creando a lo largo del programa. Por lo que los diseñadores de los lenguajes bajo el modelo de variables por referencia decidieron implementar la recolección de basura automática, que aunque es más dificil de implementar es un alivio para los programadores ya que no tienen que estar tan pendientes de el comportamiento de los apuntadores, por lo que no parece ser una coincidencia.