Názor k článku Operátory v programovacím jazyku OCaml od radekm - Řekl bych, že když se to používá s...

  • Článek je starý, nové názory již nelze přidávat.
  • 20. 10. 2023 16:55

    radekm
    Stříbrný podporovatel

    Řekl bych, že když se to používá s mírou, tak to může zlepšit čitelnost.

    Třeba operátory @@, >>=, |>.

    Pak je otázkou, zda to některé knihovny trošku nepřehánějí. Třeba v F# je knihovna Farkle pro parsování, kde gramatiky lze psát

    let expression =
        let NEG = obj()
    
        let expression = nonterminal "Expression"
        expression.SetProductions(
            !@ number |> asIs,
            !@ expression .>> "+" .>>. expression => (fun x1 x2 -> x1 + x2),
            !@ expression .>> "-" .>>. expression => (fun x1 x2 -> x1 - x2),
            !@ expression .>> "*" .>>. expression => (fun x1 x2 -> x1 * x2),
            !@ expression .>> "/" .>>. expression => (fun x1 x2 -> x1 / x2),
            !& "-" .>>. expression |> prec NEG => (fun x -> -x),
            !@ expression .>> "^" .>>. expression => (fun x1 x2 -> Math.Pow(x1, x2)),
            // We use |> asIs instead of => (fun x -> x).
            !& "(" .>>. expression .>> ")" |> asIs
        )
    
        let opScope =
            OperatorScope(
                LeftAssociative("+", "-"),
                LeftAssociative("*", "/"),
                PrecedenceOnly(NEG),
                RightAssociative("^")
            )
    
        DesigntimeFarkle.withOperatorScope opScope expression

    Cílem je, aby se to podobalo následujícímu zápisu z Bisonu:

    %left '-' '+'
    %left '*' '/'
    %precedence NEG
    %right '^'
    
    exp:
        NUM
        | exp '+' exp        { $$ = $1 + $3;      }
        | exp '-' exp        { $$ = $1 - $3;      }
        | exp '*' exp        { $$ = $1 * $3;      }
        | exp '/' exp        { $$ = $1 / $3;      }
        | '-' exp  %prec NEG { $$ = -$2;          }
        | exp '^' exp        { $$ = pow ($1, $3); }
        | '(' exp ')'        { $$ = $2;           }
    ;