Sentencia CLONE

CLONE
    <sentencia> ;
    ...
END

Esta sentencia crea un nuevo proceso idéntico al actual, con la salvedad de que las sentencias entre las palabras reservadas CLONE y END se ejecutarán únicamente en el nuevo proceso y no en el actual.

Por ejemplo, si cualquier proceso del programa, con unas coordenadas (x, y) determinadas y un gráfico (graph) concreto, ejecuta la siguiente sentencia:

  CLONE
      x=x+100;
  END

Se creará un nuevo proceso identico a él, con el mismo gráfico y los mismos valores en todas sus variables, a excepción de la coordenada x, que el nuevo proceso tendrá 100 puntos más a la derecha.

Esta sentencia se utiliza para crear réplicas de un proceso, dividirlo en dos procesos (casi) iguales.

Ejemplo:
PROGRAM mi_juego;
BEGIN
    // ...
    x=0;
    y=0;
    CLONE
        x=x+10;
    END
    CLONE
        y=y+10;
    END
    // ...
END


En este ejemplo, las 2 sentencias CLONE crearán 3 copias del proceso principal (y no 2, como podría haberse esperado).

Al ejecutarse la primera sentencia CLONE se creará un nuevo proceso, con lo que habrá 2: uno en (x=0, y=0) y otro en (x=10, y=0). Y estos dos procesos ejecutarán la segunda sentencia CLONE, el primero (el original) creando con ello un nuevo proceso en (x=0, y=10), y el segundo creará el nuevo proceso en (x=10, y=10).

Para crearse únicamente 2 copias del proceso original se podría haber construido el programa, por ejemplo, de la siguiente forma:

Ejemplo:
PROGRAM mi_juego;
BEGIN
    // ...
    x=0;
    y=0;
    CLONE
        x=x+10;
        CLONE
            y=y+10;
        END
    END
    // ...
END


El proceso original (x=0, y=0) creará uno en (x=10, y=0) y éste, a su vez, otro en (x=10, y=10), creandose únicamente dos copias del original.

Se debe, por tanto, tener mucho cuidado con el uso de la sentencia CLONE de forma secuencial o dentro de un bucle, pues se debe contar con que los primeros 'clones' pueden crear, a su vez, a nuevos 'clones'.

Esta sentencia permite usarse sin poner sentencias entre las palabras CLONE y END. Pero, al menos en un principio, no parece tener mucho sentido el querer tener dos procesos idénticos, con las mismas coordenadas, el mismo gráfico y ejecutando el mismo código.


Ver: Sintaxis