{"id":175,"date":"2015-06-22T18:25:08","date_gmt":"2015-06-22T18:25:08","guid":{"rendered":"http:\/\/arnoldvanhofwegen.com\/blog\/?p=175"},"modified":"2015-06-25T07:12:01","modified_gmt":"2015-06-25T07:12:01","slug":"nieuwe-red-release-beginnerscursus-programmeren","status":"publish","type":"post","link":"https:\/\/arnoldvanhofwegen.com\/blog\/nieuwe-red-release-beginnerscursus-programmeren\/","title":{"rendered":"Nieuwe Red release, beginnerscursus programmeren"},"content":{"rendered":"<p>Het is al een poosje terug dat ik tijd vond om een leuk artikeltje op dit blog te schrijven.<br \/>\nGelukkig is er nu weer een goede reden om even iets te posten.<\/p>\n<p><strong>Namelijk de release 0.5.4 van Red.<\/strong><\/p>\n<p>Red is een nieuwe programmeertaal. Al even in ontwikkeling, al sinds 2012, maar nu ligt een stevige basis waarop flink kan worden doorgebouwd.<\/p>\n<p>En bovendien is Red nu al aardig bruikbaar voor kleine programma&#8217;s.<\/p>\n<p>Binnenkort komt de eerste versie met GUI ondersteuning. Des te meer reden om eens kort te laten zien hoe makkelijk het programmeren met Red is.<\/p>\n<p>Laten we een versie maken van een simpel raad-een-getal-onder-de-100 spel. We gaan een werkend programma maken en ondertussen maken we het nog iets fraaier, maar het kan altijd beter, het is ook om te laten zien wat er zoal kan.<\/p>\n<p>Deze Nederlandstalige versie behandel ik uitgebreid de stappen die nodig zijn om je omgeving in te richten. Omdat alles op de officiele sites in het Engels wordt uitgelegd laat ik dit in de Engelse versie die ik ook zal plaatsen achterwege, maar om degenen die het Engels minder goed beheersen ook met Red kennis te laten maken vertel ik hier alles lekker uitgebreid.<\/p>\n<p><strong>Wat hebben we nodig?<\/strong><\/p>\n<p>Allereerst een Rebol runtime (het Rebol programma) voor onze computer.<br \/>\nDownload daarom een rebol-core van de Rebol.com site<br \/>\nhttp:\/\/www.rebol.com\/download-core.html<br \/>\nen als je toch bezig bent ook gelijk een view versie van<br \/>\nhttp:\/\/www.rebol.com\/download-view.html<br \/>\nOm Red programma&#8217;s te compileren heb je aan de core versie genoeg.<\/p>\n<p>Download de broncode van Red van de Github site<br \/>\nhttps:\/\/github.com\/red\/red<br \/>\nOnderaan in de rechter kolom staat een knop met de tekst &#8220;Download ZIP&#8221;<br \/>\nPak dit bestand uit naar de map waar je het wilt hebben.<\/p>\n<p>Download ook het Red programma van de officiele site<br \/>\nhttp:\/\/www.red-lang.org\/p\/download.html<br \/>\nAls het goed is zie je een grote rode knop waarin de link naar programma voor jouw besturingssysteem van je computer staat.<br \/>\nJe maakt in mijnmap ook een map met bijvoorbeeld de naam &#8216;project&#8217; hierin kun je weer nieuwe mappen maken, voor elk programma dat je maakt eentje.<\/p>\n<p>Ik ga er even vanuit dat je nu een paar mappen hebt:<\/p>\n<pre>\r\n\/mijnmap\r\n    rebol-core.exe \r\n    rebol-view.exe\r\n    red.exe\r\n\/mijnmap\/project\r\n\/mijnmap\/red\r\n<\/pre>\n<p>Start het Red programma eens op. Red compileert nu het console programma voor je. Met dit console kun je allerlei HELP hulp opvragen. Probeer het gerust. Je kunt ook kleine sommetjes proberen bijvoorbeeld 12 * 12 of 4096 \/ 16<\/p>\n<p>We maken nu een programmafile aan.<br \/>\nDat is gewoon een tekstbestand dat je met Notepad of Kladblok kunt openen.<br \/>\nHet bestand noemen we &#8220;raden.red&#8221; en we zetten het in de map mijnmap\/project\/raden\/<\/p>\n<p>Op de eerste regel komt te staan dat dit een Red programma is.<\/p>\n<pre>Red []<\/pre>\n<p>Tussen de blokhaken (of spekhaken ik gebruik vaak beide namen door elkaar) die je veel zult zien kun je allerlei informatie over je programma (of script) zetten.<\/p>\n<pre>Red [\r\n    file: %raden.red\r\n    maker: \"ik\"\r\n    omschrijving: {\r\n    Dit programma kiest een getal van 1 tot en met 99 dat je moet raden.\r\n    }\r\n]<\/pre>\n<p>Zoals je ziet wordt het bestand raden.red voorafgegaan door een procent teken &#8220;%&#8221;. Dit geeft in Red aan dat het om een bestand gaat en niet om een naam van een variabele of iets anders.<\/p>\n<p>We willen straks aan de speler vragen om een getal in te vullen. Hoe doen we dat? We gebruiken de functie ASK.<br \/>\nASK is nog geen standaard functie binnen Red maar het console programma dat met red geleverd wordt maakt al wel gebruik hiervan.<br \/>\nWe moeten op dit moment dus even zelf de broncode voor deze functie aan ons programma meegeven. Gelukkig is dat heel makkelijk.<\/p>\n<pre>Red []\r\n#include %..\/..\/red\/environment\/console\/input.red<\/pre>\n<p>De puntjes en de slash geven aan dat we eerst vanuit dit programma een map omhoog in de mappenboom moeten stappen.<\/p>\n<p><strong>Wat moet het programma doen?<\/strong><br \/>\n1. Een willekeurig geheel getal kiezen van 1 tot 99<br \/>\n2. Vragen om een getal<br \/>\n3. kijken of het het getal geraden is of dat het te raden getal groter of kleiner is.<br \/>\n4. Is het getal geraden of wil de speler stoppen of is er te vaak geprobeerd zonder het goede antwoord dan stoppen<br \/>\n5. Anders gaan we weer naar stap 2<\/p>\n<p>We noemen het getal dat de computer kiest geheim-getal<br \/>\nMet een dubbele punt na geheim-getal geven we aan dat de waarde van geheim-getal gevuld gaat worden met wat er achter volgt.<br \/>\nHet kiezen van een willekeurig getal gaat met de functie random, dat natuurlijk ook willekeurig betekent in het Engels.<\/p>\n<p>Stap 1 vertaalt dan naar<\/p>\n<pre>geheim-getal: random 99<\/pre>\n<p>De rest van het programma schrijf ik nu even anders op<br \/>\ndoe-totdat speler wil stoppen of te vaak geraden of goed geraden<br \/>\nvraag om een getal<br \/>\ntel een op bij het aantal keer raden<br \/>\nkijk of het getal is geraden<br \/>\nzo niet geef een aanwijzing, moet de speler hoger raden of juist lager?<\/p>\n<p>Einde van het spel<\/p>\n<p>Voor doe-totdat hebben we in Red de functie until. Until doet alles uit het blok dat er na komt totdat de voorwaarde op de laatste regel waar is geworden.<\/p>\n<p>We kunnen help until doen in de Red console (red.exe op Windows computers)<\/p>\n<pre>--== Red 0.5.4 ==--\r\nType HELP for starting information.\r\n\r\nred&gt;&gt; help until\r\n\r\nUSAGE:\r\nuntil body\r\n\r\nDESCRIPTION:\r\nEvaluates body until it is true.\r\nuntil is of type: native!\r\n\r\nARGUMENTS:\r\nbody [block!]\r\n\r\nREFINEMENTS:<\/pre>\n<p>Dus until wordt gevolgd door een block!. En een block! is niets meer of minder dan een blok code. En dat is weer alle code die binne een paar spekhaken staat. Oftewel until []. We schrijven nu onze code op.<\/p>\n<pre>until [\r\n    doe-hier-de-dingen-die-je-wilt-doen\r\n    en-misschien-heb-je-daar-heel-wat-regels-voor-nodig\r\n\r\n    totdat-deze-regel-waar-is\r\n]\r\n<\/pre>\n<p>We moeten dus bij gaan houden hoe vaak er geraden is en of het getal geraden is.<\/p>\n<pre>aantal-keer-raden: 0\r\ngetal-geraden: false<\/pre>\n<p>Als de speler wil stoppen willen we daar ook wel rekening mee houden, toch?<br \/>\nDus er zijn 3 redenen waarom ons programma mag stoppen. Elke reden is op zichzelf genoeg reden om te stoppen.<br \/>\nWe hebben in Red een ANY functie die van meer dan 1 voorwaarden teruggeeft of er 1 of meer van waar zijn. Zet elke voorwaarde netjes op een regel.<\/p>\n<p>Dit zegt de Red help any<\/p>\n<pre>red&gt;&gt; help any\r\n\r\nUSAGE:\r\nany conds\r\n\r\nDESCRIPTION:\r\nEvaluates, returning at the first that is true.\r\nany is of type: native!\r\n\r\nARGUMENTS:\r\nconds [block!]\r\n\r\nREFINEMENTS:<\/pre>\n<p>ANY geeft dus al waar terug bij de eerste de beste voorwaarde die waar is.<\/p>\n<p>We krijgen dus<\/p>\n<pre>any [ aantal-keren-raden &gt; 20\r\nantwoord = \"stop\"\r\ngetal-geraden ]<\/pre>\n<p>Samen wordt dit dan<\/p>\n<pre>aantal-keer-raden: 0\r\ngetal-geraden: false\r\n\r\nuntil [ antwoord: ask \"Geef een getal (1 t\/m 99 of stop): \"\r\n    aantal-keer-raden: aantal-keer-raden + 1\r\n\r\n    is-het-getal-geraden?\r\n\r\n    any [ aantal-keren-raden &gt; 20\r\n        antwoord = \"stop\"\r\n        getal-geraden ]\r\n]<\/pre>\n<p>Het stukje is-het-getal-geraden? moeten we nog invullen.<br \/>\nHet geheim-getal is dan gelijk aan het antwoord. Als dat zo is dan is antwoord-geraden.<br \/>\nNet als in andere talen heeft Red ook een IF<br \/>\nif geheim-getal = antwoord [getal-geraden: true]<\/p>\n<p>Als we alle stukjes invullen, krijgen we een aardig programma<\/p>\n<pre>Red [\r\n    file: %raden.red\r\n    maker: \"ik\"\r\n    omschrijving: {\r\n    Dit programma kiest een getal van 1 tot en met 99 dat je moet raden.\r\n    }\r\n]\r\n\r\n#include %..\/..\/red\/environment\/console\/input.red\r\n\r\ngeheim-getal: random 99\r\n\r\naantal-keer-raden: 0\r\ngetal-geraden: false\r\nklaar: false\r\n\r\nuntil [ antwoord: ask \"Geef een getal (1 t\/m 99 of stop): \"\r\n    aantal-keer-raden: aantal-keer-raden + 1\r\n\r\nif geheim-getal = antwoord [\r\n    getal-geraden: true\r\n    print [\"Hoera je hebt het getal geraden in\" aantal-keer-raden \"keer\"]\r\n]\r\n\r\nif geheim-getal &lt; antwoord [ print [\"Het geheime getal is kleiner dan\" antwoord] ] if                 geheim-getal &gt; antwoord [\r\n    print [\"Het geheime getal is groter dan\" antwoord]\r\n]\r\n\r\nany [ aantal-keren-raden &gt; 20\r\n    antwoord = \"stop\"\r\n    getal-geraden ]\r\n]\r\n<\/pre>\n<p>Maar&#8230;.<br \/>\nWe moeten het programma nog compileren!<\/p>\n<p>Hiervoor starten we de rebol-core op.<br \/>\nWe gaan met CD naar de map mijnmap\/red<\/p>\n<pre>cd red<\/pre>\n<p>En daar<\/p>\n<pre>do %red.r<\/pre>\n<p>en we compileren ons programma (hoe dit moet staat in het Engels uitgebreid hier: http:\/\/www.red-lang.org\/2015\/04\/053-faster-compilation-and-extended.html )<\/p>\n<pre>rc \"-c ..\/project\/raden\/raden.red\"<\/pre>\n<p>Als dit klaar is is er een programma gemaakt dat je kunt uitvoeren. In Windows moet je een cmd.exe (DOS schil) openen hierin ga je naar de map (mijnmap\/red) met het programma raden.exe<\/p>\n<p>We testen eerst of het programma ook stopt als we stop typen. Okee dat gaat leuk. Nu gaan we nog eens testen en geven een getal in. Oeps! Een fout!<\/p>\n<p>Alles dat we intypen is natuurlijk een string en geen getal. En als we &#8220;12&#8221; vergelijken met bijvoorbeeld 6, dan vergelijken we appels en peren. We moeten van onze invoer een getal maken. Gelukkig kan dat simpel met de functie LOAD.<\/p>\n<pre>raad-getal: load antwoord<\/pre>\n<p>en we testen of we nu ook echt een getal hebben met<\/p>\n<pre>integer? raad-getal<\/pre>\n<p>Als dat zo is kunnen we verder.<\/p>\n<p><strong>Hoe maken we het programma beter?<\/strong><br \/>\nIn plaats van antwoord = &#8220;stop&#8221; maken we een vlag om te stoppen, we kunnen deze bijvoorbeeld &#8220;stoppen&#8221; noemen, maar &#8220;klaar&#8221; is ook een optie. Als we beginnen zijn we nog niet klaar, dus nemen we een regel op met<br \/>\nklaar: false<br \/>\nNu kunnen we de speler ook helpen door &#8220;s&#8221; en &#8220;stoppen&#8221; ook als &#8220;stop&#8221; op te vatten<\/p>\n<pre>if any [antwoord = \"s\"\r\n    antwoord = \"stop\"\r\n    antwoord = \"stoppen\"] [klaar: true]<\/pre>\n<p>Als je het spelletje vaker speelt zul je merken dat het programma steeds het zelfde getal kiest. We moeten nog de random generator opschudden. Dat moet met de \/seed refinement van de random functie.<br \/>\nrandom\/seed 9999<br \/>\nHet getal waarmee de seed wordt gedaan moet bij voorkeur zelf ook niet steeds gelijk zijn. De tijdstempel is hiervoor een goede optie. Helaas heeft Red nu nog geen tijd die opgevraagd kan worden.<\/p>\n<p>Verder crasht het programma aan het einde als je al klaar bent. Ik heb dit al gemeld bij de ontwikkelaars, maar het wordt tzt vanzelf opgelost als Red officieel input\/output ondersteuning krijgt.<\/p>\n<p>Deze laatste beide problemen zijn ook op te lossen door de C-library binding van Kaj de Vos te gebruiken, en speciaal hiervan de ANSI binding. Je kunt deze binding vinden http:\/\/red.esperconsultancy.nl\/Red-test\/dir?ci=tip<br \/>\n<strong>TIP! Je vindt hier ook voor allerlei Operating Systemen een Red programma met de bindingen er al in gebouwd.<\/strong><br \/>\nJe moet ook nog even een fossil programma downloaden vanaf http:\/\/fossil-scm.org\/index.html\/doc\/trunk\/www\/index.wiki beter gezegd vanaf https:\/\/www.fossil-scm.org\/download.html<br \/>\nDat zet je in de map bij je rebol programma en vanuit de rebol console doe je dan<br \/>\ndo %download.r<\/p>\n<p>Zet al je nieuwe binding files in een map met de naam bind<\/p>\n<p>Nu vervang je de #include regel voor de volgende<\/p>\n<pre>#include %..\/bind\/C-library\/ANSI.red<\/pre>\n<p>en we bepalen de tijd in seconden met now\/precise die we dankzij de binding ook meteen hebben.<\/p>\n<pre>tijd: remainder now\/precise 10000 ; is niet echt nodig maar ruim genoeg voor ons programma.\r\n\r\nrandom\/seed tijd\r\n<\/pre>\n<p><strong>Voor de volledigheid het hele programma<\/strong><\/p>\n<p>(Let niet te veel op de uitlijning, de inspringing hoort met tabs van 4 spaties te zijn)<\/p>\n<pre>Red [\r\n    file: %raden.red\r\n    maker: \"ik\"\r\n    omschrijving: {\r\n    Dit programma kiest een getal van 1 tot en met 99 dat je moet raden.\r\n    }\r\n]\r\n; commentaar is alles dat na een puntkomma komt, behalve als de puntkomma\r\n; in een tekst tussen aanhalingstekens staat.\r\n\r\n; Voeg de functies ASK en NOW toe met deze binding\r\n#include %..\/bind\/C-library\/ANSI.red\r\n\r\n; Beginwaarden instellen\r\ntijd: remainder now\/precise 10000\r\nrandom\/seed tijd\r\n\r\ngeheim-getal: random 99\r\nprint geheim-getal  ; Dit moet je natuurlijk straks in commentaar veranderen!\r\n\r\naantal-keer-raden: 0\r\ngetal-geraden: false\r\nklaar?: false\r\n\r\nuntil [\r\n    antwoord: ask \"Geef een getal (1 t\/m 99 of stop): \"\r\n    if any [antwoord = \"s\"\r\n        antwoord = \"S\"\r\n        antwoord = \"stop\"\r\n        antwoord = \"STOP\"\r\n        antwoord = \"stoppen\"\r\n        antwoord = \"STOPPEN\"][\r\n        print \"Je wilt stoppen, dus tot de volgende keer!\"\r\n        klaar?: true\r\n    ]\r\n\r\n    aantal-keer-raden: aantal-keer-raden + 1\r\n\r\n    if not klaar? [\r\n        raad-getal: load antwoord\r\n        either integer! = type? raad-getal [\r\n\r\n            if geheim-getal = raad-getal [\r\n                getal-geraden: true\r\n                klaar?: true\r\n                print [\"Hoera je hebt het getal geraden in\" aantal-keer-raden \"keer\"]\r\n            ]\r\n\r\n            if not klaar? [\r\n                if aantal-keer-raden &gt; 19 [\r\n                    klaar?: true\r\n                    print [\"Sorry. Je hebt 20 keer geraden, het getal was\" geheim-getal]\r\n                ]\r\n            ]\r\n\r\n            if not klaar? [\r\n                if geheim-getal &lt; raad-getal [\r\n                    print [\"Het geheime getal is kleiner dan\" raad-getal]\r\n                ]\r\n\r\n                if geheim-getal &gt; raad-getal [\r\n                    print [\"Het geheime getal is groter dan\" raad-getal]\r\n                ]\r\n            ]\r\n        ][\r\n            either aantal-keer-raden &gt; 19 [\r\n                klaar?: true\r\n                print [\"Sorry. Je hebt 20 keer geraden, het getal was\" geheim-getal]\r\n            ][\r\n                print \"Dat snapte ik niet helemaal, probeer het nog eens.\"\r\n            ]\r\n        ]\r\n    ]\r\n\r\n    klaar?\r\n]\r\n\r\n; einde programma\r\nprint \"Tot ziens!\"\r\n<\/pre>\n<p><strong>Programmeren in je moerstaal<\/strong><br \/>\nWil je nou liever in het Nederlands programmeren, dan kun je makkelijk je eigen functienaam geven aan de functies in Red. Als je liever VRAAG gebruikt dan ASK dan neem je een regel op met<br \/>\nvraag: :ask<br \/>\nDit zegt dat je VRAAG gelijk maakt aan ASK.<\/p>\n<p>Bedenk wel dat het over het algemeen een beter idee is om de originele functies te gebruiken. Andere programmeurs over de hele wereld gebruiken deze ook en kunnen je beter helpen want jouw eigen functienamen zijn alleen bij jou bekend. En je leert gelijk een beetje Engels \ud83d\ude42<\/p>\n<p><strong>Wat kan er nog meer met Red?<\/strong><\/p>\n<p>Dat is een goede vraag. Mooi voor een volgend blogje.<\/p>\n<p>Laat je het even weten als er nog dingen niet helemaal duidelijk zijn in dit artikel?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Red Release 0.5.4 is uit en ik laat zien hoe je een klein programma maakt in deze interessante programmeertaal. Ik probeer het echt heel uitgebreid stap voor stap te vertellen zodat het ook voor startende programmeurs die het Engels ook nog niet beheersen te begrijpen valt. <a href=\"https:\/\/arnoldvanhofwegen.com\/blog\/nieuwe-red-release-beginnerscursus-programmeren\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"gallery","meta":{"footnotes":""},"categories":[5],"tags":[28,27],"_links":{"self":[{"href":"https:\/\/arnoldvanhofwegen.com\/blog\/wp-json\/wp\/v2\/posts\/175"}],"collection":[{"href":"https:\/\/arnoldvanhofwegen.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/arnoldvanhofwegen.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/arnoldvanhofwegen.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/arnoldvanhofwegen.com\/blog\/wp-json\/wp\/v2\/comments?post=175"}],"version-history":[{"count":20,"href":"https:\/\/arnoldvanhofwegen.com\/blog\/wp-json\/wp\/v2\/posts\/175\/revisions"}],"predecessor-version":[{"id":210,"href":"https:\/\/arnoldvanhofwegen.com\/blog\/wp-json\/wp\/v2\/posts\/175\/revisions\/210"}],"wp:attachment":[{"href":"https:\/\/arnoldvanhofwegen.com\/blog\/wp-json\/wp\/v2\/media?parent=175"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/arnoldvanhofwegen.com\/blog\/wp-json\/wp\/v2\/categories?post=175"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/arnoldvanhofwegen.com\/blog\/wp-json\/wp\/v2\/tags?post=175"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}