begin process at 2012 05 27 19:48:40
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > CURRYFICATION DE FONCTIONS

CURRYFICATION DE FONCTIONS


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :curryfication, currying, class Niveau :Expert Date de création :31/10/2011 Vu :1 517

Auteur : TychoBrahe

Ecrire un message privé
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 Description

Nostalgiques du Caml ou d'un autre langage permettant de curryfier les fonctions ? Ne pleurez plus, voici une class PHP vous permettant de le faire !

<?php

require 'Curry.php';

$func = function($x, $y, $z) {
  return $x * ($y + $z);
};

$b = new Curry($func, 2, 3);
var_dump($b(0), $b(1), $b(5));
/*
* int(6)
* int(8)
* int(16)
*/

$b = new Curry('strcmp', 'titi');
var_dump($b('toto'));
/*
* int(-1)
*/

?>

Source

  • <?php
  • // Copyright (c) 2011 Rodolphe Breard
  • //
  • // Permission to use, copy, modify, and/or distribute this software for any
  • // purpose with or without fee is hereby granted, provided that the above
  • // copyright notice and this permission notice appear in all copies.
  • //
  • // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  • // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  • // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  • // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  • // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  • // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  • // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  • //
  • class Curry
  • {
  • protected $nb_params;
  • protected $new;
  • public function __construct($func)
  • {
  • if (!is_callable($func))
  • throw new BadMethodCallException('Curry::__construct(): invalid callback');
  • $args = func_get_args();
  • unset($args[0]);
  • $nb_args = sizeof($args);
  • if (!($func instanceof Curry))
  • {
  • $r = new ReflectionFunction($func);
  • $this->nb_params = $r->getNumberOfRequiredParameters() - $nb_args;
  • }
  • else
  • $this->nb_params = $func->getNbParams() - $nb_args;
  • $p_lst = array();
  • for ($i = 0; $i < $this->nb_params; $i++)
  • $p_lst[] = '$p' . $i;
  • $a_lst = array();
  • for ($i = 0; $i < $nb_args; $i++)
  • $a_lst[] = '$args[' . ($i + 1) . ']';
  • $a_lst = array_merge($a_lst, $p_lst);
  • eval('$this->new = function(' . implode(',', $p_lst) . ') use($func, $args) { return $func(' . implode(',', $a_lst) . '); };');
  • }
  • public function __invoke()
  • {
  • return call_user_func_array($this->new, func_get_args());
  • }
  • public function getNbParams()
  • {
  • return $this->nb_params;
  • }
  • }
  • ?>
<?php
// Copyright (c) 2011 Rodolphe Breard
// 
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
// 
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
//

class Curry
{
  protected $nb_params;
  protected $new;

  public function __construct($func)
  {
    if (!is_callable($func))
      throw new BadMethodCallException('Curry::__construct(): invalid callback');

    $args = func_get_args();
    unset($args[0]);
    $nb_args = sizeof($args);

    if (!($func instanceof Curry))
      {
	$r = new ReflectionFunction($func);
	$this->nb_params = $r->getNumberOfRequiredParameters() - $nb_args;
      }
    else
      $this->nb_params = $func->getNbParams() - $nb_args;

    $p_lst = array();
    for ($i = 0; $i < $this->nb_params; $i++)
      $p_lst[] = '$p' . $i;

    $a_lst = array();
    for ($i = 0; $i < $nb_args; $i++)
      $a_lst[] = '$args[' . ($i + 1) . ']';
    $a_lst = array_merge($a_lst, $p_lst);

    eval('$this->new = function(' . implode(',', $p_lst) . ') use($func, $args) { return $func(' . implode(',', $a_lst) . '); };');
  }

  public function __invoke()
  {
    return call_user_func_array($this->new, func_get_args());
  }

  public function getNbParams()
  {
    return $this->nb_params;
  }
}

?>



 Sources du même auteur

CLASSE DE CHIFFREMENT DE DONNÉS AVEC MCRYPT
DÉTECTEUR DE VULNERABILITY SCANNER
Source avec Zip GÉNÉRATEUR DE MAKEFILE

 Sources de la même categorie

Source avec Zip GÉNÉRATION AUTOMATIQUE DE FICHIER .CLASS.PHP EN FONCTION D'U... par ig3
CLASSE D'OBJET DE CRYPTAGE ET DÉCRYPTAGE DE CHAINES DE CARAC... par 8Tnerolf8
Source avec Zip MY.DEVIANTART API par inwebo
CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter

 Sources en rapport avec celle ci

REDIMENSIONNEMENT D'IMAGE PHP par JStevens
Source avec Zip MY.DEVIANTART API par inwebo
Source avec Zip CLASS SIMPLE CBASEDONNEE par smag42
Source avec Zip CLASS MYSQL 5/PHP5 AVEC GESTION DES EXCEPTION ET DES REQUÊTE... par devil_may_cry
CLASS GALERIE PHOTO par Xiryl

Commentaires et avis

Commentaire de phpAnonyme le 31/10/2011 20:24:05 10/10

Très bien réalisé ! Rien à redire.

Commentaire de coucou747 le 02/11/2011 10:37:28 administrateur CS 10/10

c'est drole comme pratique :) php se raproche de plus en plus de ruby, même si on est encore loin d'avoir un langage aussi souple et cohérent que ruby. Ta classe montre bien un aspect fonctionnel, et c'est plutot cool.

Je tiens quand même à préciser que ce n'est pas vraiment une curification, c'est plus une création de clotures.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

class,PDF,XLS et boucles..... [ par booth ] bonjour!j'ai un méga problème...je dois générer un PDF et une grillle excel toutes deux issues d'un moteur de recherche...pour le moteur de recherche Retouches sur un scripts [ par apz ] salut,ce script php, un guestbook, est le livre d'or que je cherchais.mais voila il se base sur les Class, que je ne connais pas desormais.alors je vo fatal error sur chargement de class [ par fabrice_pi ] salut à tous,j'utilise une classe PHP pour faire mes taleaux en html. depuis peu j'ai l'erreur suivante :Fatal error: Cannot instantiate non-existent Class POO retourné le nom de l'objet [ par MeTh ] Bonjour,Comment retourné le nom de l'objet déclaré?exemple :$monobjet = new GridR();comment recuperé $monobjet dans ma class?Merci Include, class et array [ par Hades5k ] Bonjour! J'ai un petit problème à utiliser un array dans un fichier que j'inclus... voici un peu le code : &lt;?php $classNames = array(); include_onc Problem d'affichage de resultat de requete sous forme de tableau [ par jbcaiz ] explication : je fais un requete de recherche dans ma base, qui doit normalement me sortir plusieur résultat.je veux que ces résultat s'affiche dans u Serveur SMTP [ par Marion0904 ] Bonsoir, J'essai d'nvoyer des mails en utilisant la class phpmailer (disponible sur&nbsp; http://phpmailer.sourceforge.net/). J'incu la class php mail templates avec poo [ par lesnes ] bonjours je reprogramme totalement mon site en poo et je souhaiterai utiliser les templates mais l'on ne peut pas faire appel a une class exterieur a Affichage page par page [ par Leneuf8000 ] Bonjour, j'aimerai r&#233;aliser un affichage page par page. En fait je voudrai que tout soit g&#233;rer dans le m&#234;me fichier.&nbsp; Ainsi pour l Erreur de syntaxe [ par Leneuf8000 ] Bonjour everybody, la, j'ai un probl&#232;me de syntaxe, je ne comprends pas !!! Voici la requ&#234;te qui pose probl&#232;me : &nbsp;&nbsp;&nbsp; &n


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,764 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales