Ir al contenido principal

Desreferenciación en línea

PseudoD 2.2.0 ahora incluye también un mecanismo llamado resolución de nombres, también conocido como desreferenciación en línea o nombres resueltos. Esta característica permite al desarrollador dejar de usar las molestas clases PunteroInteligente y Referencia, ahorrando tiempo y recursos para tareas más importantes. En resumen, ahora puedes resolver un nombre sin la necesidad de llamar a funciones externas o utilizar módulos del NEA. Pero primero: ¿Como se resuelve un nombre?

Un nombre resuelto es aquel que puede acceder de por si solo a una dirección de memoria virtual (de PseudoD) válida: Si, PseudoD no almacena la memoria en direcciones crudas (por ejemplo: void* en C y C++) sino en direcciones virtuales, por ello, incrementar un puntero siempre devolverá dos valores: o un puntero válido a otra variable de PseudoD, o un error (memory underflow/overflow).

Algunos nombres resueltos son: mensaje, NULO y foo#bar. La definición de un nombre sin resolver es un poco más complicada: un nombre sin resolver es aquel que contenga los caracteres < y >. Estos poseen un significado especial desde PseudoD 2.2.0: se evalúa la variable o puntero y se reemplaza su valor, por ejemplo: si la variable desref  posee el valor {mensaje} y la variable mensaje posee el valor {Hola Mundo} entonces el nombre <desref> se evalúa como {Hola Mundo}. El NIA se encarga de realizar esta traducción de forma trasparente:

adquirir ref
adquirir val

fijar ref a val#NOMBRE
fijar val a {Hola!}

escribir 
nl
[ Escribe: Hola! ]

Y esto no solo funciona con referencias: ¡también con punteros! Esto hace innecesarias las clases Referencia y PunteroInteligente dado que ahora el código luce así:


[ Nuevo método ]
utilizar entsal.pseudo

clase Persona
    :decirHola
    nombre
    apellido
finclase
heredar Objeto Persona

funcion Persona#decirHola
    adquirir yo
    recibir_parametro yo
    llamar ImprimirLinea
        {¡Hola! yo soy}
        <yo>#nombre
        <yo>#apellido
        NULO
    finargs
    liberar yo
finfun

instancia Persona johnDoe
instancia Persona allice

fijar johnDoe#nombre a {John}
fijar johnDoe#apellido a {Doe}

fijar allice#nombre a {Allice}
fijar allice#apellido a {Mallory}

llamar johnDoe#decirHola finargs
llamar allice#decirHola finargs

[ Viejo método ]
utilizar entsal.pseudo
utilizar tipos.pseudo [ TODO: necesario ]

clase Persona
    :decirHola
    nombre
    apellido
finclase
heredar Objeto Persona

funcion Persona#decirHola
    instancia Referencia yo
    recibir_parametro yo#ref
    llamar ImprimirLinea
        {¡Hola! yo soy}
        llamar yo#obtenerAttr {nombre} finargs
        llamar yo#obtenerAttr {apellido} finargs
    finargs
    liberar yo
finfun

instancia Persona johnDoe
instancia Persona allice

fijar johnDoe#nombre a {John}
fijar johnDoe#apellido a {Doe}

fijar allice#nombre a {Allice}
fijar allice#apellido a {Mallory}

llamar johnDoe#decirHola finargs
llamar allice#decirHola finargs

Y gracias a esto PseudoD ahora es más legible y eficiente.

Comentarios

Entradas más populares de este blog

Punteros y referencias

 PseudoD hace énfasis en las diferencias entre punteros y referencias. Este articulo esta dedicado a mostrar y explicar estas diferencias (incluye ejemplos). Para comenzar, vamos a asumir que al inicio de todos los ejemplos de ejecutó el siguiente código: adquirir variable1 adquirir variable2 adquirir variable3 ¿Muy sencillo no? luego de esto, la memoria de PseudoD queda similar a: Memoria después de tres adquisiciones de memoria Claro, esto es ignorando las variables de la BEPD y del núcleo las cuales, en PseudoD 1.9.5 (no pro bado en versiones recientes) er an de , aproximadamente, ~526 bloques (esto incluyen d o toda la BEPD, nosotros solo utilizaremos lo autoincl uido ). Primero: ¿Que es un puntero? Un puntero (se cción no-normativa , válida solo en PseudoD ) es un bloque de memoria que en vez de poseer un valor propio (como variable1 posee {Hola} en la imagen superior) posee un índice de acceso rápido a otra variable, por ende, cada vez que se acceda al ...

Funciones (guía rápida)

PseudoD, como otros lenguajes de programación, implementa las clases y funciones. Veamos las funciones como código encerrado en un contexto, que permite su re-utilización por cualquier otro código: utilizar entsal.pseudo funcion SaludarA [ Saluda a alguien o algo ] adquirir nombre [ A quién saludar ] recibir_parametro nombre [ Recibimos el parámetro ] llamar ImprimirFormato {¡Hola %!\k} nombre finargs liberar nombre [ No olvidemos liberar la memoria ] finfun [ Ahora podemos utilizar la funcion ] llamar SaludarA {Mundo} finargs [ ¡Hola Mundo! ] llamar SaludarA {Foo} finargs [ ¡Hola Foo! ] llamar SaludarA {John Doe} finargs [ ¡Hola John Doe! ] Nos ahorramos escribir tres(3) veces <llamar ImprimirFormato ...> , claro, esto no es mucho, las funciones son más útiles cuando se van a llamar cientos de veces y poseen cientos de líneas de código. La función <ImprimirFormato> está definida en la cabecera <entsal.pseudo> de la BEPD,...