{X con valor} en ocaml


Vi la siguiente llamada a la función en Yacfe ejemplo :

  Visitor_c.vk_program { Visitor_c.default_visitor_c with
    Visitor_c.kexpr = (fun (k, bigf) exp -> 
      match Ast_c.unwrap_expr exp with
      | Binary(e1, Logical (Eq), (((Constant(Int("0")) as _e2),_t),ii)) -> 

          (match Ast_c.get_onlytype_expr e1 with 
          | Some (qu, (Pointer _,_ii)) -> 

              let idzero = Common.tuple_of_list1 ii in
              idzero.cocci_tag := 
                Ast_cocci.MINUS (Ast_cocci.NoPos, [[null_addon]]), [];

          | _ -> k exp
          )
      | _ -> k exp
    );
  } ast;

Puedo ver una llamada a una función con el registro inicializado como primer argumento, y ast como segundo argumento.

Lo que no estoy familiarizado con es la sintaxis de la forma:

{Visitor_c.default_visitor_c with Visitor_c.kexpr = some_value;}

¿Qué significa esto? Sé que un registro puede ser inicializado como {name=value;name=value;...}, pero no estoy familiarizado con el {X with name=value}, ¿puedes decirme qué significa?

No puedo encontrar en el Manual de Ocaml nada sobre el registro legal inicialización de valores distintos de los siguientes:

6.2.3 Registros

Los valores de registro se etiquetan como tuplas de valor. El valor del registro escrito { field1 = v1; field; fieldn = vn } asocia el valor vi al registro campo fieldi, para i = 1 n n. El apoyo a la aplicación actual registros con hasta 222-1 campos (4194303 fields).

Estaré encantado si en su respuesta incluye una referencia a la sección relevante en el manual de OCaml.

 25
Author: GEOCHET, 2009-05-31

2 answers

Esto a veces se llama una "actualización de registro" o "actualización funcional" o algo así. Se evalúa a un nuevo registro del mismo tipo que X, y cuyos campos se inicializan a los mismos que los de X, excepto los que se enumeran después de la "con", que se inicializan a los valores dados.

Es útil para registros inmutables, como una forma conveniente de tomar dicho registro y cambiar una o dos cosas en él (que en un lenguaje imperativo normalmente mutaría el campos), sin tener que enumerar todos los campos que no se cambian.

Se describe en el manual OCaml sección 6.7.3, desplácese hacia abajo hasta "Registros", segundo párrafo.

Para aquellos que están familiarizados con Haskell, la sintaxis OCaml

{ expr with field1 = expr1 ; ... ;  fieldn = exprn }

Es lo mismo que la sintaxis de Haskell

expr { field1 = expr1 , ... ,  fieldn = exprn }
 35
Author: newacct,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-31 07:38:16

Para corregir la respuesta anterior, el nuevo registro no siempre es del mismo tipo que el registro anterior. Por ejemplo, puedes tener algo así:

type 'a t = {
  id : int;
  value : 'a;
}
let old_t = { id = 3; value = "foo" }
let new_t = { old_t with value = 3 }

Como resultado, old_t es de tipo string t, mientras que new_t es de tipo int t.

 15
Author: Fabrice Le Fessant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-16 20:57:19