1.1        Phrogram e KPL

Linguaggio ludico didattico

KPL ( Kid’s Programming Language) di Jonah Stagner, Jon Schwartz  e Walt Morrison è stato rilasciato nell’agosto 2005, la versione successiva nell’ottobre 2006 è stata chiamataPhrogram.

KPL è nato per insegnare ai ragazzi la programmazione, quindi vi predomina l’aspetto grafico, ludico e l’orientamento allo sviluppo di giochi. E’ un linguaggio fortemente tipizzato con sintassi simile al Basic. Integra un evoluto editor con controllo immediato della sintassi. Dato lo scopo del linguaggio, esiste una ricca dotazione di istruzioni per la grafica, sprites compresi; l’interazione con l’utilizzatore è tuttavia limitata alla tastiera; come pure l’input output è limitato a tastiera e video.

Phrogram versione 2.2 è una evoluzione di KPL, accoglie il paradigma ad oggetti, accetta matrici a più dimensioni ed ha una più ampia gestione della multimedialità (joystick, mouse, suoni) e dell’I/O, peraltro limitato a files di testo.

I tipi di dato sono numeri interi e reali, booleani e stringhe; le strutture complesse le collections (matrici, liste, stack e code), records (structure) e oggetti (class).

Oltre al classico FOR variabile = inizio TO fine con eventuale STEP passo, esiste un semplice LOOP volte e WHILE condizione ... END WHILE.

Sono presenti metodi e funzioni, il method Main è obbligatorio ed indica l’inizio del programma.

Fra gli oggetti (class) predefiniti: Console, DateTime, Drawing, Mouse, Sprites. La Console ha metodi e proprietà che permettono di formattare l’output: font, dimensioni, stili, allineamento, ecc., ma è altra cosa dall’area screen su cui agiscono gli sprites ed i numerosi metodi grafici.

L’intercettazione degli eventi è semplice, come si può vedere dall’esempio sottostante, in cui un ciclo è interrotto dalla pressione di un tasto, ed al suo interno si intercetta la pressione del tasto del mouse e si rilevano le coordinate.  

Program UFO

      Method Main()

            Define MySprite As Sprite

            MySprite.Load( "ufo.gif" )

        MySprite.Show()

            While GetKey() = ""

                  If LeftPressed Then

                        MySprite.MoveTo( MouseX, MouseY )

                  End If

            End While

            console.Bold = True

            console.TextAlignment = "center"

            console.WriteLine("See you later alligator")

            showConsole()

      End Method

End Program

L’oggetto Colors ha 140 nomi di colori, cui corrispondono 140 costanti (non RGB), anche il metodo GetColor, i cui parametri sono le componenti RGB, tenta di restituire uno dei 140 valori.

Le Collections hanno una gran varietà di metodi, sia generali, sia caratteristici del tipo di Collections. Nella classe Math, oltre agli usuali metodi, è presente l’interpolazione lineare e la conversione gradi - radianti e viceversa.

Non esiste ad oggi una classe di widgets per dotare Phrogram di interfaccia grafica, ma è aperto ai plugin; di base è dotato di una class WeatherBug per accedere, tramite Zip Code, ai parametri climatici di una zona.

L’esempio che segue è stato generato, a parte le istruzioni per la grafica, tramite REFAL (vedi par. 1.86 REFAL ) sulla base di un sorgente OMNITAB (vedi par. 1.64 OMNITAB ).

Program Omnitab

      Method Main()

            SetScreenSize(1000, 1000 )

            Define Indx As Integer

            Define NumPoints As Integer

            Define fIndx As Float

            Define Sh As float[46,101]

            SetWindowTitle("Condor Informatique - OMNITAB Emulator")

            PrintLine("TAYLOR SERIES OF LN(1-X) WHERE |X| < 1")

// NOSUMMARY

// PREPARE X VALUES FROM -0.9 TO 0.9

            fIndx =  -0.9

            NumPoints = 0

            While fIndx < 0.9

                  NumPoints = NumPoints+1

                  Sh[NumPoints,1] = fIndx

                  fIndx = fIndx + 0.05

            End While

// COMPLETE FIRST 6 POWERS OF X

            For Indx = 1 To NumPoints

                  Sh[Indx,2] =  Math.Power(Sh[Indx,1] , 2.0)

            Next

            For Indx = 1 To NumPoints

                  Sh[Indx,3] =  Math.Power(Sh[Indx,1] , 3.0)

            Next

            For Indx = 1 To NumPoints

                  Sh[Indx,4] =  Math.Power(Sh[Indx,1] , 4.0)

            Next

            For Indx = 1 To NumPoints

                  Sh[Indx,5] =  Math.Power(Sh[Indx,1] , 5.0)

            Next

            For Indx = 1 To NumPoints

                  Sh[Indx,6] =  Math.Power(Sh[Indx,1] , 6.0)

            Next

// COMPLETE FIRST 6 ADDENDA OF TAYLOR SERIES

            For Indx = 1 To NumPoints

                  Sh[Indx,2] = -0.5 * Sh[Indx,2]

            Next

            For Indx = 1 To NumPoints

                  Sh[Indx,3] = 0.3333333 * Sh[Indx,3]

            Next

            For Indx = 1 To NumPoints

                  Sh[Indx,4] = -0.25 * Sh[Indx,4]

            Next

            For Indx = 1 To NumPoints

                  Sh[Indx,5] = 0.2 * Sh[Indx,5]

            Next

            For Indx = 1 To NumPoints

                  Sh[Indx,6] = -0.1666667 * Sh[Indx,6]

            Next

// CALCULATE Y = LN(1-X)

            For Indx = 1 To NumPoints

                  Sh[Indx,10] = Sh[Indx,6]+Sh[Indx,5]+Sh[Indx,4]+Sh[Indx,3]+Sh[Indx,2]+Sh[Indx,1]+0

            Next

            Shell.SetAlgebraCoordinates()

            Define Coeff As Decimal = 200

            Define RedPencil As Pen

            Define GreenPencil As Pen

            RedPencil.LineWidth = 1

            RedPencil.Color = red

            GreenPencil.Color = green

            RedPencil.MoveTo(0,500)

            RedPencil.DrawTo(0,-500)

            RedPencil.MoveTo(500,0)

            RedPencil.DrawTo(-500,0)

            GreenPencil.MoveTo(Coeff*(Sh[1,1]+1),Coeff*Sh[1,10])

            For Indx = 2 To NumPoints

                  GreenPencil.DrawTo(Coeff*(Sh[Indx,1]+1),Coeff*Sh[Indx,10])

            Next       

      End Method

End Program