Nederlandse Handleiding
Basishandleiding
Welkom bij de Nederlandse basishandleiding voor Citrine. Op deze pagina
wordt een overzicht gegeven van de programmeertaal Citrine.
Terug naar startpagina.
Citrine denkt in objecten. Een computerprogramma geschreven in Citrine is een gesprek tussen objecten. Objecten praten met elkaar door de uitwisseling van berichten.
☞ x := 3.6 afgerond. ☞ x := 3.6 afgerond even?.
Op de eerste regel van bovenstaand voorbeeld sturen we het bericht 'afgerond' naar het getalsobject 3.6. Als antwoord krijgen we nu 4. Dit getal 4 bewaren we onder de naam x. Op de tweede regel sturen we een paar berichten naar 3.6, eerst 'afgerond' (levert 4 op) gevolgd door 'even?'. Op die laatste vraag zal het getal 4 antwoorden met 'Waar'. Dit antwoord bewaren we onder naam x. Dus x zal gelijk zijn aan de bewering Waar (ook een object). Naast deze enkelvoudige berichten zijn er ook berichten met invulvelden (argumenten), dit noemen we meervoudige berichten:
☞ q := Getal tussen: 1 en: 10.
In bovenstaand voorbeeld sturen we het bericht 'tussen:__en:__' naar Getal met de argumenten 1 en 10. Op die manier trekken we een willekeurig getal tussen 1 en 10 welke we bewaren onder de naam q. Een bericht dat bestaat uit slechts één enkel symbool noemen we ook wel een tweevoudig bericht. Dergelijke berichten worden altijd gevolgd door een enkel argument zonder dubbele punt.
☞ x := 2 + 3.
In bovenstaand voorbeeld ontvangt object 2 het tweevoudig bericht + 3 en antwoord met object 5, dat vervolgens in x gestopt wordt. Met een komma kunnen we meerdere meervoudige berichten aaneenschakelen.
✎ schrijf: 'hallo ', schrijf: 'allemaal!'.
De loop van het programma
Ter groepering van een reeks instructies gebruiken we accolades { en }. Om een codeblokje te herhalen vermenigvuldigen we de code met het gewenste aantal iteraties:
{ :x ✎ schrijf: x. } * 5.
Bovenstaande code zal de reeks 01234 tonen
omdat bij elke keer dat het blokje code wordt gedraaid het
volgnummer wordt meegegeven in parameter :x.
Willen we een lus tussentijds afbreken,
bijvoorbeeld na de derde ronde (volgnummer 2)
dan schrijven we:
{ :volgnummer ✎ schijf: volgnummer. (volgnummer = 2) afbreken. } * 5.
Om een blokje voorwaardelijk uit te voeren schrijven we:
(geld ≥ prijs) waar: { product kopen. }.
U kunt een foutafhandelingsclausule toevoegen als volgt:
{ 2 / 0. } afhandelen: { :fout ✎ schrijf: fout. }, start.
Let op het gebruik van de komma, de komma zorgt ervoor dat we het bericht 'start' naar de oorspronkelijke foute code sturen, zonder die komma zouden we direct de foutafhandelingsclausule starten.
Reeksen en Lijsten
Een reeks is een verzameling objecten. Zo maakt u bijvoorbeeld een reeks tekstjes:
☞ taken := Reeks nieuw • 'afwassen' • 'stofzuigen' • 'boodschappen doen'. ✎ schrijf: (taken samenvoegen: ',').
of een reeks getallen:
☞ oneven := Reeks ← 1 ; 3 ; 5.
Een lijst is een verzameling waarbij elke ingang bestaat uit een sleutel en een waarde.
☞ prijs := Lijst kroket: 2 gulden, slavink: 3 gulden, pannekoek: 4 gulden. ✎ schrijf: prijs pannekoek.
Let u trouwens eens op de leuke truuk die we hier uithalen met de gulden. U kunt aan elk getal een kwalificatie geven (dat is een eigenschap van het getalsobject). Met die kwalificatie kunt u makkelijk rekenen tussen valuta. U kunt de kwalificatie ook opvragen:
✎ schrijf: prijs pannekoek kwalificatie.
Objecten
Zoals gezegd is alles in Citrine een object. Om uw eigen object te maken schrijft u:
☞ kat := Object nieuw.
U heeft zojuist een katobject gemaakt. Om het mogelijk te maken om onze kat een naam te geven, definiëren we het volgende gedrag:
kat bij: 'naam:' doen: { :genoemd ⚿ identiteit := genoemd. }.
Vanaf nu is het mogelijk om de kat een naam te geven. Bij het ontvangen van het bericht naam: X zal de kat nu reageren door de opgegeven naam X te bewaren als eigenschap identiteit. Alle eigenschappen zijn alleen van binnenuit aan te passen, dit wordt aangegeven met het sleuteltje (⚿). Om onze kat Diva te noemen kunnen we nu schrijven:
kat naam: 'Diva'.
Hoewel onze kat zich nu bewust is van haar naam, heeft ze nog niet de mogelijkheid om zich voor te stellen. Dat moeten we dus nog even toevoegen:
kat bij: 'naam' doen: { ↲ ⚿ identiteit. }.
Bij ontvangst van het eenvoudige bericht naam (dus zonder dubbele punt), antwoordt (↲) onze kat met de intern opgeslagen identiteit. We kunnen nu aan onze kat vragen hoe zij heet:
✎ schrijf: kat naam.
Geavanceerde onderwerpen
U kunt ook objecten baseren op eerder gemaakte versies (prototypische overerving). Zo kunnen we een verwaande kat maken die gebaseerd is op de hiervoor besproken kat:
☞ kapsoneskat := Kat nieuw. kapsoneskat bij: 'naam' doen: { ☞ naam := ⛏ `naam. ☞ tekst := 'Uwe hoogheid kat'. tekst kat: naam. ↲ tekst. }.
In bovenstaand voorbeeld overschrijven we het gedrag voor het bericht
naam.
Bij ontvangst van het bericht naam stuurt de kapsoneskat eerst
een bericht naar het overerfde object (kat) met behulp van het
afspeelicoon (⛏).
Omdat er nu echter twee gedragingen zijn (naam van
de kapsoneskat en naam van de originele kat) moeten we aangeven dat
we nu wél het originele gedrag voor naam van de basiskat willen.
Dit doen we door een accentje aan het
bericht toe te voegen: `naam.
Om nu de naam van de
kapsoneskat (Diva) in de tekst op te nemen, sturen we het bericht
kat: naam naar de tekst. Omdat het bericht kat: niet wordt
herkend door het object tekst, neemt het object tekst aan dat u
een deel van de tekst gerepresenteerd door het bericht wilt vervangen met
hetgene achter de dubbele punt. Het resultaat:
U kunt het gedrag van bestaande objecten ook aanpassen. Stel dat u bijvoorbeeld het × teken wilt gebruiken om stukjes code te herhalen, dan schrijft u:
Getal bij: '×' doen: { :blokje blokje * ⛏. }. 7 × { :i ✎ schrijf: i. }.
Als objecten zich geen raad weten met een ontvangen bericht, dan geven ze
een algemene reactie. Ook dit gedrag kunt u aanpassen door blokjes code
te definieren voor de berichten 'reageer:'
'reageer:en:' en 'reageer:en:en:'.
Voorbeeld:
☞ nagalm := Object nieuw. nagalm bij: 'reageer:' doen: { :geluid 2 * { ✎ schrijf: geluid. }. }. nagalm ho!.
Opdrachten in Citrine worden gescheiden door spaties. Soms willen we echter ook een spatie gebruiken in de naam waaronder we een waarde opslaan. In bovenstaand voorbeeld hebben we de naam kapsoneskat gebruikt. Stel dat we de naam koninklijke kat zouden willen gebruiken dan kan dat mits we voor de spatie een haarspatie gebruiken. Als u de bijgeleverde pictogrammen en macros gebruikt kunt u deze produceren met toetscombinatie ALT+; .
Plug-ins & Systeem
U kunt uitbreidingen voor Citrine eenvoudig installeren. Zodra u begint te praten tegen een object dat niet bestaat (binnen Citrine) zal de programmeertaal gaan zoeken of er uitbreidingen beschikbaar zijn die een object onder de gevraagde naam aanbieden. U dient deze objecten op de volgende locatie neer te zetten:
Als u systeemcommando's voor het Linux/UNIX besturingssysteem wilt laten uitvoeren, stuurt u het bericht opdrachtregel naar het object Programma:
Programma opdrachtregel: 'ls -la'.
Vertalingen
Om een programma van de ene taal te laten vertalen naar een andere doet u:
ctr -t nl2en.dict programma.ctr
Woordenboeken
(.dict-bestanden) zijn in het volgende formaat:
s "BRONTAAL" "DOELTAAL"
Hierbij staat t voor token (een taalelement) en s voor een string (een stukje tekst tussen aanhalingstekens). U kunt automatisch een woordenboek laten maken met de kopbestanden van een tweetal Citrine-versies in verschillende talen:
ctr -g /en/dictionary.h /nl/dictionary.hAppendix
Installeer het meegeleverde lettertype 'Citrine.ttf'. Als u Geany gebruikt, kunt u gebruik maken van de comfortabele Geany Macros:
Lijst van symbolen:
pictogram | hexadecimaal | toetscombinatie |
---|---|---|
⛏ | 26CF | ALT. |
⚿ | 26BF | ALTk |
☞ | 261E | ALT= |
← | 2190 | ALT+ |
↲ | 21B2 | ALT, |
✎ | 270E | ALT' |
≤ | 2264 | ALT< |
≥ | 2265 | ALT> |
≠ | 2260 | ALTu |
• | 2022 | ALT* |
2009 | ALT; (haarspatie) |
Overzicht alle Nederlandse instructies:
Engels | Nederlands |
---|---|
Nil | Niets |
Boolean | Boolean |
True | Waar |
False | Onwaar |
Number | Getal |
String | Tekst |
Code | Taak |
Object | Object |
List | Reeks |
Map | Lijst |
Program | Programma |
File | Bestand |
Moment | Moment |
new | nieuw |
equals: | gelijk: |
and: | en: |
or: | of: |
modulo: | modulus: |
nor: | noch: |
on:do: | bij:doen: |
type | type |
Nil? | Niets? |
myself | mijzelf |
do | doen |
done | klaar |
false: | onwaar: |
true: | waar: |
while: | zolang: |
message:arguments: | bericht:argumenten: |
message: | bericht: |
learn:means: | leer:betekent: |
break | afbreken |
continue | doorgaan |
else: | anders: |
not | niet |
number | getal |
string | tekst |
character: | letter: |
either:or: | of:of: |
by: | per: |
floor | afgerond naar beneden |
ceil | afgerond naar boven |
round | afgerond |
absolute | absoluut |
square root | vierkantswortel |
power: | tot de macht: |
minimum | minimum |
maximum | maximum |
odd? | oneven |
even? | even |
positive? | positief? |
negative? | negatief? |
boolean | boolean |
between:and: | tussen:en: |
bytes | bytes |
length | lengte |
from:length: | van:lengte: |
remove surrounding spaces | verwijder omliggende spaties |
at: | bij: |
position: | positie: |
byte: | byteBij: |
find: | vind: |
last: | laatste: |
replace:with: | vervang:door: |
split: | opsplitsen: |
offset: | overslaan: |
pattern:process: | patroon:verwerk: |
run | start |
apply: | toepassen: |
apply:and: | toepassen:en: |
set:value: | gebruik:waarde: |
error: | fout: |
catch: | afhandelen: |
; | ; |
shift | afschuiven |
count | aantal |
join: | samenvoegen: |
pop | eraf |
sort: | sorteren: |
put:at: | zet:bij: |
map: | lijst: |
each: | elk: |
write: | schrijf: |
path | pad |
read | lezen |
append: | toevoegen: |
prepend: | invoegen: |
exists | bestaat |
size | grootte |
delete | verwijderen |
include | invoegen |
open: | openen: |
close | sluiten |
list: | reeks: |
read bytes: | lees bytes: |
write bytes: | schrijf bytes: |
seek: | zoeken: |
rewind | terugspoelen |
end | einde |
argument: | argument: |
arguments | aantal argumenten |
ask | vraag |
input | invoer |
flush | spoelen |
wait: | wacht: |
time | tijd |
respond: | reageer: |
respond:and: | reageer:en: |
shell: | opdrachtregel: |
clean memory | vegen |
memory: | geheugen: |
memory | geheugen |
tidiness: | opruimingsniveau: |
hash: | kluts: |
byte | byte |
characters | letters |
list | bytereeks |
append byte: | voeg byte toe: |
qualify: | kwalificeren: |
qualification | kwalificatie |
new: | nieuw: |
hour | uur |
hour: | uur: |
hours | uren |
minute: | minuut: |
minute | minuut |
minutes | minuten |
second: | seconde: |
second | seconde |
seconds | seconden |
day | dag |
day: | dag: |
days | dagen |
week | week |
week: | week: |
weeks | weken |
month | maand |
month: | maand: |
months | maanden |
year | jaar |
year: | jaar: |
years | jaren |
weekday | weekdag |
day of the year | jaardag |
zone | zone |
zone: | zone: |
add: | optellen: |
subtract: | aftrekken: |
multiply by: | vermenigvuldig met: |
divide by: | deel door: |
like: | zoals: |
format: | formaat: |
lock | vergrendel |
unlock | ontgrendel |
last | laatste |
first | eerste |
second last | een-na-laatste |
fill:with: | vul:met: |
replace:length:with: | vervang:lengte:door: |
values | waarden |
entries | ingangen |
compare: | vergelijk: |
has: | heeft: |
copy | kopieer |
case:do: | geval:doen: |
stop | stop |
uppercase | hoofdletters |
lowercase | kleine letters |
pattern:process:options: | patroon:verwerk:opties: |
matches: | patroon: |
contains: | bevat: |
apply:and:and: | toepassen:en:en: |
setting: | instelling: |
setting:value: | instelling:is: |
respond:and:and: | reageer:en:en: |
respond:and:and:and: | reageer:en:en:en: |
this code block | dit codeblok |
respond:and:and:and: | reageer:en:en:en: |
respond:and:and: | reageer:en:en: |
respond:and: | reageer:en: |
respond: | reageer: |
add: | optellen: |
subtract: | aftrekken: |
size | grootte |
new | nieuw |
file | bestand |
type | type |
get: | vraag: |
get list: | vragen: |
cookie: | koekje: |
cookies: | koekjes: |
post: | zending: |
post list: | zendingen: |
file: | bestand: |
host:listen:pid:callback: | host:poort:pid:routine: |
Request | Verzoek |