En Javascript hay un patrón llamado patrón ruso de muñeca (esto también se puede llamar 'disparo único'). Básicamente, es una función que se reemplaza por otra en algún momento.¿Cómo implementar el patrón de muñeca rusa en Ocaml?
ejemplo simple:
var func = function(){
func = function(){ console.log("subsequent calls call this...");};
console.log("first call");
}
Así que la primera vez que llame func que va de salida "primera llamada" y el siguiente (y los tiempos posteriores) es de impresión "llamadas posteriores llaman a esto ...". (Esto también sería fácil de hacer en Scheme, por ejemplo)
He estado desconcertando sobre cómo hacer esto en Ocaml?
Editar: Una solución que he llegado con:
let rec func = ref(fun() -> func := (fun() -> Printf.printf("subsequent..\n"));Printf.printf("First..\n"));;
llama como: func() ;;
Curiosamente, si no incluyo el 'rec' en la definición, nunca llama a la función siguiente ... Siempre imprime 'Primero ...'.
Eso es ... simplemente incorrecto. – phooji
tenga en cuenta que las soluciones OCaml propuestas a continuación son todas "más claras" que su ejemplo JavaScript, ya que encapsulan la mutabilidad de "func": después de la primera llamada, la función se cambia para siempre y nadie tiene acceso a una referencia para cambiarla espalda. Esto se hace haciendo que la referencia "f" sea local a la llamada "muñeca". Por supuesto, si desea que la referencia esté disponible para su modificación, también sería posible. – gasche