voc on react os

type extension

MODULE Main2;
IMPORT Out;

TYPE Body = RECORD
    val: INTEGER;
END;

TYPE Sun = RECORD(Body)
    a: INTEGER;
END;

TYPE Earth = RECORD(Body)
    b: INTEGER;
END;

TYPE Moon = RECORD(Body)
    c: INTEGER;
END;

VAR
    res: Body;

PROCEDURE GetBody(i: INTEGER; VAR r: Body);
VAR
    sun: Sun;
    earth: Earth;
    moon: Moon;

BEGIN

    IF i = 1 THEN
        sun.val := 1;
        sun.a := 1;
        r := sun;
    ELSIF i = 2 THEN
        earth.val := 2;
        earth.b := 2;
        r := earth;
    ELSE
        moon.val := 3;
        moon.c := 3;
        r := moon;
    END;

END GetBody;


BEGIN

    GetBody(1, res);

    IF res IS Sun THEN
        Out.String("res IS Sun");
    END;
    IF res IS Earth THEN
        Out.String("res IS Earth");
    END;
    IF res IS Moon THEN
        Out.String("res IS Moon");
    END;
    Out.Ln;

END Main2.

editor theme


Oberon — Moon of Uranus

MODULE Main;
IMPORT MathL, Cairo;

TYPE POSITION = RECORD
    X, Y: REAL;
END;

TYPE RGB = RECORD
    Red, Green, Blue: REAL;
END;

TYPE BODY = RECORD
    Name: ARRAY 10 OF CHAR;
    Radius: REAL;
    Color: RGB;
    Position, LabelPosition: POSITION;
END;

VAR
    c: Cairo.Context;
    s: Cairo.Surface;
    i, j, n: INTEGER;
    status: Cairo.StatusType;
    body: ARRAY 6 OF BODY;
    color: RGB;
    position: POSITION;
    workspace: REAL;
    scale: INTEGER;

BEGIN
    workspace := 10.0;
    scale := 600;

    (* Earth *)
    color.Red := 0.4;
    color.Green := 0.4;
    color.Blue := 1.0;
    position.X := 0.15;
    position.Y := 0.75;
    body[n].Name := "Earth";
    body[n].Radius := 1.0;
    body[n].Color := color;
    body[n].Position := position;
    position.X := position.X - 0.06;
    position.Y := position.Y + 0.15;
    body[n].LabelPosition := position;

    (* Moon *)
    INC(n);
    color.Red := 0.9;
    color.Green := 0.9;
    color.Blue := 0.9;
    position.X := 0.45;
    position.Y := 0.75;
    body[n].Name := "Moon";
    body[n].Radius := 0.2727; (* https://en.wikipedia.org/wiki/Moon *)
    body[n].Color := color;
    body[n].Position := position;
    position.X := position.X - 0.06;
    position.Y := position.Y + 0.075;
    body[n].LabelPosition := position;

    (* Uranus *)
    INC(n);
    color.Red := 0.7;
    color.Green := 0.7;
    color.Blue := 1.0;
    position.X := 0.15;
    position.Y := 0.15;
    body[n].Name := "Uranus";
    body[n].Radius := 4.007; (* https://en.wikipedia.org/wiki/Uranus *)
    body[n].Color := color;
    body[n].Position := position;
    body[n].LabelPosition := position;

    (* Oberon *)
    INC(n);
    color.Red := 0.9;
    color.Green := 0.9;
    color.Blue := 1.0;
    position.X := 0.7;
    position.Y := 0.05;
    body[n].Name := "Oberon";
    body[n].Radius := 0.1194; (* https://en.wikipedia.org/wiki/Oberon_(moon) *)
    body[n].Color := color;
    body[n].Position := position;
    position.X := position.X - 0.07;
    position.Y := position.Y + 0.06;
    body[n].LabelPosition := position;

    (* Mars *)
    INC(n);
    color.Red := 0.7;
    color.Green := 0.2;
    color.Blue := 0.1;
    position.X := 0.6;
    position.Y := 0.35;
    body[n].Name := "Mars";
    body[n].Radius := 0.533; (* https://en.wikipedia.org/wiki/Mars *)
    body[n].Color := color;
    body[n].Position := position;
    position.X := position.X - 0.05;
    position.Y := position.Y + 0.1;
    body[n].LabelPosition := position;

    (* Jupiter *)
    INC(n);
    color.Red := 1.0;
    color.Green := 0.5;
    color.Blue := 0.2;
    position.X := 1.7;
    position.Y := 1.0;
    body[n].Name := "Jupiter";
    body[n].Radius := 10.973; (* https://en.wikipedia.org/wiki/Jupiter *)
    body[n].Color := color;
    body[n].Position := position;
    position.X := 0.75;
    position.Y := 0.7;
    body[n].LabelPosition := position;

    (* Initialize *)
    s := Cairo.ImageSurfaceCreate(Cairo.FARGB32, scale, scale);
    c := Cairo.Create(s);
    Cairo.Scale(c, scale, scale);

    (* Background *)
    Cairo.SetSourceRGB(c, 0.05, 0.05, 0.05);
    Cairo.Paint(c);
    Cairo.SetLineWidth(c, 0.004);

    (* Grid *)
    FOR i := 0 TO 9 DO
        FOR j := 0 TO 9 DO
            Cairo.Rectangle(c, i*0.1, j*0.1, 0.1, 0.1);
        END;
    END;
    Cairo.SetSourceRGB(c, 0.1, 0.1, 0.1);
    Cairo.Stroke(c);

    (* Bodies *)
    FOR i := 0 TO n DO
        Cairo.Arc(c, body[i].Position.X, body[i].Position.Y, body[i].Radius/workspace, 0.0, 2*MathL.pi);
        Cairo.SetSourceRGB(c, body[i].Color.Red, body[i].Color.Green, body[i].Color.Blue);
        Cairo.Fill(c);
    END;

    (* Font set-up *)
    Cairo.SelectFontFace(c, "Bitstream Charter", Cairo.FSNORMAL, Cairo.FWNORMAL);
    Cairo.SetFontSize(c, 30.0/scale);
    Cairo.SetSourceRGB(c, 1.0, 1.0, 1.0);

    (* Labels *)
    FOR i := 0 TO n DO
        Cairo.MoveTo(c, body[i].LabelPosition.X, body[i].LabelPosition.Y);
        Cairo.ShowText(c, body[i].Name);
        Cairo.Stroke(c);
    END;

    (* Write PNG To Disk *)
    status := Cairo.SurfaceWriteToPNG(s, "oberon.png");

    (* Destroy *)
    Cairo.Destroy(c);
    Cairo.SurfaceDestroy(s);

END Main.

うね