CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 24 Sep 2018 13:06

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 9 mensajes ] 
Autor Mensaje
NotaPublicado: 26 Mar 2014 10:54 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 720
Últimamente ando especialmente torpe... quiero guardar en una variable el nombre corto de cualquier objeto, ¡y no soy capaz de hacerlo! Me gustaría hacer funcionar esto (y ya sé que debe ser la mayor tontería del mundo, pero no hay manera):

Código:
[ nombre obj ret;
   if (obj tiene nombre y el nombre no es 0) {
      ret = nombre del objeto;
   }
   else {
      ret = "nada";
   }
   return ret;
];

Con nombre, me refiero al nombre corto; el texto que suele especificarse entre comillas en la cabecera de cada objeto, o a aquel que indique la propiedad short_name. Es decir, quiero seguir la misma regla para sacar el nombre corto que sigue Inform: (1) Si short_name es una cadena, ese es el nombre corto. (2) Si es una rutina, en el nombre corto se guardaría cualquier texto que imprima la rutina. Si retorna verdadero, eso es todo. Si no, además (3) se guarda en el nombre el texto especificado entre comillas en la cabecera del objeto.

Si la rutina se invoca pasando cualquier parámetro que no sea un objeto, es cuando se debería retornar "nada".

¡Gracias!


Arriba
 Perfil  
 
NotaPublicado: 26 Mar 2014 16:24 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1863
Makinaimo escribió:
quiero guardar en una variable el nombre corto de cualquier objeto[...] quiero seguir la misma regla para sacar el nombre corto que sigue Inform

Para no tener que clonar el comportamiento de Inform, se me ocurre dejarle que haga el trabajo. Si hay una forma de imprimir lo que te interesa, hay una forma (mediante el stream 3) de cargarlo en un array.

Supongamos que es print (name) obj. Lo podemos cargar en un array global:
Código:
array g_nombre -> 256; ! Ajustar el tamaño máximo.
[ carga_g_nombre obj;
  @output_stream 3 g_nombre;
  print (name) obj; ! Cualquier cosa que quieras imprimir en el array.
  @output_stream -3;
];

A partir de ahí, hacer lo que necesites con el array. Como comprobación, podrías ver por pantalla el texto que contiene con, por ejemplo:
Código:
[ debug_ver_g_nombre
  len tmp;
  len = g_nombre-->0 - 1;
  tmp = g_nombre + 2;
  @print_table tmp len;
];


Arriba
 Perfil  
 
NotaPublicado: 26 Mar 2014 22:36 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 720
dddddd escribió:
Para no tener que clonar el comportamiento de Inform, se me ocurre dejarle que haga el trabajo. Si hay una forma de imprimir lo que te interesa, hay una forma (mediante el stream 3) de cargarlo en un array.

¡Oh! Gracias, dddddd. No tenía ni idea de que se podía hacer algo así. ¡Esta noche lo pruebo y comento!


Arriba
 Perfil  
 
NotaPublicado: 26 Mar 2014 22:37 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1863
Hmmm, ahora que lo reviso con más calma, veo que hay un par de erratas/bugs. Nada grave para entender el concepto pero pueden despistar. Perdón.

  • El array global no estaba declarado del tipo correcto, debe hacerse así:
    (usando -->)
    Código:
    array g_nombre --> 256; ! Ajustar el tamaño máximo.

  • La longitud del texto en la función de comprobación no era correcta, debería poner:
    (sin restar uno)
    Código:
      len = g_nombre-->0;


Arriba
 Perfil  
 
NotaPublicado: 28 Mar 2014 13:40 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 720
Uhm... no me funciona:

Código:
line 349: Error:  Expected an opcode name but found output_stream
>  @output_stream
line 351: Error:  Expected an opcode name but found output_stream
>  @output_stream
line 357: Error:  Expected an opcode name but found print_table
>  @print_table

Voy a buscar más sobre ese @output_stream.

EDITO: ¡Ah! ¿Esos @output_stream y @print_table pueden ser ensamblador de la Máquina-Z? Si es así, necesitaría algo de ese tipo para Glulx. Sigo mirando...


Arriba
 Perfil  
 
NotaPublicado: 28 Mar 2014 14:26 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 720
He visto esta función en la extensión JustEnoughGlulx de Roger Firth:

Spoiler: Mostrar
Código:
Constant bp_outstream_Screen    1;
Constant bp_outstream_Script    2;
Constant bp_outstream_Memory    3;
Constant bp_outstream_Cmdfile   4;

