2009-04-02 8 views
5

Acabo de empezar a aprender Common Lisp y rápidamente me enamoré de él, y acabo de pasar al sistema de tipos. Parece que estoy desarrollando una afición particular por la programación aplicativa.Programación aplicable y tipos comunes de ceceo

Según tengo entendido, en CL las cadenas y listas son ambas secuencias, pero no parece haber ninguna función estándar para mapear sobre una secuencia, solo listas. Puedo ver por qué se les proporcionaría listas, con ellos siendo el tipo de datos fundamental y todo, pero ¿por qué no estaba diseñado para trabajar con secuencias? Como son un tipo más general, parecería más útil orientar las funciones aplicativas a ellas en lugar de a las listas. ¿O estoy completamente mal entendiendo cómo funciona?

Editar:

lo que estaba sintiendo particularmente confundido sobre era la forma en que las secuencias de la abstracción - - y enumera - un problema de implementación - parecen estar confuso, en la CL. El consenso parece ser que esto es por razones históricas; lisp ha existido por tanto tiempo que puedes trazar el desarrollo de prácticas de ingeniería de software a través de sus funciones y macros; qué funciones se aplican a las secuencias y cuáles a las listas parece arbitrario a primera vista porque CL tiene una mezcla de funciones de abstracción previa a la secuencia que operan solo en listas y funciones que hacen lo mismo de forma más general en las secuencias. Como alguien que recién está aprendiendo CL por el momento, creo que sería útil que los autores introdujeran las secuencias primero como la abstracción más limpia, y luego las compraran en listas como la implementación más fundamental de esa abstracción. Las listas todavía se necesitarían como sintaxis, por supuesto, pero para el momento en que sea necesario afirmar esto explícitamente, muchos lectores habrían resuelto esto por sí mismos, lo cual sería todo un impulso para el ego al comenzar.

Respuesta

1

Bueno, en general es correcto. La mayoría de las funciones no efectivamente centrado en las listas (mapcar, find, count, remove, append etc.) Para algunos de éstos hay funciones equivalentes para secuencias (concatenate, some y every vienen a la mente), y algunos, donde la lista equivalente está desactualizado (por ejemplo, nth solo para listas frente a elt para todas las secuencias). Algunas funciones simplemente funcionan en secuencias (length, por ejemplo).

CL es un desastre. Es un gran lenguaje, como en enorme. Más de 700 funciones, AFAIK. Y es viejo. Algunas de estas funciones son obsoletas por convención, y otras raramente, si alguna, se usan.

Sí, sería más útil que las funciones de mapeo sean métodos que se apliquen como se pretende en todas las secuencias. CL simplemente no fue construido de esa manera. Si fuera a ser construido de nuevo hoy, estoy seguro de que esto sería considerado, y se vería muy diferente.

Dicho esto, no te quedas completamente frío. La macro loop funciona en secuencias, al igual que iterate (una macro de bucle separada, que me gusta más). Esto te llevará lejos. Para la mayoría de los propósitos prácticos, utilizará listas, y esto no será más que un problema pragmático. Si le falta una función de mapeo para vectores (o secuencias en general), ¿quién le impedirá escribirla?

+5

CUENTA, ENCUENTRE, ELIMINE el trabajo fino sobre las secuencias. Verifique el diccionario de secuencias del estándar ANSI CL. –

+0

Bien, bien, ¿qué sabías? Hablé un poco delante de mí allí. ¡Gracias! –

+0

Puede haber hablado antes que usted, pero me dio la respuesta que necesitaba. Lo que me confundió fue por qué la abstracción entre secuencias como el caso general y las listas como la implementación parecía tan confusa en CL; ahora sé que es por razones históricas. ¡Gracias! –

Cuestiones relacionadas