Posteriormente a consultar expertos en la materia, programadores de diversas ramas y profesores hemos dado con la solución a la pregunta y la dejamos plasmada en esta publicación.
Solución:
no puedes Las funciones se tratan como valores opacos: solo se comparan por identidad, nada más. Esto es por diseño.
Pero ¿por qué? ¿No podrían los lenguajes implementar formas significativas de comparar funciones que a veces podrían ser útiles? Bueno, no realmente, pero a veces es difícil ver por qué sin elaboración. Consideremos su ejemplo de su pregunta: estas dos funciones parecer equivalente:
(define ctx0 (lambda (v) `(k ,v)))
(define ctx1 (lambda (v) `(k ,v)))
Y de hecho, lo son. Pero, ¿qué se lograría comparando estas funciones para la igualdad? Después de todo, podríamos implementar fácilmente otra función:
(define ctx2 (lambda (w) `(k ,w)))
Esta función es, a todos los efectos, idéntico a los dos anteriores, ¡pero fallaría una verificación de igualdad ingenua!
Para decidir si dos valores son o no equivalentes, debemos definir algún algoritmo que defina la igualdad. Dados los ejemplos que he proporcionado hasta ahora, dicho algoritmo parece obvio: dos funciones deben considerarse iguales si (y solo si) son equivalentes en α. Con esto en la mano, ¡ahora podemos verificar significativamente si dos funciones son iguales!
…¿Correcto?
(define ctx3 (lambda (v) (list 'k v)))
UH oh. Esta función hace exactamente lo mismo, pero no se implementa exactamente de la misma manera, por lo que falla nuestra verificación de igualdad. Seguramente, sin embargo, podemos arreglar esto. Cuasicotización y uso de la list
constructor son prácticamente iguales, por lo que podemos definirlos como equivalentes en la mayoría de las circunstancias.
(define ctx4 (lambda (v) (reverse (list v 'k))))
¡Gah! Eso también es equivalente operativamente, pero aún falla nuestro algoritmo de equivalencia. ¿Cómo podemos hacer que esto funcione?
Resulta que no podemos, de verdad. Las funciones son unidades de abstracción; por su naturaleza, somos no se supone que necesite saber cómo se implementan, sólo lo que hacen. Esto significa que la igualdad de funciones solo puede definirse correctamente en términos de equivalencia operativa; es decir, la implementación no importa, solo importa el comportamiento.
Este es un problema indecidible en cualquier lenguaje no trivial. Es imposible determinar si dos funciones son operativamente equivalentes porque, si pudiéramos, podríamos resolver el problema de la detención.
En teoría, los lenguajes de programación podrían proporcionar un algoritmo de mejor esfuerzo para determinar la equivalencia de la función, tal vez utilizando la equivalencia α o algún otro tipo de métrica. Desafortunadamente, esto realmente no sería útil: depender de la implementación de una función en lugar de su comportamiento para determinar la semántica de un programa infringe una ley fundamental de abstracción funcional y, como tal, cualquier programa que dependiera de dicho sistema sería un antipatrón.
La igualdad de funciones es muy tentador problema para querer resolver cuando los casos simples parecen tan fáciles, pero la mayoría de los lenguajes adoptan el enfoque correcto y ni siquiera lo intentan. Eso no quiere decir que no sea una idea útil: si fuera posible, ¡sería increíblemente útil! Pero como no lo es, tendrás que usar una herramienta diferente para el trabajo.
Si te apasiona este mundo, tienes la opción de dejar una reseña acerca de qué le añadirías a este ensayo.