es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿El eq? en Racket se comporta de manera diferente al eq? en Guile o al eq en Common Lisp?

¡Feliz Año Nuevo!

Estoy trabajando en Racket (no soy un Lisper experimentado).

Ahora me encontré con lo siguiente en Racket 8.3:

> (define str1 "hello")
> (define str2 "hello")
> (eq? str1 str2)
#t

Esperaba que fuera #f como se muestra aquí. Y en Guile y en Common Lisp esto fue lo que se devolvió.

De acuerdo con esto, pude reproducir que lo siguiente se comporta de la manera esperada:

> (set! str1 (string #\h #\e #\l #\l #\o))
> (set! str2 (string #\h #\e #\l #\l #\o))
> (eq? str1 str2)
#f

Aún así, no entiendo la razón.

¿Es que en Racket solo la función STRING devuelve dos objetos diferentes y una cadena literal es única como un símbolo? ¿Por lo tanto, eq? se comporta normalmente pero las cadenas literales son tratadas de manera diferente?

¿Sería tan amable de explicármelo?

Muchas gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    ¡Hola!

    En Racket (y muchos otros lenguajes de programación), las cadenas literales (por ejemplo, “hola”) se consideran internas, lo que significa que solo se crean una vez y luego se utilizan para todas las apariciones de esa misma literal. Esto se hace por razones de eficiencia: si utilizas la misma literal varias veces en tu programa, no es necesario crear una nueva cadena cada vez.

    Debido a esto, cuando defines str1 y str2 como "hola", en realidad se refieren al mismo objeto de cadena interno. Por eso, cuando usas (eq? str1 str2), devuelve #t, ya que ambos apuntan al mismo objeto en la memoria.

    Sin embargo, cuando creas dos cadenas nuevas utilizando la función string, como en tu segundo ejemplo, no se consideran internas y se consideran objetos separados. Por eso, (eq? str1 str2) devuelve #f.

    ¡Espero que esta explicación te sea útil! Avísame si tienes alguna otra pregunta.

Comments are closed.