begin process at 2012 02 14 10:34:04
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Trucs Amusants

 > LIST.ML D'OCAML EN JAVASCRIPT

LIST.ML D'OCAML EN JAVASCRIPT


 Information sur la source

Note :
Aucune note
Catégorie :Trucs Amusants Classé sous :ocaml, fonctionnel, paradigme, list, type Niveau :Initié Date de création :22/03/2008 Date de mise à jour :22/03/2008 18:23:47 Vu :3 992

Auteur : coucou747

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note


 Description

J'ai recode une partie de List.ml d'ocaml, de la facon dont ces fonctions sont codees en ocaml, histoire de montrer qu'on pouvait coder fonctionnel en javascript.

les alert que j'ai mis en commentaires servent a tester ces fonctions. idem pour les deux lignes suivantes
var a = List.coller (0) (List.coller (4) (List.coller (2) (List.coller (5) (List.coller (6) (List.coller (1) (List.coller (-7) (List.coller (9) (List.Vide))))))));
var b=List.coller (1) (List.coller (3)(List.Vide));

c'est evidement une tres mauvaise idee d'utiliser ca dans un programme ensuite, car ca "risque" d'etre un peu lent... Ouais, recoder une liste chaineee en javascript, c'est pas une bonne idee...

Ce qu'il manque a javascript :
separer la notion de valeur de la notion de variable (pouvoir faire un let fonctionnel et pas une affectation imperative)
les types algebriques

Source

  • <html>
  • <head>
  • <title>javascript : du fonctionnel ocaml like</title>
  • </head>
  • <body>
  • <script type="text/javascript">
  • //curry
  • function add (x){ return function(y){return x+y;}}
  • //document.write(add(4)(5));
  • function compose (func){
  • return function (g){ return function (x){ return f(g(x));; } }
  • }
  • //function f(x){return x*x;}
  • //function g(x){return x+1;}
  • //document.write(compose(f)(g)(1));
  • function raise(a, li){
  • alert("raise : "+a+li);
  • }
  • var List={};
  • List.Vide = {vide:1}
  • List.hd=function (li){
  • if (List.Vide==li){
  • raise('List.hd', li);
  • }else{
  • return li.hd;
  • }
  • };
  • List.tl=function (li){
  • if (List.Vide==li){
  • raise('List.tl', li);
  • }else{
  • return li.tl;
  • }
  • };
  • List.coller=function (e){
  • return function (li){
  • var a={};
  • a.hd=e;
  • a.tl=li;
  • return a;
  • }
  • }
  • List.toString=function(li){
  • if (List.Vide==li){
  • return "";
  • }else {
  • var hd = List.hd(li);
  • var tl = List.tl(li);
  • if (tl==List.Vide){
  • return hd;
  • }else{
  • return hd+", "+List.toString(tl);
  • }
  • }
  • }
  • //controle des effets de bords
  • //var a=List.Vide;
  • //var b=List.coller (0) (List.coller (1) (List.coller (2) (a)));
  • //alert(List.hd( List.tl(b)));
  • //alert(List.hd(a)) // doit renvoyer wtf
  • var a = List.coller (0) (List.coller (4) (List.coller (2) (List.coller (5) (List.coller (6) (List.coller (1) (List.coller (-7) (List.coller (9) (List.Vide))))))));
  • var b=List.coller (1) (List.coller (3)(List.Vide));
  • List.len=function (li){
  • if (li==List.Vide){
  • return 0;
  • }else{
  • return 1+ List.len ( List.tl(li) );
  • }
  • }
  • List.rev = function (li){
  • var f = function (acc, li){
  • if (li==List.Vide)
  • return acc;
  • else
  • return f (
  • List.coller(List.hd(li))(acc),
  • List.tl(li)
  • );
  • }
  • return f (List.Vide, li);
  • }
  • //alert(List.toString(a));
  • //alert(List.toString(List.rev(a)));
  • //alert(List.len (a) );
  • List.map = function (fonction) {
  • return function (li){
  • if (li==List.Vide)
  • return List.Vide;
  • else
  • return List.coller
  • (fonction(List.hd(li)))
  • (List.map (fonction)(List.tl(li)));
  • }
  • }
  • /*
  • En ocaml, on a le tail rec qui nous permet d'ecrire rev_map de facon plus optimisee que map, en js, c'est pas forcement le cas
  • (par optimisee, j'entends : suppression de la recursivite lors de l'execution)
  • */
  • List.rev_map = function (fonction) {
  • return function (li){
  • var f = function (acc, li){
  • if (li==List.Vide)
  • return acc;
  • else
  • return f (List.coller(fonction(List.hd(li)))(acc),List.tl(li));
  • }
  • return f (List.Vide, li);
  • }
  • }
  • List.filter = function (fonction) {
  • return function (li){
  • if (li==List.Vide)
  • return List.Vide;
  • else{
  • var hd=List.hd(li);
  • if (fonction(hd))
  • return List.coller
  • (hd)
  • (List.filter (fonction) (List.tl(li)));
  • else
  • return List.filter (fonction) (List.tl(li));
  • }
  • }
  • }
  • //alert(List.toString(List.filter (function(x){return x%2==0;}) (a) ));
  • List.rev_append = function (liste1) {
  • return function (liste2){
  • if (liste1==List.Vide){
  • return liste2;
  • }else{
  • var hd=List.hd(liste1);
  • var tl=List.tl(liste1);
  • return List.rev_append
  • (tl)
  • (List.coller
  • (hd)
  • (liste2)
  • );
  • }
  • }
  • }
  • List.append = function (liste1) {
  • return function (liste2){
  • if (liste1==List.Vide){
  • return liste2;
  • }else{
  • return List.coller
  • (List.hd(liste1))
  • (List.append
  • (List.tl(liste1))
  • (liste2)
  • );
  • }
  • }
  • }
  • //alert( List.toString (List.rev_append(a)(b)) );
  • </script>
  • </body>
  • </html>
