martes, 7 de enero de 2014

Curiosidades en los lenguajes de programación

Curiosidades en los lenguajes de programación.


A veces la lógica sobre la que se asienta un lenguaje de programación (cosa “estricta” –con comillas- si las hay) tiene algún extraño efecto colateral. Otras veces un mal momento (¿demasiado temprano por la mañana? ¿demasiado tarde por la noche? ¿resaca?) de aquél que debe dar una definición queda inmortalizado por las consecuencias de ésta.
Cuestión que en todo lenguaje hay ciertas curiosidades, puntos oscuros, cosas que no parecen todo lo claras, lógicas o esperables que deberían. Es el tipo de cosas que se han ido destapando en Stack Overflow bajo el título Strangest language feature con la consigna “What is, in your opinion, the most surprising, weird, strange or really "WTF" language feature you have encountered?”
Por ejemplo…
Javascript se lleva las palmas en la categoría "sutilezas tramposas":
  1. return  
  2. {  
  3.     id : 1234,  
  4.     title : 'Tony the Pony'  
  5. };  
  6.   
  7. //devuelve undefined, ya que el salto de línea luego del return implica  
  8. //(implícitamente) el final de la instrucción. Por eso esto sí funciona:  
  9.   
  10. return {  
  11.     id : 1234,  
  12.     title : 'Tony the Pony'  
  13. };  
  14.   
  15. //Y esto también (grrr....)  
  16.   
  17.   return /* 
  18. */{  
  19.     id : 1234,  
  20.     title : 'Tony the Pony'  
  21.   };  
...su tabla de verdad tiene algunas cositas impresentables:
  1. ''        ==   '0'           //false  
  2. 0         ==   ''            //true  
  3. 0         ==   '0'           //true  
  4. false     ==   'false'       //false  
  5. false     ==   '0'           //true  
  6. false     ==   undefined     //false  
  7. false     ==   null          //false  
  8. null      ==   undefined     //true  
  9. " \t\r\n" ==   0             //true  
Por otro lado, el integer cache en java es un buen ejemplo de esos extraños aunque esperables efectos colaterales:
  1. Integer foo = 1000;  
  2. Integer bar = 1000;  
  3.   
  4. foo <= bar; // true  
  5. foo >= bar; // true  
  6. foo == bar; // false  
  7.   
  8. //pero si los valores de foo y bar están entre 127 y -128 (inclusive)  
  9. //el comportamiento cambia:  
  10.   
  11. Integer foo = 42;  
  12. Integer bar = 42;  
  13.   
  14. foo <= bar; // true  
  15. foo >= bar; // true  
  16. foo == bar; // true  
Y no es la primera vez que escucho quejas (muy justificadas, según mi propio criterio) sobre el manejo de cadenas en php:
  1. //uno pensaría que  
  2. "01a4" != "001a4"  
  3. //pero la realidad es que  
  4. "01e4" == "001e4"  

No hay comentarios:

Publicar un comentario