2009-06-09 17 views

Respuesta

15

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/

9

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.

1

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.

3

setf es "establecer campo", cambia lugar y puede tener extensiones de usuario. setq se establece con las comillas del primer argumento.

10

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) 
-2

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.

+3

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

+0

2Svante: pero es difícil imaginar situaciones en las que necesitarías usar setq en lugar de setf. –

+5

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