<html>
<head>
	<title>javascript : du fonctionnel ocaml like</title>
</head>
<body>

<script type="text/javascript">

//curry
function add (x){ return function(y){return x+y;}}
//document.write(add(4)(5));
function compose (func){
	return function (g){ return function (x){ return f(g(x));; } }
}
//function f(x){return x*x;}
//function g(x){return x+1;}
//document.write(compose(f)(g)(1));

function raise(a, li){
	alert("raise : "+a+li);
}

var List={};
List.Vide = {vide:1}
List.hd=function (li){
	if (List.Vide==li){
		raise('List.hd', li);
	}else{
		return li.hd;
	}
};
List.tl=function (li){
	if (List.Vide==li){
		raise('List.tl', li);
	}else{
		return li.tl;
	}
};
List.coller=function (e){
	return function (li){
		var a={};
		a.hd=e;
		a.tl=li;
		return a;
	}
}
List.toString=function(li){
	if (List.Vide==li){
		return "";
	}else {
		var hd = List.hd(li);
		var tl = List.tl(li);
		if (tl==List.Vide){
			return hd;
		}else{
			return hd+", "+List.toString(tl);
		}
	}
}
//controle des effets de bords
//var a=List.Vide;
//var b=List.coller (0) (List.coller (1) (List.coller (2) (a)));
//alert(List.hd(  List.tl(b)));
//alert(List.hd(a)) // doit renvoyer wtf

var a = List.coller (0) (List.coller (4) (List.coller (2) (List.coller (5) (List.coller (6) (List.coller (1) (List.coller (-7) (List.coller (9) (List.Vide))))))));

var b=List.coller (1) (List.coller (3)(List.Vide));

List.len=function (li){
	if (li==List.Vide){
		return 0;
	}else{
		return 1+ List.len (  List.tl(li)  );
	}
}

List.rev = function (li){
	var f = function (acc, li){
		if (li==List.Vide)
			return acc;
		else
			return f (
				List.coller(List.hd(li))(acc),
				List.tl(li)
			);
	}
	return f (List.Vide, li);
}

//alert(List.toString(a));
//alert(List.toString(List.rev(a)));
//alert(List.len (a) );

List.map = function (fonction) {
	return function (li){
		if (li==List.Vide)
			return List.Vide;
		else
			return List.coller
				(fonction(List.hd(li)))
				(List.map (fonction)(List.tl(li)));
	}
}
/*
En ocaml, on a le tail rec qui nous permet d'ecrire rev_map de facon plus optimisee que map, en js, c'est pas forcement le cas

(par optimisee, j'entends : suppression de la recursivite lors de l'execution)
*/
List.rev_map = function (fonction) {
	return function (li){
		var f = function (acc, li){
			if (li==List.Vide)
				return acc;
			else
				return f (List.coller(fonction(List.hd(li)))(acc),List.tl(li));
		}
		return f (List.Vide, li);
	}
}


