tutorial net descargar compiler compiladores common lisp common-lisp

net - lisp descargar



Estilo Lisp: setq vs. setf (6)

Peter Norvig menciona en Paradigmas de la Programación de Inteligencia Artificial , en la página 50 , el compromiso entre especificidad y consistencia y cuando elige usar setq o setf para actualizar una variable a un valor. ¿Que recomiendas? ¿Alguna vez te has encontrado con una situación en la que importaba mucho más que la legibilidad?


El uso de setq es más bajo, pero el rendimiento de setf no es un problema. Y setf le permite a usted (o a los escritores de bibliotecas) proporcionar un comportamiento de setf personalizado, como configurar partes de estructuras de datos personalizadas. Yo digo: vaya con setf a todas partes a menos que tenga una razón para no hacerlo.

Consulte también Practical Common Lisp, capítulo 3: "La macro SETF es el operador de asignación principal de Common Lisp". PCL está disponible en línea de forma gratuita: http://gigamonkeys.com/book/


Le recomiendo que siga los consejos finales de Norvig en esa sección: sea consistente. La "legibilidad" es, por supuesto, la razón más importante para hacer cualquier elección en la programación. Si es importante comunicar al lector (quizás usted en 2 meses) que está tratando con la celda de valor completa de un símbolo, use setq ; de lo contrario use setf . Pero solo si eres consistente.


No se equivocará si usara setf en todas partes en lugar de setq.

Son las cosas como esta las que arrastran a Common Lisp de seguir adelante, muchas cosas no utilizadas que los implementadores aún necesitan soportar.


Puedes usar setf donde quieras usar setq . De hecho, setf es en realidad una macro que se basa en setq . Por lo tanto, esto debería ser simplemente una cuestión de legibilidad y estilo.

Casi todo el código que he visto evita el uso de setq y usa setf .


setf es "set field", cambia un lugar y puede tener extensiones de usuario. setq se establece con citar el primer argumento.


FWIW, yo siempre uso setf . Si cambio la estructura de mi código ligeramente, solo necesito cambiar el "lugar" en lugar del lugar y el operador (setq -> setf).

Además, no se preocupe por el rendimiento, setf es exactamente lo mismo que setq para los símbolos:

CL-USER> (macroexpand ''(setf foo 42)) (SETQ FOO 42)