Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Debates (https://www.clubdelphi.com/foros/forumdisplay.php?f=29)
-   -   Un nuevo tipo de Pascal (https://www.clubdelphi.com/foros/showthread.php?t=84241)

mamcx 25-09-2013 00:20:07

Un nuevo tipo de Pascal
 
Como escribi en http://clubdelphi.com/foros/showthread.php?t=80367 llevo un rato dandole vueltas a hacer un nuevo lenguaje.

Eso me ha llevado a conocer un monton de lenguajes alternativos, y de entre ellos, este es muy parecido a pascal:

http://nimrod-code.org/

(En el home se ve mas como un python, es mas bien un pythonpascal :))

Ya en el tutorial:

http://nimrod-code.org/tut1.html

Código Delphi [-]
type
  TMyObject {.final, pure, acyclic.} = object  # comment continues: \
    # we have lots of space here to comment 'TMyObject'.
    # This line belongs to the comment as it's properly aligned.

var
  x, y: int
  # a comment can occur here too
  a, b, c: string

type
  PNode = ref TNode
  TNode = tuple[le, ri: PNode, data: int]
var
  n: PNode
new(n)
n.data = 9

type
  TPerson = object of TObject
    name*: string  # the * means that `name` is accessible from other modules
    age: int       # no * means that the field is hidden from other modules
  
  TStudent = object of TPerson # TStudent inherits from TPerson
    id: int                    # with an id field

Muy interesante me parecio su metaprogramacion (MACROS en C++):

Código Delphi [-]
const
  debug = True

template log(msg: string) =
  if debug: stdout.writeln(msg)

var
  x = 4
log("x has the value: " & $x)

Ñuño Martínez 02-10-2013 12:34:03

Muy interesante. Yo también ando buscando un "nuevo lenguaje" (en realidad ya lo tengo, pero ahora tengo que implementarlo y me da mucha pereza :o ) y este tiene muy buena pinta.

mamcx 02-10-2013 21:09:02

Y como has pensando el lenguaje?

Ñuño Martínez 03-10-2013 17:32:19

Es un lenguaje orientado a objetos, dirigido por estados y basado en mensajes (toma ya :D). Está pensado para aplicarlo a videojuegos, especialmente para definir comportamientos de personajes y objetos. Por ejemplo, este adaptado de "Programming Game IA By Example":
Código:

ACTOR Bob IS aMiner
  STATE EnCasa
    IF Lugar # Casa
      Msg "Walkin' home."
      MoverA (Casa)
      SEND MESSAGE EnCasa TO Esposa
    ELSE
      IF Fatigado
        Descansa
      ELSE
        SET STATE TrabajaMina
      END IF
    END IF
  END STATE



  MESSAGE CenaLista
    IF Lugar = Casa THEN
      Msg "Okay hun, ahm a-comin"
      SET Hambre TO 0
      SET STATE Comiendo
    END IF
  END MESSAGE
 


  STATE Comiendo
    IF Hambre = 0
      Msg "Smells Reaaal goood Elsa!"
      SET Hambre TO 1
    ELSE
      IF Hambre = 1
        Msg "Tastes real good too!"
        SET Hambre TO 2
      ELSE
        Msg "Thankya li'lle lady. Ah better get back to whatever ah wuz doin'."
        SET STATE PREVIOUS
      END IF
    END IF
  END STATE



  STATE TrabajaMina
    IF Lugar # Mina
      Msg "Walkin' to the gold mine."
      MoverA (Mina)
    ELSE
      Cava
      Msg "Pickin' up a nugget."
      IF BolsaLlena
        SET STATE VisitaBanco
      ELSE
        IF Sediento
          SET STATE VisitaSaloon
      END IF
    END IF
  END STATE



  STATE VisitaBanco
    IngresaDinero (Oro)
    SET Oro TO 0
    IF SuficienteOro (Dinero)
      Msg "WooHoo! Rich enough for now. Back home to mah li'lle lady."
      SET STATE EnCasa
    ELSE
      SET STATE TrabajaMina
    END IF
  END STATE



  STATE VisitaSaloon
    IF Lugar # Saloon
      Msg "Boy, ah sure is thusty! Walking to the saloon."
      MoverA (Saloon)
    ELSE
      IF Sediento
        IF NOT Inventario (Wisky)
          Compra (Wisky)
        ELSE
          Bebe (Wisky)
          Msg "That's mighty fine sippin' liquer."
          SET STATE TrabajaMina
        END IF
      END IF
    END IF
  END STATE
END ACTOR

Como digo, no lo he implementado, pero debería funcionar.

Casimiro Noteví 03-10-2013 17:47:18

Véndeselo a facebook, para que lo usen todos sus usuarios que tienen la costumbre de ir contando al mundo lo que están haciendo :D

mamcx 03-10-2013 21:55:08

Cita:

Empezado por Ñuño Martínez (Mensaje 467783)
Es un lenguaje orientado a objetos, dirigido por estados y basado en mensajes (toma ya :D).

Interesante. Pero no entiendo la utilidad practica de manejar maquinas de estado explicitamente, si ya tienes el cuento de pasar mensajes.

Si el lenguaje tiene capacidad de usar YIELD, mensajes y hacer un SELECT para esperar sus respuestas, forzosamente puede modelar una maquina de estado:

https://gobyexample.com/select

Pero me gustaría ver como eso podría ayudar de forma mas clara.

Ñuño Martínez 05-10-2013 15:05:04

Como digo, es para definir el comportamiento de los actores en un videojuego. Cada actor tiene un estado, el cual es quien define su comportamiento. Los mensajes se usan para que los actores se comuniquen entre sí.

La ventaja está en que el intérprete permitirá (si el motor así lo indica) que el diseñador del juego cree sus propios estados sin limitarse a los que el motor provee.

Cita:

Empezado por Casimiro Notevi (Mensaje 467785)
Véndeselo a facebook, para que lo usen todos sus usuarios que tienen la costumbre de ir contando al mundo lo que están haciendo :D

:D Me lo pensaré.

mamcx 05-10-2013 20:50:38

Si, entiendo lo de los estados. Lo que no entiendo es porque independiente de los mensajes (aparte que asi como se ven no muy diferentes a GOTO).

Si hay corutinas, cada vez que se hace YIELD se cede el control. Pero si ademas hay un canal de mensajes y por ende el YIELD se redirecciona con precision a quien espera el mensaje, entonces es como brincar a un nuevo estado (asi es como se hace en GO).

Ñuño Martínez 06-10-2013 12:04:34

No tengo ni idea de GO, así que no sé muy bien cómo va; y la verdad es que me pierdo con eso del YIELD y las corrutinas... :confused:

Los mensajes no son GOTOs, ya que modifican el flujo del programa. Es más, es que en mi lenguaje no se definen flujos de ejecución, en el sentido estricto. Tanto las respuestas a mensajes como las descripciones de los estados se ejecutan en un tick o, quizá mejor dicho, en una iteración del bucle principal de juego. Es decir:
Código Delphi [-]
  PROCEDURE BucleJuego;
  BEGIN
    REPEAT
      ObtieneEntradasJugador; { Teclado, ratón, mando de juego... }
      ActualizaEstadosActores;
      DespachaMensajesPendientes;
      DibujaNuevoFotograma;
    UNTIL FinJuego;
  END;
ActualizaEstadosActores y DespachaMensajesPendientes son los puntos de entrada al intérprete del lenguaje. En el primero se ejecuta la rutina del estado actual del actor y en el segundo se despachan los mensajes de la cola de pendientes.

Hay que tener en cuenta, también, que puede establecerse un retardo al envío de un mensaje. Es decir, que pueden funcionar como una especie de "alarma". Por ejemplo, cuando el minero Bob llega a casa avisa a su esposa Helen; la respuesta podría ser:
Código:

ACTOR Helen IS Wife
 ...

  MESSAGE EnCasa
    IF SENDER = Esposo
      Msg "Hi hun.  I'll prepare your dinna'."
      SEND MESSAGE CenaLista TO SELF DELAY 100
    END IF
  END MESSAGE

  MESSAGE CenaLista
    IF SENDER = SELF
      Msg "Hun, her' are your dinna'."
      SEND MESSAGE CenaLista TO Esposo
    END IF
  END
 ...
END ACTOR

Como ves, las respuestas a estos mensajes no modifican el estado de la esposa, por lo que no modifican el "flujo" del programa.

No sé si esto aclara algo. Espero que sí.

mamcx 06-10-2013 20:25:17

Basicamente, estas describiendo el modelo de canales y mensajes de GO.

Pegate una revisada de todo eso, que hay otras posibilidades muy interesantes para lo de juegos que se pueden modelar basado en ese modelo (que se llama https://en.wikipedia.org/wiki/Commun...tial_processes).

Tambien revisa que es una corutina, un closure y como se usa el comando YIELD en C# o en Python.

Ñuño Martínez 07-10-2013 18:29:20

Ok. Le echaré un vistazo. :)


La franja horaria es GMT +2. Ahora son las 22:25:14.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi