¿Asignar el mismo valor a múltiples variables?

Pregunta:

A veces necesito establecer el mismo valor para múltiples variables.

En Python, podría hacer

f_loc1 = f_loc2 = "/foo/bar"

Pero en elisp, estoy escribiendo

(setq f_loc1 "/foo/bar" f_loc2 "/foo/bar")

Me pregunto si hay alguna manera de lograr esto usando "/foo/bar" solo una vez.

Respuesta:

setq devuelve el valor, por lo que puede simplemente:

(setq f-loc1 (setq f-loc2 "/foo/bar"))

Si no quieres confiar en eso, usa:

(setq f-loc1 "/foo/bar" f-loc2 f-loc1)

Personalmente evitaría lo último y en su lugar escribiría:

(setq f-loc1 "/foo/bar"
      f-loc2 f-loc1)

o incluso

(setq f-loc1 "/foo/bar")
(setq f-loc2 f-loc1)

Y el primer enfoque solo lo usaría en circunstancias bastante especiales donde realmente enfatiza la intención, o cuando la alternativa sería usar el segundo enfoque o, de lo contrario, progn .


Puedes dejar de leer aquí si lo anterior te hace feliz. Pero creo que esta es una buena oportunidad para advertirle a usted y a otros que no abusen de las macros.


Finalmente, si bien es tentador escribir una macro como setq-every "porque esto es lisp y podemos", recomiendo encarecidamente no hacerlo. Ganas muy poco haciéndolo:

(setq-every value a b)
   vs
(setq a (setq b value))

Pero al mismo tiempo, hace que sea mucho más difícil para otros lectores leer el código y estar seguros de lo que sucede. setq-every podría implementarse de varias maneras y otros usuarios (incluido un futuro tú) no pueden saber cuál elige el autor, con solo mirar el código que lo usa. [Originalmente hice algunos ejemplos aquí, pero alguien los consideró sarcásticos y una perorata].

Puedes lidiar con esa sobrecarga mental cada vez que miras setq-every o simplemente puedes vivir con un solo personaje adicional. (Al menos en el caso en el que tenga que establecer solo dos variables, pero no puedo recordar que alguna vez tuve que establecer más de dos variables con el mismo valor a la vez. Si tiene que hacer eso, entonces probablemente haya algo más mal con su código.)

Por otro lado, si realmente va a usar esta macro más de media docena de veces, entonces la indirección adicional podría valer la pena. Por ejemplo, uso macros como --when-let de la biblioteca dash.el Eso lo hace más difícil para quienes lo encuentran por primera vez en mi código, pero vale la pena superar esa dificultad de comprensión porque se usa más que unas pocas veces y, al menos en mi opinión, hace que el código sea más legible. .

Se podría argumentar que lo mismo se aplica a setq-every , pero creo que es muy poco probable que esta macro en particular se use más de unas pocas veces. Una buena regla general es que cuando la definición de la macro (incluida la cadena de documentos) agrega más código del que elimina el uso de la macro, es muy probable que la macro sea excesiva (aunque lo contrario no es necesariamente cierto).

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım