Voy a hacer una pregunta ligeramente subjetiva y dar una respuesta altamente subjetiva, ya que Ira ya me dio una respuesta perfectamente pragmática y lógica. :-)
Sé que escribir cosas explícitamente es muy valorado en algunos círculos (los chicos de Python lo hacen parte de su "zen"), pero incluso cuando estaba escribiendo Python nunca lo entendí. Quiero escribir al más alto nivel posible, todo el tiempo. Cuando quiero escribir cosas explícitamente, utilizo el lenguaje ensamblador. ¡El objetivo de usar una computadora (y una HLL) es lograr que haga estas cosas por mí!
Para su ejemplo my-remove-if
, al reducir uno mira bien para mí (aparte de las Esquema-ismos como fold
y lst
:-)). Estoy familiarizado con el concepto de reducir, así que todo lo que necesito entender es averiguar tu f(x,y) -> z
. Para la variante explícita, tuve que pensarlo por un segundo: tengo que descubrir el loop yo mismo. La recursividad no es el concepto más difícil, pero creo que es más difícil que "una función de dos argumentos".
Tampoco me importa que se repita una línea completa - (my-remove-if pred (cdr lst))
. Creo que me gusta Lisp, en parte porque estoy absolutamente despiadado en DRY, y Lisp me permite estar SECO en ejes que otros idiomas no lo tienen. (Podría poner otro LET
en la parte superior para evitar esto, pero luego es más largo y complejo, lo cual creo que es otra razón para preferir la reducción, aunque en este punto podría estar racionalizando).
Creo tal vez los contextos en los que los chicos de Python, por lo menos, no les gusta la funcionalidad implícita serían:
- cuándo se podría esperar que nadie de adivinar el comportamiento (como
frobnicate("hello, world", True)
- lo que hace verdadera media?), O:
- casos en los que es razonable que la conducta implícita al cambio (como cuando el argumento
True
se mueve, o se elimina o sustituye con otra cosa, ya que no hay error en tiempo de compilación en los idiomas más dinámicas)
Pero reduce
en Lisp falla estos dos criterios: es una abstracción bien entendida que todo el mundo sabe, y que no va a cambiar, al menos no en cualquier escala de tiempo que me preocupe.
Ahora, creo absolutamente que son algunos casos en los que me sería más fácil leer una llamada explícita a una función, pero creo que tendrías que ser muy creativo para idearlos. No puedo pensar en ninguna ocasión, porque reduce
y mapcar
y amigos son abstracciones realmente buenas.
Tenga en cuenta que la mayoría de las licencias obligatorias no se hacen optimización de llamada, por lo tanto, las expresiones comunes en la CL son diferentes, y generalmente sesgado contra este tipo de bucles basados en recursividad. (Y por cierto, algunos Schemers se convirtieron más específicamente en Racketeers, otros no). –
¿Cuál de las implementaciones actuales de CL vale su nombre? NO realiza la optimización de la llamada de cola en la configuración de optimización correcta. – danlei
En 2006, según, al menos SBCL, ECL, CLISP, GCL, Lispworks y Franz lo soportó en sus compiladores. De simple búsqueda en Google, parece que Corman y Clozure también lo hacen. No puedo encontrar información sobre Scieneer, pero parece ser otra horquilla CMUCL, así que supongo que probablemente sí. No puedo encontrar información para ABCL, pero parece que probablemente no lo haga. –
Ken