Peter Norvig menciona en Paradigms of Artificial Intelligence Programming, en page 50, el intercambio entre especificidad y consistencia y al elegir 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?Estilo Lisp: setq vs. setf
Respuesta
El uso de setq es más bajo, pero el rendimiento de setf no es un problema. Y setf le permite a usted (o escritores de bibliotecas) proporcionar un comportamiento de setf personalizado, como establecer partes de estructuras de datos personalizadas. Yo digo: ve con setf en todas partes a menos que tengas 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 gratis: http://gigamonkeys.com/book/
Puede usar setf
donde pueda usar setq
. De hecho, setf
es en realidad una macro que se basa en setq
. Entonces, esto debería ser puramente una cuestión de legibilidad y estilo.
Casi todo el código que he visto evita el uso de setq
y usa setf
.
Te recomiendo que sigas el consejo final de Norvig en esa sección: sé consistente. La "legibilidad" es, por supuesto, la razón más importante para hacer cualquier elección en la programación. Si es importante comunicarle al lector (tal vez dentro de 2 meses) que está tratando con la celda de valor completa de un símbolo, entonces use setq
; de lo contrario, use setf
. Pero solo si eres consecuente.
setf es "establecer campo", cambia lugar y puede tener extensiones de usuario. setq se establece con las comillas del primer argumento.
FWIW, yo siempre uso setf
. Si cambio ligeramente la estructura de mi código, 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 el mismo que para los símbolos setq:
CL-USER> (macroexpand '(setf foo 42))
(SETQ FOO 42)
Usted no va a estar mal si utilizó setf todas partes en lugar de setq.
Son las cosas como esta las que arrastran a Common Lisp en el futuro, muchas cosas no utilizadas que los implementadores aún necesitan admitir.
- 1. Diferencia entre `set`,` setq`, y `setf` en Common Lisp?
- 2. Cuál es la diferencia entre defvar, defparameter, setf y setq
- 3. definiendo setf-expanders en Common Lisp
- 4. Lisp: macros vs funciones
- 5. Implementación del conjunto Mandelbrot en Common Lisp
- 6. Lisp vs Python - Compilación estática
- 7. Acerca de "setf" en "defun"?
- 8. ¿Cuál es la diferencia entre "flet" y "labels" en Common Lisp?
- 9. ¿Puedo hacer esto en Lisp?
- 10. Usando un objeto de cadena como una clave hash en Common Lisp
- 11. Predijo Common Lisp
- 12. Ruby: ¿cómo empalmar una matriz en una lista estilo Lisp?
- 13. Hendidura del "Estilo Lisp" en los idiomas de llavero
- 14. Anidado si en lisp
- 15. Asociación en Common Lisp
- 16. estilo de estilo Lisp `let` sintaxis en Python lista por comprensión
- 17. molde de estilo c vs reinterpret_cast
- 18. Scala Rendimiento: estilo imperativo vs funcional
- 19. Rendimiento del estilo recursivo vs acumulador
- 20. A diferencia de estilo: IDictionary vs Diccionario
- 21. Lisp formato y fuerza de salida
- 22. setq de mayúsculas/minúsculas en .emacs no tiene efecto
- 23. referencias variables en Lisp
- 24. Common Lisp a Lisp-n?
- 25. Emacs Lisp: evaluar la variable en alist
- 26. Desenrolle/argumentos splat en Common Lisp
- 27. ¿Cómo funciona el trabajo de adición en Common Lisp?
- 28. emacs lisp: ¿Cómo eliminar/eliminar un elemento de una lista?
- 29. ¿Cómo puedo memorizar una función recursiva en Lisp?
- 30. envuelve una función en emacs lisp
Objeto a la segunda oración. SETF es una abstracción conveniente sobre varias construcciones de asignación, una de las cuales es SETQ. No puede implementar SETF sin tener SETQ. – Svante
2Svante: pero es difícil imaginar situaciones en las que necesitarías usar setq en lugar de setf. –
Ese no es el punto, nadie usa TAGBODY y GO en el código de alto nivel, tampoco, pero las implementaciones de muchos constructos comunes dependen de ellos. – Svante