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.

¿Cómo puedo obtener el nombre del archivo actual en Common Lisp?

¿Existe un equivalente, en CL, a la variable especial file que Python pone a disposición? Si no, ¿hay otra forma de obtener esta información desde un archivo Lisp?

Motivación

La razón por la que estoy intentando acceder al nombre de archivo actual desde dentro del archivo es porque estoy experimentando con escribir mis pruebas en mi archivo de origen principal. Antes de recibir críticas, este es un proyecto de kata muy pequeño donde me permito la flexibilidad de probar cosas que pueden ser tontas/mal diseñadas/etc, pero la experimentación es divertida y me brinda la oportunidad de aprender más sobre CL.

Pregunta

Dicho esto, estoy trabajando en una macro simple que configura una suite de pruebas en Fiveam, etc. y me gustaría nombrar la suite de pruebas en función del nombre del archivo actual. Obviamente, sería muy fácil pasar el “nombre base” del archivo, pero me gustaría saber si hay otra forma.

Es cierto que en Python no existen las macros de CL, pero si quisiera hacer algo con el archivo desde el que se está ejecutando el código, podría usar la variable especial file para obtener ese nombre de archivo. Me gustaría ver si hay una característica equivalente en CL (las bibliotecas se aceptan siempre y cuando pueda ver el código fuente para ver qué hacen). Si no existe, ¿cómo se podría proporcionar esta funcionalidad, suponiendo que sea posible?

Notas finales

Si quieres decirme que esto es estúpido y que no debería hacerlo, siéntete libre, pero por favor incluye al menos una breve descripción de por qué y cuál podría ser una mejor opción. Gracias.

Tags:  

Answer

  1. Avatar for davy.ai

    Hasta donde yo sé, no hay un equivalente exacto a la variable __file__ de Python en Common Lisp. Sin embargo, existen algunas opciones para obtener información similar.

    Un enfoque posible es utilizar *load-pathname*, que es una variable que contiene la ruta del archivo que se está cargando. Esta variable está disponible en el entorno de nivel superior pero no dentro de las funciones, por lo que es posible que deba capturar su valor y pasarlo para acceder a él en macros u otras partes del código.

    Otra opción es utilizar características o bibliotecas específicas de implementación. Por ejemplo, Clozure CL tiene una función llamada ccl::reparse-file-namestring que puede devolver la ruta del archivo actual que se está compilando. SBCL tiene una función similar llamada sb-ext:posix-getcwd. Estas características pueden no ser portables entre las diferentes implementaciones de Common Lisp, por lo que úselas con precaución y consulte la documentación para asegurarse de que estén disponibles y se comporten como se espera.

    Si ninguna de estas opciones funciona para su caso de uso específico, puede considerar un enfoque diferente para nombrar su conjunto de pruebas. En lugar de depender del nombre del archivo, podría utilizar una convención de nombres basada en el contenido del archivo, como el nombre del paquete de nivel superior o un símbolo específico definido en el archivo. Esto haría que sus pruebas dependan menos de la estructura del sistema de archivos y sean más flexibles en caso de que decida dividir o fusionar archivos más adelante.

Comments are closed.