Recientemente tuve la necesidad de reescribir una función de JavaScript en javascript de forma dinámica. La facilidad con la que lo hice, y lo divertido que era, me sorprendió.¿En qué idiomas puede reescribir dinámicamente funciones sobre la marcha?
Por aquí tengo algo de HTML:
<div id="excelExport1234"
onclick="if(somestuff) location.href='http://server/excelExport.aspx?id=56789&something=else'; else alert('not important');"
>Click here to export to excel</div>
y yo no podía cambiar el código HTML como salida, pero yo tenía que añadir un parámetro adicional para ese enlace. Empecé a pensar en ello, y me di cuenta de que podía hacer esto:
excelExport = $('excelExport1234');
if (needParam)
eval('excelExport.onclick = ' + excelExport.onclick.toString().replace("excelReport.aspx?id", "excelReport.aspx?extraParam=true&id") + ';');
else
eval('excelExport.onclick = ' + excelExport.onclick.toString().replace("extraParam=true&", "") + ';');
¡Y funcionó como un campeón! excelExport.onclick devuelve un objeto de función que convierto en una cadena, y realiza una manipulación de cadena. Como ahora está en la forma de "función() {...}", simplemente retrocedo y lo asigno al evento onclick del objeto dom. Es un poco feo tener que usar eval, pero AFAIK no es un constructor de funciones de JavaScript que pueda tomar una cadena de código y convertirlo en un objeto muy bien.
De todos modos, mi punto no es que yo soy muy inteligente (no lo soy), mi punto es que esto es genial. Y sé que javascript no es el único lenguaje que puede hacer esto. He oído que lisp ha tenido macros durante años para este propósito exacto. Excepto por las macros realmente grok, necesitas asimilar realmente el ceceo, y no lo entiendo, simplemente lo "entiendo".
Así que mi pregunta es: ¿En qué otros idiomas puede (fácilmente) reescribir dinámicamente las funciones, y puede mostrarme un ejemplo simple? ¡Quiero ver dónde más puedes hacer esto y cómo se hace!
(también, no tengo idea de qué etiquetar esto como, por lo que tomó conjeturas al azar)
De esa manera yace la locura. – skaffman
¿Quizás Wiki de la comunidad? – ChristopheD
Nunca dije que fuera lo más elegante, pero es genial. Es como la mayoría de los hacks de twiddling: peligrosos porque pueden confiar en implementaciones de compiladores y demás, pero aún son inteligentes e interesantes. –