[ bp_output_stream str buf max
        fref;
#ifdef  TARGET_ZCODE;
        @output_stream str buf;
        fref = max;                 ! Avoid compiler warning

#ifnot; ! TARGET_GLULX;
        switch (str) {
            bp_outstream_Screen:
                ;                   ! Code to be supplied

            -bp_outstream_Screen:
                ;                   ! Code to be supplied

            bp_outstream_Script:    ! ScriptOn
                if (gg_scriptstr ~= GLK_NULL) rfalse;
                if (gg_scriptfref == GLK_NULL) {
                    gg_scriptfref = glk_fileref_create_by_prompt(fileusage_TextMode+fileusage_Transcript, filemode_Write, GG_SCRIPTFREF_ROCK);
                    if (gg_scriptfref == GLK_NULL) rfalse;
                    }
                gg_scriptstr = glk_stream_open_file(gg_scriptfref, filemode_WriteAppend, GG_SCRIPTSTR_ROCK);
                if (gg_scriptstr == GLK_NULL) rfalse;
                glk_window_set_echo_stream(gg_mainwin, gg_scriptstr);

            -bp_outstream_Script:   ! ScriptOff
                if (gg_scriptstr == GLK_NULL) rfalse;
                glk_stream_close(gg_scriptstr, GLK_NULL);
                gg_scriptstr = GLK_NULL;

            bp_outstream_Memory:
                if (bp_memory_nest == BP_MEMORY_MAXNEST) rfalse;
                bp_memory_buf-->bp_memory_nest = buf;
                bp_memory_str-->bp_memory_nest = glk_stream_get_current();
                glk_stream_set_current(glk_stream_open_memory(buf+WORDSIZE, max, filemode_Write, BP_MEMORYFREF_ROCK+bp_memory_nest));
                bp_memory_nest++;

            -bp_outstream_Memory:
                if (bp_memory_nest == 0) rfalse;
                bp_memory_nest--;
                glk_stream_close(glk_stream_get_current(), gg_arguments);
                glk_stream_set_current(bp_memory_str-->bp_memory_nest);
                (bp_memory_buf-->bp_memory_nest)-->0 = gg_arguments-->1;
                bp_memory_buf-->bp_memory_nest = bp_memory_str-->bp_memory_nest = GLK_NULL;

            bp_outstream_Cmdfile:   ! CommandsOn
                if (gg_commandstr ~= GLK_NULL) rfalse;
                fref = glk_fileref_create_by_prompt(fileusage_TextMode+fileusage_InputRecord, filemode_Write, GG_COMMANDWSTR_ROCK);
                if (fref == GLK_NULL) rfalse;
                gg_commandstr = glk_stream_open_file(fref, filemode_Write, GG_COMMANDWSTR_ROCK);
                glk_fileref_destroy(fref);
                gg_command_reading = false;
                if (gg_commandstr == GLK_NULL) rfalse;

            -bp_outstream_Cmdfile:  ! CommandsOff
                if (gg_commandstr == GLK_NULL) rfalse;
                if (gg_command_reading) rfalse;
                gg_command_reading = false;
                glk_stream_close(gg_commandstr, GLK_NULL);
                gg_commandstr = GLK_NULL;
            }

#endif; ! TARGET_
        rtrue; ];

Supongo que a ahí tengo lo que necesito para hacer funcionar el código de dddddd en Glulx. Pero aún no sé cómo.


Arriba
 Perfil  
 
NotaPublicado: 28 Mar 2014 14:43 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1863
Sí, lo que propuse es para Máquina Z. Para glulx puede que haya que depender de Glk.

La extensión que comentas soporta el stream 3 en modo bi-plataforma (o eso entiendo). Parece que sería cuestión de sustuir @output_stream por bp_output_stream(), pero esto se está volviendo cada vez más complejo.

Quizás sabiendo a más alto nivel la funcionalidad que intentas implentar puedan darte una solución más directa. ¿Qué intentas con eso de devolver el texto "nada"? ¿Quizás dar un valor por defecto a todos los objetos? ¿No ayudaría ahí la herencia?


Arriba
 Perfil  
 
NotaPublicado: 29 Mar 2014 15:32 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1863
Adaptación a glulx/glk de la propuesta, sin utilizar JustEnoughGlulx de Roger Firth pero basada en sus técnicas:
Código:
Constant g_nombre_stream_id = 666; ! Cualquier stream libre.
Constant g_nombre_size = 256; ! Ajustar el tamaño máximo.
array g_nombre --> g_nombre_size;
[ carga_g_nombre obj
  old_stream;
  old_stream = glk_stream_get_current();
  glk_stream_set_current(glk_stream_open_memory(
    g_nombre+WORDSIZE, g_nombre_size, filemode_Write, g_nombre_stream_id));
  ! Aquí lo que queramos escribir en el array.
  print (name) obj;
  !
  glk_stream_close(glk_stream_get_current(), gg_arguments);
  glk_stream_set_current(old_stream);
  g_nombre-->0 = gg_arguments-->1;
];

Código:
[ debug_ver_g_nombre
  tmp len;
  len = g_nombre-->0;
  tmp = g_nombre + WORDSIZE;
  glk_put_buffer(tmp, len);
];


Arriba
 Perfil  
 
NotaPublicado: 31 Mar 2014 13:27 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 720
dddddd escribió:
Adaptación a glulx/glk de la propuesta, sin utilizar JustEnoughGlulx de Roger Firth pero basada en sus técnicas:

Gracias. Funciona perfectamente. Ahora sólo me faltaría una última cosa. :)


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 9 mensajes ] 

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Saltar a:  
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM