diff --git a/ash/ash_guide.html b/ash/ash_guide.html index 3a4145d..e7858d9 100644 --- a/ash/ash_guide.html +++ b/ash/ash_guide.html @@ -9,6 +9,13 @@ + @@ -170,12 +177,16 @@

Sommaire

  • Boucle
  • -
  • Fonctions et procédures
  • - -

    Classes et objets
    -Gestion des erreurs
    -Bibliothèque standard

    -
      +
    1. Sous-programmes +
        +
      1. Fonctions
      2. +
      3. Procédures
      4. +
      5. Getters
      6. +
      +
    2. +
    3. Classes et objets
    4. +
    5. Gestion des erreurs
    6. +
    7. Bibliothèque standard
    8. + Console
      1. Fichiers
      2. @@ -211,6 +222,13 @@

        1.1 Installation

        python pipo.py

        Les arguments sont stockés dans une liste. 0 est le nom du script. En nég, les options préalables. En pos, les options du script.

        +
        Note de design +
        +

        Ces encadrés exposent des décisions de design.

        +

        La syntaxe de Ash s'inspire des langages Lua, Ruby et Pascal.
        +Les langages JavaScript et Python sont également des inspirations pour leur fonctionnement et leur bibliothèque de base.

        +
        +

        1.2 Premiers programmes

        La tradition veut qu'on affiche "Bonjour le monde !" sur la sortie standard. Pour cela, il faut lancer l'interpréteur interactif
        ash.exe
        @@ -224,7 +242,7 @@

        1.2 Premiers programmes

        fun fact(nb : int) if nb == 0 then return 1 - elif nb > 0 then + elsif nb > 0 then return nb * fact(nb - 1) else return Exception("Invalid number") @@ -234,6 +252,13 @@

        1.2 Premiers programmes

        writeln(fact(nb))

        1.3 Commentaires

        +

        Les commentaires monolignes commençent par -- (comme Lua et SQL)

        +

        Les commentaires multilignes commençent par --[[ et finissent par --]] (comme Lua)

        +
        Note de design +
        +

        Cela permet de conserver // (C, JavaScript) et # (Ruby, Python) comme opérateurs de intdiv et longueur respectivement.

        +
        +
         -- comment
         --[[ start of multi line
        @@ -243,7 +268,7 @@ 

        1.4 Mots-clés

        Ash utilise 27 mots-clés.

        - + @@ -255,19 +280,19 @@

        1.4 Mots-clés

        1.5 Constantes et variables

        Pour déclarer une variable, il faut utiliser cette syntaxe :

        -[var] ID [: TYPE] = EXPR
        +[var] ID [: TYPE] = EXPR
         

        Il est recommandé de commencer une variable par une minuscule et d'utiliser un "_" pour séparer les mots.

        -var age_personne : nat = 25
        +var age_personne : nat = 25
         

        Pour déclarer une constante de référence, il faut utiliser cette syntaxe :

        -const ID [: TYPE]  = EXPR
        +const ID [: TYPE]  = EXPR
         

        Il est recommandé de commencer une constante par une majuscule.

        -const PI : num = 3.14
        +const PI : num = 3.14
         

        nom de variable : (_A-Za-z)(0-9A-Za-z)

        _ is for dummy variable or the last expression. utf-8 variable are supported.

        @@ -286,7 +311,7 @@

        1.5 Constantes et variables

        1.6 Expressions et opérateurs

        Une expression est forcément évaluable à une valeur avec un type :

        -5 + 2
        +5 + 2
         

        Cette expression donne 7, de type nat.

        Une expression est composée d'opérateur et d'opérande.

        @@ -332,6 +357,24 @@

        2.1 Booléen

        2.2 Entier et réel

        2.3 Chaîne

        2.4 Liste

        +
        var const
        if then elif else end
        if then elsif else end
        while do loop for in
        break next
        fun pro return
        + + + + + + + + + + + + + + + + +
        Signature
        pro flatten()
        pro pop, shift() : any
        pro insert(index : int, value : any)
        pro add, append, push(value : any)
        get first : any
        get last : any
        fun find, index(value : any) : nat
        fun find_all(value : any) : [int]
        fun include?, has? contains?(value : any) : bool
        get min : any
        get max : any
        get length, count, size : nat
        pro sort()
        pro reverse()
        pro uniq()

        2.5 Dictionnaire

        3. Contrôle du flux

        3.1 Séquence

        @@ -358,69 +401,80 @@

        3.3 Boucle

        ACTION loop -for ID1[, ID2] in ITERABLE [if CONDITION] do +for ID1[, ID2] in ITERABLE [if CONDITION] do ACTION loop break next
        -

        4. Fonctions et procédures

        +

        4. Sous-programmes

        +

        4.1 Fonctions

        -fun[ction] ID (P1 [: T1], P2 [: T2]) [: TYPE]
        +fun[ction] ID (P1 [: T1], P2 [: T2]) [: TYPE]
             ACTION
        -end
        -
        -pro[cedure] ID (P1 [: T1], P2 [: T2])
        -    ACTION
        -end
        -
        -return [EXPR]
        +    return EXPR
        +end
        +
        +

        4.2 Procédures

        +
        +pro[cedure] ID (P1 [: T1], P2 [: T2])
        +    ACTION
        +    return
        +end
        +
        +

        4.3 Getters

        +

        Un getter est une fonction qui ne prend pas de paramètres. Elle sert à retourner des valeurs qui sont calculées. On évitera de mettre des calculs trop importants dans un getter.

        +
        +get ID : TYPE
        +    ACTION
        +    return EXPR
        +end
         

        5. Classes et objets

         
         class ID [< SUPER]
        -    [static const, static var, var] ID = EXPR
        -    [static] fun or pro
        +    [static const, static var, var] ID = EXPR
        +    [static] fun or pro
             pro init(@a int, b int)
        -        @b = b
        +        @b = b
             end
         end
         
        -a = ID.new(param)
        +a = ID.new(param)
         
         class Point          object (fixed fields)/obj
            x int
            y int
         end
         @attr -- instance attribute
        -$attr -- class attribute (en Ruby pour global et @@ pour class)
        -
        -if o is Class c then
        -   -- vous pouvez utiliser c dans ce bloc
        -end
        -
        -static class Order < String -- no instance <=> enum
        -    static Move = "Move"
        -    static Wait = "Wait"
        -    static Attack = "Attack"
        -    static Follow = "Follow"
        -end
        +$attr -- class attribute (en Ruby pour global et @@ pour class)
        +
        +if o is Class c then
        +   -- vous pouvez utiliser c dans ce bloc
        +end
        +
        +static class Order < String -- no instance <=> enum
        +    static Move = "Move"
        +    static Wait = "Wait"
        +    static Attack = "Attack"
        +    static Follow = "Follow"
        +end
         

        6. Gestion des erreurs

         return EXCEPTION
         
        -fun div(a : num, b : num) : num
        -    if b == 0 then
        +fun div(a : num, b : num) : num
        +    if b == 0 then
                 return DivByZeroException
             else
                 return a / b
             end
         end
         
        -div(5, 0)
        +div(5, 0)
         if DivByZeroException then
             writeln("An exception has been catched")
         end
        @@ -428,7 +482,7 @@ 

        6. Gestion des erreurs

        7. Bibliothèque standard

        -ID [module] = import (FILEPATH | ID) [ > ID1, ID2 ]
        +ID [module] = import (FILEPATH | ID) [ > ID1, ID2 ]
         
         module ID -- (en tête de fichier, pas de fin) (plutôt que package ou namespace)
         
        diff --git a/rts/rts.js b/rts/rts.js index 4b036ce..48d28f7 100644 --- a/rts/rts.js +++ b/rts/rts.js @@ -209,7 +209,7 @@ class Map { class Order { } -class Move extends Order { +class Move extends Order { constructor(row, col) { super(); this.row = row; @@ -394,7 +394,7 @@ class Group { done: false }; } else { - this.index = 0; + this.index = 0; return { done: true }; @@ -668,14 +668,12 @@ class Menu { if (!camera.selected.is_building) { ctx.drawImage(textures['Move'], this.x, this.y); ctx.drawImage(textures['Attack'], this.x + 32, this.y); - } else { - if (camera.selected.first.type == 'barrack') { + } else if (camera.selected.first.type == 'barrack') { ctx.strokeStyle = 'rgb(0, 128, 0)'; ctx.strokeRect(this.x, this.y + 32, this.width / 2, 1); ctx.drawImage(textures['CreateSoldier'], this.x, this.y + 32); ctx.drawImage(textures['CreateScout'], this.x + 32, this.y + 32); ctx.drawImage(textures['CreateBuilder'], this.x + 64, this.y + 32); - } } // Info on unit if (camera.selected.length == 1 && camera.selected.first instanceof UnitCreator) { @@ -941,7 +939,7 @@ function draw() { ctx.strokeStyle = 'rgb(255, 255, 255)'; ctx.strokeRect(Math.min(mouse_start_col - camera.col * 32, mouse_col), Math.min(mouse_start_row - camera.row * 32, mouse_row - camera.row), - Math.abs(mouse_start_col - camera.col * 32 - mouse_col), + Math.abs(mouse_start_col - camera.col * 32 - mouse_col), Math.abs(mouse_start_row - camera.row * 32 - mouse_row)); //console.log(mouse_start_col, mouse_start_row, mouse_col, mouse_row); } @@ -1149,7 +1147,7 @@ function transition_one(trow, tcol, content) { } } } - let cal = [center, 0, + let cal = [center, 0, 0, 0, 0, 0, 0, 0, 0, 0]; let O = 1; @@ -1202,4 +1200,4 @@ function make_transition(content) { } // Swap return [trans_matrix, pass_matrix]; -} \ No newline at end of file +} diff --git a/static/input/ash/ash_guide.hml b/static/input/ash/ash_guide.hml index 33835be..b0bca98 100644 --- a/static/input/ash/ash_guide.hml +++ b/static/input/ash/ash_guide.hml @@ -7,7 +7,11 @@ !require https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js §§ https://www.color-hex.com/color-palette/5452 -!css details { border: 1px solid #5bc0de; padding: 5px; cursor: pointer; margin-bottom: 0.5em; background-color: #F9F9F9;} +!css details { border: 1px solid #5bc0de; cursor: pointer; margin-bottom: 0.5em; background-color: #F9F9F9;} +!css summary { color: #F9F9F9; background-color: #5bc0de;} +!css details summary:before { content: "+"; margin-right: 6px;} +!css details[open] summary:before { content: "-"; margin-right: 6px;} +!css details div { padding: 5px; } !var DEFAULT_CODE=ash @@ -111,10 +115,12 @@ ash.ex -i pipo.ash Les arguments sont stockés dans une liste. 0 est le nom du script. En nég, les options préalables. En pos, les options du script. <> +{{begin}} ''Ces encadrés exposent des décisions de design.'' La syntaxe de Ash s'inspire des langages ''Lua'', ''Ruby'' et ''Pascal''. Les langages ''JavaScript'' et ''Python'' sont également des inspirations pour leur fonctionnement et leur bibliothèque de base. +{{end}} <> ### 1.2 Premiers programmes @@ -149,7 +155,9 @@ Les commentaires monolignes commençent par @@--@@ (comme Lua et SQL) Les commentaires multilignes commençent par @@--[[@@ et finissent par @@--]]@@ (comme Lua) <> +{{begin}} Cela permet de conserver @@//@@ (C, JavaScript) et @@#@@ (Ruby, Python) comme opérateurs de intdiv et longueur respectivement. +{{end}} <> @@@text