Úvod

Ačkoliv je robot Karel znám již dlouho, nikde jsme nenašli nějaký standard, jak má vypadat syntaxe tohoto jazyka. Každý Karel, se kterým jsme se setkali (Hlavně na 8-mi bitových počítačích.) měl syntaxi pokaždé jinou. Z tohoto důvodu jsme definovali svou vlastní syntaxi. Princip programování robota je jednoduchý. Robot zná elementární povely, a také nějaké příkazy řízení (podmínky, cykly). Další nové povely lze vytvářet jako posloupnosti již známých příkazů pomocí procedur. Nový povel, který je definován může být dále používán jako známý povel. Ještě vám jen doporučujeme nové procedury vytvářet v prostředí programu KAREL, ne v nějakých jiných textových editorech, i když zde tato možnost je. Ušetříte si tím mnoho nepříjemností. Všechny příklady, které jsou v této nápovědě nemusíte opisovat. Naleznete je v souboru help.krl, který je distribuován společně s Karlem. Doufáme, že syntaxe pro vás bude lehce pochopitelná.

Klíčová slova

Klíčová slova v jazyku Karel jsou elementární povely, podmínky, nebo cykly. Další klíčová slova jsou slova "Procedure", a "Jinak" Jazyk Karel nerozlišuje mezi velkými a malými písmeny. Tedy "KROK" je to samé jako "Krok", nebo "krok" (Nebo i třeba "kROk".).

Elementární povely

Elementární povely jsou povely, kterým robot Karel rozumí, a provede jako reakci na ně nějakou činnost. Jsou dále "nedělitelné". Neskládají se z žádných povelů, a naopak všechny ostatní uživatelem definované procedury jsou z nich složené. Elementární povely jsou:

Krok

Karel provede krok. Posune se tedy o jedno pole ve směru, ve kterém byl otočen, a svůj směr nezmění. Stál-li Karel před provedením povelu Krok před zdí, dojde k chybě.

Polož

Karel položí cihlu na pole, na kterém stojí. Neposune se na žádné pole, ani se neotočí jiným směrem. Maximální počet cihel na jednom poli lze v programu nastavit. Dojde-li k překročení maximálního povoleného počtu cihel na poli, na němž Karel stál před provedením povelu Polož, dojde k chybě.

Zvedni

Karel vezme (odstraní) cihlu na poli, ne kterém stojí. Neposune se na žádné pole, ani se neotočí jiným směrem. Jestliže již na poli, na němž Karel stál před provedením povelu Zvedni, není cihla (Je prázdné.), dojde k chybě.

Vlevobok

Karel se otočí do leva. Zůstane stát na poli, na němž stál před provedením povelu, a nevezme, ani nepoloží žádnou cihlu.

Podmínky (Větvení)

Podmínky slouží pro lepší řízení robota. Pomocí podmínky lze oddělit posloupnost povelů, jenž se má provést v případě, že podmínka je pravdivá, od povelů, jenž zde mají provést není-li podmínka pravdivá. Syntaxe podmínky je:

Podmínka
{
  #Posloupnost povelů, jenž se mají provést v případě,
  #že podmínka platí. Nemusí zde být žádný povel, ale
  #musí zde být složené závorky.
}
Jinak
{
  #Posloupnost povelů, jenž se mají provést v případě,
  #že podmínka neplatí. Nemusí zde být rovněž žádný povel,
  #ale musí zde být složené závorky. V případě,
  #že by za slovem JINAK měly být jen prázdné závorky,
  #je lepší slovo JINAK vynechat. Viz druhá možnost.
}

Druhá možnost:

Podmínka
{
#Posloupnost povelů, jenž se mají provést v případě,
#že podmínka platí. Nemusí zde být žádný povel,
#ale musí zde být složené závorky.
}

Podmínky

JeSever

Podmínka je platná v případě, že Karel je otočen k severu (nahoru).

JeZeď

Podmínka je pravdivá v případě, že Karel stojí před zdí. Je tedy v takové poloze, a tak otočený, že kdyby udělal Krok, narazil by do zdi.

JeCihla

Podmínka je platná v případě, že Karel stojí na poli, na kterém je položená cihla.

Příklady

  1. Chci, aby Karel provedl krok, jen tehdy, je-li otočen k severu.
    JeSever
    {
         Krok
    }
  2. Chci, aby Karel provedl krok, jen když nestojí před zdí.
    JeZeď
    { }
    Jinak
    {
        Krok
    }
  3. Chci aby Karel vzal cihlu z pole jen tehdy, je-li na tomto poli nějaká cihla, jinak chci aby se otočil do leva, a provedl krok.
    JeCihla
    {
        Zvedni
    }
    Jinak
    {
        Vlevobok
        Krok
    }

Cykly

Cykly stejně jako podmínky slouží pro lepší řízení robota. Pomocí podmínky lze opakovat určitou posloupnost příkazů, dokud bude (resp. nebude) splněna určitá podmínka. Syntaxe cyklu:

Dokud podmínka
{
   #Posloupnost povelů, jenž se mají opakovaně vykonat, dokud podmínka platí.
}

Nebo druhá možnost:

Dokud NE podmínka
{
   #Posloupnost povelů, jenž se mají vykonat, dokud podmínka neplatí.
}

Podmínky mohou být tři, a jejich význam je jíž vysvětlen v kapitole o větvení.

Příklady cyklů

  1. Chci, aby se Karel otočil na sever, aniž bych věděl, kterým směrem je otočen.
    Dokud NE JeSever
    {
        Vlevobok
    }
  2. Chci, aby Karel vybral ve směru, ve kterém je otočen, řadu cihel, dokud nenarazí na pole, na němž cihla není.
    Dokud JeCihla
    {
        Zvedni
        Krok
    }