List.filter = function (fonction) {
	return function (li){
		if (li==List.Vide)
			return List.Vide;
		else{
			var hd=List.hd(li);
			if (fonction(hd))
				return List.coller
				(hd)
				(List.filter (fonction) (List.tl(li)));
			else
				return List.filter (fonction) (List.tl(li));
		}
	}
}
//alert(List.toString(List.filter (function(x){return x%2==0;}) (a) ));

List.rev_append = function (liste1) {
	return function (liste2){
		if (liste1==List.Vide){
			return liste2;
		}else{
			var hd=List.hd(liste1);
			var tl=List.tl(liste1);
			return List.rev_append
			(tl)
			(List.coller
				(hd)
				(liste2)
			);
		}
	}
}

List.append = function (liste1) {
	return function (liste2){
		if (liste1==List.Vide){
			return liste2;
		}else{
			return List.coller
				(List.hd(liste1))
				(List.append
					(List.tl(liste1))
					(liste2)
				);
		}
	}
}

//alert( List.toString (List.rev_append(a)(b)) );



</script>
</body>
</html>



 Historique

22 mars 2008 18:23:47 :
ajout des mots clefs

 Sources du même auteur

NOTATION CLASSIQUE VERS NOTATION NPI
Source avec Zip Source avec une capture UN CHRONOMETRE EN SVG+JAVASCRIPT
Source avec Zip Source avec une capture WYSIWYG TOTALEMENT OO
Source avec Zip Source avec une capture DU DOM EN SVG : UNE HORLOGE ANALOGIQUE
Source avec Zip TRI DE TABLEAUX HTML

 Sources de la même categorie

Source avec Zip IMAGES DÉFILANT SUR UN CYLINDRE (SCROLLING IMAGES) par william voirol
Source avec Zip IMAGES DÉFILANT VERTICALEMENT (SCROLLING IMAGES) par william voirol
Source avec Zip IMAGES DANSANTES 4: MOUVEMENT DE LA TORTUE par william voirol
Source avec Zip IMAGES DANSANTES 3: MOUVEMENT ALÉATOIRE ORIENTÉ par william voirol
Source avec Zip IMAGES DANSANTES 2: MOUVEMENT ALÉATOIRE SANS SUPERPOSITIONS par william voirol

Commentaires et avis

Aucun commentaire pour le moment.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Faire deux textbox permettant la saisie d'1 pseudo et d'1 mot de passe et accéder à une page du type www.monnomdedomaine.com/monpseudo_et_monmotdepasse.html [ par Nicolas RUIZ ] Slu !Je cherche un moyen de faire saisir à un visiteur un pseudo et un mot de passe et le faire atterrir sur une page de type www.monnomdedomaine.com/ Mailing List [ par Myles ] J'aimerais savoir comment on fait un mailing list, pour ne pas que toute les adresse Email soit visible pour ceux qui recoive le message? Est-ce que q test [ par alcatraz ] Bonjour a tous,petite question au sujet du javascript.J'ai un formulaire de saisie de données avec plusieurs champs du type textarea.Je voudrais teste Faire apparaitre une fenetre type Alert [ par jcharles ] Voici mon code actuel&lt;SCRIPT language=Javascript&gt;alert ('coucou les amis')&lt;/SCRIPT&gt;&lt;%response.redirect("default.asp")%&gt;le probleme c le type "select" devient un "text" [ par enis ] J'ai une liste déroulante contenant différents métier : &lt;SELECT name="Profession"&gt;&lt;option&gt;----------&lt;/option&gt; &lt;option value= type=hidden et type=text [ par lolo4492 ] SalutJe souhaite changer un input de type hidden en input de type text.J'ai essayé document.monform.moninput.type="text";mais j'ai eu une erreur : "I Formulaire : changer le type d'élémént en fonction d'une valeur ... [ par Dexterin ] Bonjour, je suis un débutant (très débutant) ... merci de votre évenuelle aide...J'ai le script suivant :function Choix(fiche) { i = document.fiche.c Formulaire : changer le type d'élémént en fonction d'une valeur ... [ par Dexterin ] Bonjour, je suis un débutant (très débutant) ... merci de votre évenuelle aide...J'ai le script suivant :function Choix(fiche) { i = document.fiche.c Ajouter un élément à une Drop-Down list [ par bob ] Je ne sais pas comment ajouter un élément à une drop-down list pendant que la page est en cour.Est-ce que quelqu'un pourrait m'aider.Merci Comment ajouter un élément à une drop-down list. [ par bob ] Je ne sais pas comment ajouter un élément à une drop-down list pendant que la page est en cours.Est-ce que quelqu'un pourrait m'aider S.V.P. ?Merci


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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,515 sec (4)

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