[SPIP Zone] suite de memoization

J'ai des doutes, j'ai des affres, sur la suite à donner aux fonctions
de mémoïzation (http://zzz.rezo.net/Memoization.html) ; trois
prototypes sont possibles, chacun avec un usage différent, mais je
n'arrive pas à trouver une forme qui regroupe les trois ; je soumets
donc les possibilités à votre sagacité collective :slight_smile:

Option 1

// $r = memoize('recuperer_page', $url);
// problème : où met-on le ttl ?
function memoize($func, $arg1, $arg2...) {

  cache_get()

  $res = apply($func, $arg...);

  cache_set($res);
  return $res;
}

Option 2

#TRUC|fonction{arg, arg}
=>
#TRUC|memoize{fonction, arg, arg}

Option 3

// memoize('fonction("A", 1)', 3600)
function memoize($eval, $ttl) {
  cache_get()
  => eval ('fonction("A", 1)')
  cache_set()
  return
}

-- Fil

J'aime pas l'option 3 basée sur une chaine et un eval (qui en plus est lent).
Option 1 et 2 me semblent deux usages de la même syntaxe, non ?

Il manque la variante qui permet facilement le ttl :

memoize($fonction, $args, $ttl=3600)
ou $args est un array

l'option 2 pouvant alors être implémentée par un

filtre_memoize($fonction){
$args = func_get_args();
array_shift($args);
return memoize($fonction,$args);
}

Cédric

Le 31 oct. 2009 à 10:00, Fil a écrit :

J'ai des doutes, j'ai des affres, sur la suite à donner aux fonctions
de mémoïzation (Mémoïzation - ZZZ) ; trois
prototypes sont possibles, chacun avec un usage différent, mais je
n'arrive pas à trouver une forme qui regroupe les trois ; je soumets
donc les possibilités à votre sagacité collective :slight_smile:

Option 1

// $r = memoize('recuperer_page', $url);
// problème : où met-on le ttl ?
function memoize($func, $arg1, $arg2...) {

  cache_get()

  $res = apply($func, $arg...);

  cache_set($res);
  return $res;
}

Option 2

#TRUC|fonction{arg, arg}
=>
#TRUC|memoize{fonction, arg, arg}

Option 3

// memoize('fonction("A", 1)', 3600)
function memoize($eval, $ttl) {
  cache_get()
  => eval ('fonction("A", 1)')
  cache_set()
  return
}

-- Fil
_______________________________________________
spip-zone@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone

Le 31/10/2009 10:00, Fil a écrit :

J'ai des doutes, j'ai des affres, sur la suite à donner aux fonctions
de mémoïzation

Option 1

// $r = memoize('recuperer_page', $url);
// problème : où met-on le ttl ?
function memoize($func, $arg1, $arg2...) {

Option 2

#TRUC|fonction{arg, arg}
=>
#TRUC|memoize{fonction, arg, arg}

Entre l'option 1 et 2 il suffit simplement de créer 2 fonctions :
memoize($func, $arg1, $arg2) et
filtre_memoize($arg1, $func, $arg2) {return memoize($func, $arg1, $arg2); }

Mais c'est délicat de passer le ttl effectivement dans les 2 cas.

--
MM.

Le 31/10/2009 10:30, cedric.morin@yterium.com a écrit :

l'option 2 pouvant alors être implémentée par un

filtre_memoize($fonction){
$args = func_get_args();
array_shift($args);
return memoize($fonction,$args);
}

Ou par ?

filtre_memoize($fonction){
  $args = func_get_args(); // arg1, func, argx...
  $arg1 = array_shift($args);
  array_shift($args);
  array_unshift($args, $arg1);
  return memoize($fonction,$args);
}

--
MM.

Le 31 oct. 2009 à 11:49, Matthieu Marcillaud a écrit :

Le 31/10/2009 10:30, cedric.morin@yterium.com a écrit :

l'option 2 pouvant alors être implémentée par un

filtre_memoize($fonction){
$args = func_get_args();
array_shift($args);
return memoize($fonction,$args);
}

Ou par ?

filtre_memoize($fonction){
  $args = func_get_args(); // arg1, func, argx...
  $arg1 = array_shift($args);
  array_shift($args);
  array_unshift($args, $arg1);
  return memoize($fonction,$args);
}

Oui :stuck_out_tongue:
Je vois que tu suis :wink:

Cédric

Oui pour modifier l'option 1 avec tous les arguments dans un array --
ça permet de fixer l'argument suivant comme étant le ttl, et ça reste
relativement lisible ; mais pour le filtre, ce serait super
malpratique de devoir créer un #ARRAY ... ou alors on élimine le ttl
du filtre, et on crée un filtre_memoize_ttl avec un argument de plus
... D'un autre côté, avec une gestion d'invalideurs (pour oublier), on
se moque un peu du ttl, qui peut être infini. Pour l'implémentation
précise, il faut donc discuter ce qu'on veut proposer par défaut comme
invalideur.

-- Fil