LINUX.ORG.RU

История изменений

Исправление MOPKOBKA, (текущая версия) :

Если представить ADT по наиболее краткой модели для C/C++ в виде struct { enum; union; }, то вот такое условие с одним OR

match ast_node with
| Ast.AddOp (Ast.Num x, Ast.IncOp (Ast.Var name))
| Ast.AddOp (Ast.IncOp (Ast.Var name), Ast.Num x) when x > 10 -> 
  ... code ...
Наивно можно развернуть вот в это:
bool if_true = false;
std::string name;
int x;

if (ast_node.kind == Ast::ADD_OP) {
  if (ast_node.add_op.left.kind == Ast::NUM) {
    if (ast_node.add_op.right.kind == Ast::INC_OP) {
      if (ast_node.add_op.right.inc_op.value.kind == Ast::VAR) {
        x = ast_node.add_op.left.num.value;
        name = ast_node.add_op.right.inc_op.value.var.name;
        if_true = true; 
      }
    }
  }
}

if (ast_node.kind == Ast::ADD_OP) {
  if (ast_node.add_op.right.kind == Ast::NUM) {
    if (ast_node.add_op.left.kind == Ast::INC_OP) {
      if (ast_node.add_op.left.inc_op.value.kind == Ast::VAR) {
        x = ast_node.add_op.right.num.value;
        name = ast_node.add_op.left.inc_op.value.var.name;
        if_true = true; 
      }
    }
  }
}

if (if_true && x > 10) {
 ... code ...
}
Может можно проще развернуть, но это уже дополнительные мыслительные процессы. Какой то более сложный матчинг разворачивать мне лень для демонстрации, но уже в этом примере можно понять что это не будет развесисто.

Исправление MOPKOBKA, :

Если представить ADT по наиболее краткой модели для C/C++ в виде struct { enum; union; }, то вот такое условие с одним OR

match ast_node with
| Ast.AddOp (Ast.Num x, Ast.IncOp (Ast.Var name))
| Ast.AddOp (Ast.IncOp (Ast.Var name), Ast.Num x) when x > 10 -> 
  ... code ...
Наивно можно развернуть вот в это:
bool if_true = false;
std::string name;
int x;

if (ast_node.kind == Ast::ADD_OP) {
  if (ast_node.add_op.left.kind == Ast::NUM) {
    if (ast_node.add_op.right.kind == Ast::INC_OP) {
      if (ast_node.add_op.right.inc_op.value.kind == Ast::VAR) {
        x = ast_node.add_op.left.num.value;
        name = ast_node.add_op.right.inc_op.value.var.name;
        if_true = true; 
      }
    }
  }
}

if (ast_node.kind == Ast::ADD_OP) {
  if (ast_node.add_op.right.kind == Ast::NUM) {
    if (ast_node.add_op.left.kind == Ast::INC_OP) {
      if (ast_node.add_op.left.inc_op.value.kind == Ast::VAR) {
        x = ast_node.add_op.right.num.value;
        name = ast_node.add_op.left.inc_op.value.var.name;
        if_true = true; 
      }
    }
  }
}

if (if_true && x > 10) {
 ... code ...
}
Может можно проще развернуть, но это уже дополнительные мыслительные процессы.

Исходная версия MOPKOBKA, :

Если представить ADT по наиболее краткой модели для C/C++ в виде struct { enum; union; }, то вот такое условие с одним OR

match ast_node with
| Ast.AddOp (Ast.Num x, Ast.IncOp (Ast.Var name))
| Ast.AddOp (Ast.IncOp (Ast.Var name), Ast.Num x) when x > 10 -> 
  ... code ...
Наивно можно развернуть вот в это:
bool if_true = false;
std::string name;
int x;

if (ast_node.kind == Ast::ADD_OP) {
  if (ast_node.add_op.left.kind == Ast::NUM) {
    if (ast_node.add_op.right.kind == Ast::INC_OP) {
      if (ast_node.add_op.right.inc_op.value.kind == Ast::VAR) {
        x = ast_node.add_op.left.num.value;
        name = ast_node.add_op.right.inc_op.value.var.name;
        if_true = true; 
      }
    }
  }
}

if (ast_node.kind == Ast::ADD_OP) {
  if (ast_node.add_op.right.kind == Ast::NUM) {
    if (ast_node.add_op.left.kind == Ast::INC_OP) {
      if (ast_node.add_op.left.inc_op.value.kind == Ast::VAR) {
        x = ast_node.add_op.right.num.value;
        name = ast_node.add_op.left.inc_op.value.var.name;
        if_true = true; 
      }
    }
  }
}

if (if_true) {
 ... code ...
}
Может можно проще развернуть, но это уже дополнительные мыслительные процессы.