Poznámky

Do programu pro robota Karla lze vkládat poznámky, které nejsou určeny pro Karla, ale pro programátora. Tyto poznámky Karel ignoruje, a slouží jen pro zpřehlednění programu. Poznámka začíná symbolem "#", a pokračuje až do konce řádku.

Příklad okomentovaného kousku programu:

Dokud NE JeZeď     #Půjdu až ke zdi.
{
     Krok #Tohle je ten krok.
     # Nikdy se nestane:    Polož
}

Procedury

Procedura je nový povel, který se Karel naučí. Aby Karel mohl proceduru provést, musí znát všechny povely, ze kterých se skládá. K definování nové procedury slouží klíčové slovo Procedure. Za tímto slovem následuje textový řetězec, jenž označuje název nového povelu.

Pro název povelu platí:

  • Začíná písmenem, nebo číslem
  • Obsahuje písmena, nebo číslice
  • Název není shodný s žádným klíčovým slovem

Například povolené názvy jsou: "Krok3", "a", "Vpravobok", atd...

Například nepovolené názvy jsou: "%er", "Krok", "Dvoj krok", atd...

Samotné tělo procedury (Posloupnost příkazů, jenž se mají provést.) je uzavřeno ve složených závorkách.

Příklad procedury

Procedure pokus1
{
    #Schválně vrazím do zdi
    Dokud NE JeZeď
    {
        krok
    }
    krok # BUM!!!!!!!!!
}

Upozornění

Psaní poznámek mimo tělo procedury (mimo závorky "{" , "}") není dovoleno.

Rekurzivní volání

Rekurzivní volání je vyvolání procedury (povelu) ze "sebe sama". Rekurze může být přímá, či nepřímá. Programovací jazyk Karel podporuje používání rekurze přímé, i nepřímé.

Příklad přímé rekurze

Procedure NaSever
{
    JeSever
    {}
    Jinak
    {
       Vlevobok
       NaSever # Procedura volá sama sebe
    }
}

Dobře si promyslete, že skutečně (A hlavně proč?) tato procedura dokáže obrátit Karla k severu, ať je před jejím vyvoláním otočen jakkoliv! Jinou metodu řešení problému otočení na sever jsme nastínili v kapitole o cyklech.

Dalším druhem rekurze je rekurze nepřímá. Procedura opět zavolá sama sebe, ale použije k tomu jednu, nebo více procedur.

Příklad nepřímé rekurze

Procedure r1
{
     krok
     r2
}

Procedure r2
{
     JeZeď
     { }
     Jinak
     {
         r1
     }
}

Přijdete sami na to, co udělá Karel, pokud mu zadáte vykonat povel r1?

Časté chyby

V této kapitole poukážeme na časté chyby, které mohou nastat i vám při psaní programů pro robota Karla. Zde vám nabídneme několik rad, jak předejít chybám.

  • Nepište poznámky mimo tělo (Vnější složené závorky) procedury.
  • Počet závorek "{" v proceduře musí být stejný jako počet závorek "}".
  • Nepožívejte pro název nové procedury klíčová slova
  • Nové procedury je nejlepší vytvářet pomocí programu xKarel, a né pomocí jakéhokoliv jiného programu (Textového editoru).
  • Nezapomeňte, že vše co napíšete za symbol "#" až do konce řádku, je Karlem ignorováno.

Vysvětlení některých chybových hlášek

Nečekané ukončení zdrojového textu procedury XXX
V dané proceduře došlo k ukončení těla procedury, ačkoliv syntaxe konec nedovoluje. Zkontrolujte například, jestli všechny podmínky, nebo cykly mají správně závorky.
XXX ve svém těle někde postrádá začátek bloku (znak "{")
Zkontroluje, jestli znak "{" je skutečně všude, kde je očekáván. V cyklech, podmínkách, za slovem "JINAK".
XXX ve svém těle někde postrádá konec bloku (znak "}")
Zkontroluje, jestli znak "}" je skutečně všude, kde je očekáván. V cyklech, podmínkách, za slovem "JINAK".
Špatné použití klíčového slova NE v proceduře XXX
Zkontrolujte, zda před každým slovem "NE" v proceduře XXX je skutečn slovo "DOKUD", a za slovem "NE" následuje podmínka.
Špatné požití klíčového slova JINAK v proceduře XXX
Zkontrolujte, zda před každým slovem "JINAK" v proceduře XXX je podmínka, a za slovem "NE" následuje závorka "{".
Za klíčovým slovem DOKUD (resp. DOKUD NE) je očekávána podmínka v proceduře XXX
Zkontrolujte, zda za každým slovem dokud, (resp. Dokud NE) následuje podmínka.
Jako název procedury nelze použít klíčové slovo XXX
Změňte název procedury. Název procedury nesmí být klíčové slovo XXX.

Chyby, jenž vzniknou během vykonávání nějaké procedury

Omlouvám se, ale nemůžu zde položit více cihel.
Karel pokládá cihlu na pole, na které již nelze položit více cihel.
Nemohu nic vzít. Kde nic není, ani smrt nebere.
Snažíte se zvednout cihlu z pole, na kterém nic není.
Au, to bolí, narazil jsem hlavou do zdi!
Karel narazil hlavou do zdi. Tedy provedl povel "Krok" v momentě, kdy stál před zdí, a byl otočen směrem ke zdi.
Procedura XXX nemá tělo.
Někde používáte povel nazvaný XXX, který však Karel nezná.

Vtip dne: Víte co má společného jazyk Smalltalk s jazykem pro robota Karla? Oba používají pro poznámky stejný symbol.