# Coder dans plusieurs langages

**URL:** <https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239>\
**Category:** Programmation\
**Created:** [Février 20, 2016, 9:00 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239 "2016-02-20T21:00:57Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Ashgenesis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/57b2e6/32.png) [@Ashgenesis](https://www.debian-fr.org/u/Ashgenesis)\
**Post date:** [Février 20, 2016, 9:00 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/1 "2016-02-20T21:00:57Z")

</div>

Bonjour,

Je viens de m’apercevoir d’un post donnant une solution dans plusieurs langages différents, et je vous propose de faire la même chose mais de manière ludique. C’est à dire de proposer un code plus ou moins simple à faire et de donner la solution dans tous les langages que vous pouvez connaitre. Les variantes de langages sont autorisées, l’usage de design pattern aussi bien que pour certain code cela est bien inutile il peut être amusant de s’en servir quand même.

Donc voilà premier sujet un simple Hello World et pour corser un peu la chose le second sujet est un moyen d’afficher le contenu d’un répertoire de manière récursive avec l’indentation qui va bien. Exemple de résultat attendu pour le second sujet

`+_ repertoire1
|_ repertoire2
|+ repertoire3
||_ sousRepertoire1
+_ repertoire4
+_ repertoire5`

Amusez-vous bien

---

<div class="post-metadata">

**Author:** ![gege2061](https://www.debian-fr.org/user_avatar/www.debian-fr.org/gege2061/32/3493_2.png) [@gege2061](https://www.debian-fr.org/u/gege2061)\
**Post date:** [Février 20, 2016, 9:00 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/2 "2016-02-20T21:00:57Z")

</div>

> [@](#):
>
> donner la solution dans tous les langages que vous pouvez connaitre.

En même temps ?

[code]cat =13 /\*/ \>/dev/null 2\>&1; echo “Hello, world!”; exit  
\*

- This program works under cc, f77, and /bin/sh.
- 

_/; main() {  
write(  
cat-~-cat  
/_,’(  
_/  
,“Hello, world!”  
,  
cat); putchar(~-~-~-cat); } /_  
,)’)  
end  
\*/[/code]  
[Source](http://www.ioccc.org/)

![:mrgreen:](https://www.debian-fr.org/uploads/default/original/1X/cc83e9b583138e48ff45f96609046b06d06c7f9d.gif "Mr. Green")

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 9:01 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/3 "2016-02-20T21:01:11Z")

</div>

`+_ repertoire1
|_ repertoire2
|+ repertoire3
||_ sousRepertoire1
+_ repertoire4
+_ repertoire5`  
Je ne comprends pas très bien la forme à quel moment on met un + et doit-on afficher les fichiers non dossier ?

---

<div class="post-metadata">

**Author:** ![eol](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/e/b782af/32.png) [@eol](https://www.debian-fr.org/u/eol)\
**Post date:** [Février 20, 2016, 9:01 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/4 "2016-02-20T21:01:17Z")

</div>

un petit “Hello, World!” en haskell[code]module Main where

main = putStrLn “Hello, World!”[/code]

---

<div class="post-metadata">

**Author:** ![eol](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/e/b782af/32.png) [@eol](https://www.debian-fr.org/u/eol)\
**Post date:** [Février 20, 2016, 9:01 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/5 "2016-02-20T21:01:17Z")

</div>

[quote=“MisterFreez”]`+_ repertoire1
|_ repertoire2
|+ repertoire3
||_ sousRepertoire1
+_ repertoire4
+_ repertoire5`  
Je ne comprends pas très bien la forme à quel moment on met un + et doit-on afficher les fichiers non dossier ?[/quote]  
La forme avec les plus c’était un exemple, si tu vois une autre manière de faire ça nous intéresse aussi.

---

<div class="post-metadata">

**Author:** ![Ashgenesis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/57b2e6/32.png) [@Ashgenesis](https://www.debian-fr.org/u/Ashgenesis)\
**Post date:** [Février 20, 2016, 9:01 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/6 "2016-02-20T21:01:46Z")

</div>

@gege2061 : Tricheur 🙂 L’objectif n’est pas de choper des sources déjà faites mais de les faire soi-même sinon il n’y a aucun intérêt.

@MisterFreez : Comme le dis eol effectivement c’est un exemple et oui ce ne sont que les répertoires qui sont à afficher. Si tu as une autre idée d’affichage n’hésite pas l’objectif étant d’avoir le champ libre sur la conception et sur le langage à utiliser mais avec un algorithme simple de façon à ce que ce soit ludique. 😉

@eol : Merci nickel, Bon reste à voir pour d’autres langages maintenant 😃

---

<div class="post-metadata">

**Author:** ![vapula](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/9dc877/32.png) [@vapula](https://www.debian-fr.org/u/vapula)\
**Post date:** [Février 20, 2016, 9:01 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/7 "2016-02-20T21:01:47Z")

</div>

Salutations,

Je propose une première piste en Python pour l’exploration récursive des fichiers.  
Évidemment, si vous avez d’autres modifications concernant l’indentation, n’hésitez pas à faire des propositions. (Et même si cela concerne autre choses d’ailleurs).

La fonction parcours prend comme argument un ‘int’ et renvoie un ‘int’, ce qui permet l’indentation.

Bien à vous tous.

[code]# -_- coding:utf8 -_-

# [http://docs.python.org/library/os.html](http://docs.python.org/library/os.html)

# [http://docs.python.org/library/os.path.html](http://docs.python.org/library/os.path.html)

import os

def parcours(pos):  
pos += 1  
ls = os.listdir(os.getcwd()) # Equivalent ls;  
ls.sort() # Tri alpha de la liste;

```
for element in ls:

    if os.path.isdir(element): 
        print("| "*(pos-1)+ "|-+ " + element) # Affichages des directories;
        os.chdir(element) # cd path;
        pos = parcours(pos)
        os.chdir('..') # cd .. ;
    
    # A activer si besoin d'afficher les files;
    #else:
    # print("| "*(pos-1)+ "|- " + element) # Affichages des files;
        
pos -= 1
return pos

```

print “Chemin de base :”,os.getcwd()  
position = 0  
position = parcours(position)[/code]

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 9:01 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/8 "2016-02-20T21:01:48Z")

</div>

[code]#include   
#include

#include \<sys/types.h\>  
#include \<dirent.h\>  
#include \<libgen.h\>  
#include \<string.h\>

namespace{  
bool parcour(int level, std::string dossier){  
using namespace std;  
bool ret = false;  
DIR \*dos = opendir(dossier.c\_str());  
if(dos == NULL){  
return ret;  
}  
struct dirent \*entry;  
while((entry = readdir(dos)) != NULL){  
if(strcmp(entry-\>d\_name,".") == 0 ||0 == strcmp(entry-\>d\_name,"…")){  
continue;  
}  
if(entry-\>d\_type == 4){  
if(!ret){  
for(int i = 0; i \< level;++i){  
cout \<\< ‘|’;  
}  
cout \<\< "+ " \<\< basename(&dossier[0]) \<\< endl;

```
      ret = true;
    }
    parcour(level+1, dossier+'/'+entry->d_name);
  }
}
if(!ret){
  for(int i = 0; i < level;++i){
    cout << '|';
  }
  cout << "_ " << basename(&dossier[0]) << endl;
}
return ret;

```

}  
}

int main (int argc, char \*\* argv){  
using namespace std;

if(1 == argc){  
cerr \<\< “Usage : " \<\< argv[0] \<\< " …” \<\< endl;  
}

for(int i = 1; i \< argc; ++i){  
parcour(0, argv[i]);  
}

return 0;  
} // end of main()[/code]  
Voici une version C++ (bien obligé d’utiliser du C malheureusement) qui affiche les dossiers de la forme :

`+ .
|_ coucou
|+ test
||_ hello
`  
une arborescence ./test/hello/ et ./couco/

Je vais regarder la version python.

---

<div class="post-metadata">

**Author:** ![Davidbrcz](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/8c91f0/32.png) [@Davidbrcz](https://www.debian-fr.org/u/Davidbrcz)\
**Post date:** [Février 20, 2016, 9:01 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/9 "2016-02-20T21:01:59Z")

</div>

[quote=“MisterFreez”]  
Voici une version C++ (bien obligé d’utiliser du C malheureusement) qui affiche les dossiers de la [/quote]

Et quid de boost::filesystem ?

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 9:01 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/10 "2016-02-20T21:01:59Z")

</div>

Pas eu envie d’introduire des dépendances (mais oui j’apprécie pas mal boost).

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 9:02 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/11 "2016-02-20T21:02:08Z")

</div>

[code]#open “sys”;;  
#open “unix”;;  
#open “format”;;

let liste\_repertoire s =  
try let c = (opendir s) in  
let res = ref [] in  
let rec boucle () =  
try (res:=(readdir c)::!res;boucle ()) with \_-\> ((closedir c);!res)  
in boucle () with \_ -\> [];;

let affiche s =  
let rec boucle preambule repcomplet = function  
| “.” -\> []  
| “…” -\> []  
| rep -\> (  
print\_string (preambule^"+ “^rep);  
print\_newline ();  
(flat\_map  
(function x -\> (boucle (preambule^” |") (repcomplet^"/"^x) x))  
(liste\_repertoire repcomplet))  
) in boucle “” s s;;

if (vect\_length sys\_\_command\_line) \>= 2  
then affiche sys\_\_command\_line.(1)  
else affiche “./”;;  
[/code]  
cela donne

[code]francois@bling:/tmp$ ./affiche /tmp

- /tmp  
|+ clamav\_0.95.3+dfsg.orig.tar.gz  
|+ .X0-lock  
|+ clamav\_0.95.3+dfsg-1.dsc  
|+ clamav-0.95.3+dfsg  
| |+ freshclam  
| | |+ dns.c  
| | |+ manager.c  
| | |+ notify.h  
| | |+ [Makefile.am](http://Makefile.am)  
| | |+ manager.h  
| | |+ mirman.c  
| | |+ notify.c  
| | |+ nonblock.c  
| | |+ execute.h  
| | |+ nonblock.h  
| | |+ execute.c  
| | |+ freshclam.c  
| | |+ [Makefile.in](http://Makefile.in)  
| | |+ dns.h  
| | |+ mirman.h  
[…]  
[/code]

---

<div class="post-metadata">

**Author:** ![Dixippe](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/5f8ce5/32.png) [@Dixippe](https://www.debian-fr.org/u/Dixippe)\
**Post date:** [Février 20, 2016, 9:02 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/12 "2016-02-20T21:02:16Z")

</div>

Bonjour,

Une autre façon de faire en C:

```auto
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>

int select_dir (const struct dirent *adir)
{
	if ((strcmp(adir->d_name, ".."))
		&&(strcmp(adir->d_name, ".")))
		return 1;
	else
		return 0;
}

void see_dir (char *adir)
{
	struct dirent **namelist;
	int n;
	char *path;

	n = scandir(adir, &namelist, select_dir, alphasort);
	if (n > 0)
	{
		while(n--)
		{
			asprintf(&path, "%s/%s", adir, namelist[n]->d_name);
			printf("%s\n" ,path);
			see_dir(path);
			free (path);
			free (namelist [n]);
		}
		free (namelist);
	}
}

main(int argc , char *argv[])
{
	if (argc != 2)
	{
		printf("Usage: %s dir\n", argv[0]);
		exit(0);
	}else
	see_dir(argv[1]);
}
```

cela donne:

```auto
user1@PC1:~/Projets$ readdir U-boot
U-boot/tools
U-boot/tools/updater
U-boot/tools/updater/utils.c
U-boot/tools/updater/update.c
U-boot/tools/updater/string.c
U-boot/tools/updater/ppcstring.S
U-boot/tools/updater/junk
U-boot/tools/updater/flash_hw.c
U-boot/tools/updater/flash.c
U-boot/tools/updater/dummy.c
U-boot/tools/updater/ctype.c
U-boot/tools/updater/cmd_flash.c
U-boot/tools/updater/Makefile
U-boot/tools/scripts
U-boot/tools/scripts/send_image
U-boot/tools/scripts/send_cmd
U-boot/tools/scripts/flash_param
U-boot/tools/scripts/dot.kermrc
U-boot/tools/scripts/README
U-boot/tools/mkimage.c
U-boot/tools/logos
...
```

:smt111

---

<div class="post-metadata">

**Author:** ![Hoshin](https://www.debian-fr.org/user_avatar/www.debian-fr.org/hoshin/32/3672_2.png) [@Hoshin](https://www.debian-fr.org/u/Hoshin)\
**Post date:** [Février 20, 2016, 9:02 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/13 "2016-02-20T21:02:33Z")

</div>

Un peu de PERL pour changer 😛

```auto
#!/usr/bin/perl -w

use strict;
use warnings;

my $baseindent = "";
my $addint = " ";

sub make_dirpath($){
	my ($dirpath) = @_;
	if($dirpath){
		#ajout '/' de fin si absent	
		if ( $dirpath !~ /^.*\/$/) {
			$dirpath.="/";
		}
	}else{
		#chaîne vide si on ne précise rien
		$dirpath = "";
	}
	#on remplace les noms de dossiers avec des espaces par des espace échappés :	
	$dirpath =~ s/ /\\ /g;
	return $dirpath;
}

sub cycle_dir($;$);#récursion cycle_dir
sub cycle_dir($;$){
	my ($dirpath, $indents) = @_;
	
	$dirpath = make_dirpath($dirpath);#mise en forme nom dossier
	
	#itération sur les éléments du dossier	
	my @files = <$dirpath*>;
	foreach my $file (@files) {
		if(-d$file){
			print $indents.'+'.$file . "\n";#dossier
			cycle_dir($file,$indents.$addint);#si dossier : rebelotte avec indent en +
		} else {
			print $indents.'|_'.$file . "\n";#simple fichier
		}
	}
}

#on liste les éléments du nom de dossier passé en paramètre
cycle_dir($ARGV[0], $baseindent);
```

Sans doute pas optimal m’enfin ça fait ce qu’on lui demande ou du moins ça s’en rapproche :

```auto
/home/martin >>> % ./dirlist.pl /proc/acpi/
+/proc/acpi/button
  +/proc/acpi/button/lid
    +/proc/acpi/button/lid/LID
      |_/proc/acpi/button/lid/LID/info
      |_/proc/acpi/button/lid/LID/state
  +/proc/acpi/button/power
    +/proc/acpi/button/power/PBTN
      |_/proc/acpi/button/power/PBTN/info
  +/proc/acpi/button/sleep
    +/proc/acpi/button/sleep/SBTN
      |_/proc/acpi/button/sleep/SBTN/info
|_/proc/acpi/dsdt
+/proc/acpi/embedded_controller
|_/proc/acpi/fadt
+/proc/acpi/fan
|_/proc/acpi/info
+/proc/acpi/power_resource
+/proc/acpi/processor
  +/proc/acpi/processor/CPU0
    |_/proc/acpi/processor/CPU0/info
    |_/proc/acpi/processor/CPU0/limit
    |_/proc/acpi/processor/CPU0/power
    |_/proc/acpi/processor/CPU0/throttling
  +/proc/acpi/processor/CPU1
    |_/proc/acpi/processor/CPU1/info
    |_/proc/acpi/processor/CPU1/limit
    |_/proc/acpi/processor/CPU1/power
    |_/proc/acpi/processor/CPU1/throttling
|_/proc/acpi/sleep
+/proc/acpi/thermal_zone
  +/proc/acpi/thermal_zone/THM
    |_/proc/acpi/thermal_zone/THM/cooling_mode
    |_/proc/acpi/thermal_zone/THM/polling_frequency
    |_/proc/acpi/thermal_zone/THM/state
    |_/proc/acpi/thermal_zone/THM/temperature
    |_/proc/acpi/thermal_zone/THM/trip_points
+/proc/acpi/video
  +/proc/acpi/video/VID
    +/proc/acpi/video/VID/CRT
      |_/proc/acpi/video/VID/CRT/brightness
      |_/proc/acpi/video/VID/CRT/EDID
      |_/proc/acpi/video/VID/CRT/info
      |_/proc/acpi/video/VID/CRT/state
    |_/proc/acpi/video/VID/DOS
    +/proc/acpi/video/VID/DVI
      |_/proc/acpi/video/VID/DVI/brightness
      |_/proc/acpi/video/VID/DVI/EDID
      |_/proc/acpi/video/VID/DVI/info
      |_/proc/acpi/video/VID/DVI/state
    |_/proc/acpi/video/VID/info
    +/proc/acpi/video/VID/LCD
      |_/proc/acpi/video/VID/LCD/brightness
      |_/proc/acpi/video/VID/LCD/EDID
      |_/proc/acpi/video/VID/LCD/info
      |_/proc/acpi/video/VID/LCD/state
    |_/proc/acpi/video/VID/POST
    |_/proc/acpi/video/VID/POST_info
    |_/proc/acpi/video/VID/ROM
    +/proc/acpi/video/VID/TV
      |_/proc/acpi/video/VID/TV/brightness
      |_/proc/acpi/video/VID/TV/EDID
      |_/proc/acpi/video/VID/TV/info
      |_/proc/acpi/video/VID/TV/state
  +/proc/acpi/video/VID2
    |_/proc/acpi/video/VID2/DOS
    |_/proc/acpi/video/VID2/info
    |_/proc/acpi/video/VID2/POST
    |_/proc/acpi/video/VID2/POST_info
    |_/proc/acpi/video/VID2/ROM
|_/proc/acpi/wakeup
```

Tiens faudrait que je sépare complètement dossiers et fichiers pour que ça soit moins le boxon ou alors carrément n’afficher que les dossiers pour pas se prendre la tete 😛

---

<div class="post-metadata">

**Author:** ![Dixippe](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/5f8ce5/32.png) [@Dixippe](https://www.debian-fr.org/u/Dixippe)\
**Post date:** [Février 20, 2016, 9:02 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/14 "2016-02-20T21:02:39Z")

</div>

Un langage que j’apprécie beaucoup: Objective C

Adir.h:

```auto
#import <objc/Object.h> 
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>

#define TYPEDIR 1
#define TYPEFILE	2

extern int offset;

@interface Adir : Object 
{
	struct dirent **namelist;
	int n;
	int count;
	char *path;
}
- free;
- (int) set_Entry: (char*) dirname;
- (int) set_next;
- (int) get_count;
- (char*) get_name;
- (int) get_type;
@end
```

Adir.m:

```auto
#import "Adir.h"

int select_dir (const struct dirent *adir)
{
	//if ((adir->d_type == DT_DIR) 
	if ((strcmp(adir->d_name, ".."))
		&&(strcmp(adir->d_name, ".")))
		return 1;
	else
		return 0;
}

@implementation Adir
+ new   
{
  self = [super new];
  return self;
} 
- free
{
	while(count--) free (namelist [count]);
	free (namelist);
  return [super free];
} 
- (int) set_Entry: (char*) dirname
{
	n = scandir(dirname, &namelist, select_dir, alphasort);
	count = n;
	return count;
}
- (int) set_next
{
	return --n;
}

- (int) get_count
{
	return n;
}
- (char*) get_name
{
	if (n>0)	
		return namelist[n-1]->d_name;
	else
		return (char *)0;
}
- (int) get_type
{
	if (namelist[n-1]->d_type == DT_DIR) return TYPEDIR;
	return TYPEFILE;
}
@end
```

Readdir.h:

```auto
#import <objc/Object.h> 
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>

@interface Readdir : Object 
{
  char *path; // These are instance variables.
  int size;
} 
/* Public methods */
- free;
- Entry: (char *) dirname;
- scan; 
@end
```

Readdir.m:

```auto
#import "Adir.h"
#import "Readdir.h" 

@implementation Readdir 
+ new   
{
  self = [super new];
  return self;
} 
- free
{
  free(path);
  return [super free];
} 
- Entry: (char *) dirname
{
	asprintf(&path, "%s", dirname);
  
  return self;
} 
- scan
{
  id adir;
  id subdir;
  char *subpath;

  adir = [Adir new];     
  [adir set_Entry:path]; 
  
  while([adir get_count])
  {	
	int i;

	for (i=0; i<offset; i++) printf("| ");
	

	if ([adir get_type] == TYPEDIR)
	{
		printf("|+ %s\n", [adir get_name]);
		offset++;		
		subdir = [Readdir new];    
		asprintf(&subpath, "%s/%s", path, [adir get_name]); 
		[subdir Entry: subpath];   
		[subdir scan];
		[subdir free];
		free (subpath);
		offset--;
	}else
		printf("|_ %s\n", [adir get_name]);
	[adir set_next];
  }
 
	[adir free];
  return self;                
} 
@end
```

main.m:

```auto
#import <objc/Object.h>
#import "Readdir.h"  
 
int offset;
     
main(int argc, char* argv[], char** env)
{
  int i;
  id readdir; 

  offset = 0;

  if (argc != 2)
  {
	printf("Usage: %s dir\n", argv[0]);
	exit(0);
  }
       
  readdir = [Readdir new];     
  [readdir Entry: argv[1]];   
  [readdir scan];
  [readdir free];
}
```

A compiler avec :

```auto
make -n :
gcc -o Adir.o -c Adir.m -Wno-import -I/usr/lib/gcc/x86_64-linux-gnu/4.3/include/
gcc -o main.o -c main.m -Wno-import -I/usr/lib/gcc/x86_64-linux-gnu/4.3/include/
gcc -o Readdir.o -c Readdir.m -Wno-import -I/usr/lib/gcc/x86_64-linux-gnu/4.3/include/
gcc -lobjc -lpthread -o readdir.objc Adir.o main.o Readdir.o -L/usr/lib/gcc/x86_64-linux-gnu/4.3/
```

(à adapter \_64…)

Résultat:

```auto
|+ tools
| |+ updater
| | |_ utils.c
| | |_ update.c
| | |_ string.c
| | |_ ppcstring.S
| | |_ junk
| | |_ flash_hw.c
| | |_ flash.c
| | |_ dummy.c
| | |_ ctype.c
| | |_ cmd_flash.c
| | |_ Makefile
| |+ scripts
| | |_ send_image
| | |_ send_cmd
| | |_ flash_param
| | |_ dot.kermrc
| | |_ README
| |_ mkimage.c
| |+ logos
| | |_ denx.bmp
| |_ inca-swap-bytes.c
| |_ img2srec.c
| |_ gen_eth_addr.c
| |+ gdb
| | |_ serial.h
| | |_ serial.c
| | |_ remote.h

```

:smt111 (j’aime bien ce smiley, merci aux administrateurs. ![:smt038](https://www.debian-fr.org/uploads/default/original/1X/08df484251490af77ba342c0331f3ee271065fe9.gif) ).

---

<div class="post-metadata">

**Author:** ![valAa](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/cc9497/32.png) [@valAa](https://www.debian-fr.org/u/valAa)\
**Post date:** [Février 20, 2016, 9:02 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/15 "2016-02-20T21:02:41Z")

</div>

J’avais fait ma version python, et puis j’ai reçu un coup de fil, et puis vapula a posté la sienne… argh :smt003

Bref je vous la mets quand même :

[code]#!/usr/bin/env python

# -_- coding:utf-8 -_-

import os

def foo(folder, tabs=0):  
files = [f for f in os.listdir(folder) if os.path.isfile(os.path.join(folder,f))]  
dirs = [d for d in os.listdir(folder) if os.path.isdir(os.path.join(folder,d))]  
for f in files:  
print ’ ’ \* tabs + ‘|-’ + f  
for d in dirs:  
print ’ ’ \* tabs + ‘+’ + d  
foo(os.path.join(folder,d), tabs+1)

def main():  
foo(os.getcwd())  
return 0

if **name** == ‘ **main** ’: main()[/code]

Résultat dans le dossier de test :

```auto
 |-test.pyc
 |-test.py
 +test
  |-truc
  |-chose
  +machin
   |-bidule
```

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 9:02 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/16 "2016-02-20T21:02:41Z")

</div>

[code]#open “sys”;;  
#open “unix”;;  
#open “format”;;

let liste\_repertoire s =  
try let c = (opendir s) in  
let res = ref [] in  
let rec boucle () =  
try (res:=(readdir c)::!res;boucle ()) with \_-\> ((closedir c);!res)  
in boucle () with \_ -\> [];;

let est\_repertoire s = try let c = (opendir s) in ((closedir c);true)  
with \_ -\> false;;

let affiche s =  
let rec boucle preambule repcomplet = function  
| “.” -\> []  
| “…” -\> []  
| rep when (est\_repertoire rep) -\> (  
print\_string (preambule^"+ “^rep);  
print\_newline ();  
(flat\_map  
(function x -\> (boucle (preambule^” |") (repcomplet^"/"^x) x))  
(liste\_repertoire repcomplet))  
)  
| fic -\> (print\_string (preambule^"\_ "^fic));[print\_newline ()]  
in boucle “” s s;;

if (vect\_length sys\_\_command\_line) \>= 2  
then affiche sys\_\_command\_line.(1)  
else affiche “./”;;  
[/code]  
qui affiche

`+ ./
  |_ clamav_0.95.3+dfsg.orig.tar.gz
  |_ .X0-lock
  |_ clamav_0.95.3+dfsg-1.dsc
  |+ clamav-0.95.3+dfsg
  | |_ freshclam
  | |_ FAQ
  | |_ shared
  | |_ COPYING
  | |_ test
  | |_ clamd
  | |_ COPYING.sha256
  | |_ NEWS
`  
synthétique Caml, non?

---

<div class="post-metadata">

**Author:** ![M3t4linux](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/5daacb/32.png) [@M3t4linux](https://www.debian-fr.org/u/M3t4linux)\
**Post date:** [Février 20, 2016, 9:02 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/17 "2016-02-20T21:02:41Z")

</div>

Oui, et il paraît beaucoup plus claire et simple que le code utilisé par Dixippe 😒

Le caml est un langage interprété?? donc un langage de script??

Dixippe, je ne me permettrait surtout pas de critiquer quoique que ce soit sur ton code ou ta manière de coder (je n’ai aucune connaissance en prog’, malheureusement)  
mais force est de constater que ton code est très verbeux comparé à celui de fran.b même si on ne peut pas le comparer

Tu utilises le Objective C = Objective Caml?? C’est parce qu’il est orienté objet qu’il paraît aussi compliqué et verbeux??

---

<div class="post-metadata">

**Author:** ![Hoshin](https://www.debian-fr.org/user_avatar/www.debian-fr.org/hoshin/32/3672_2.png) [@Hoshin](https://www.debian-fr.org/u/Hoshin)\
**Post date:** [Février 20, 2016, 9:02 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/18 "2016-02-20T21:02:43Z")

</div>

Objective C n’est pas OCaml, même si les syntaxes peuvent se ressembler. OCaml “rajoute” les objets a Caml à très peu de choses près.

Caml / OCaml est hypersynthétique c’est sur mais il faut être à l’aise avec et tout l’aspect “prog fonctionnelle” qui va avec je trouve. Mais c’est clair que c’est un super langage.

Par contre M3T4 Caml / OCaml se compile, tu as un compilo tout comme gcc : ocamlc, avec typage statique et tout et tout. Et d’ailleurs en général quand ocamlc termine correctement, c’est soit qu’on a correctement typé son bazar, soit qu’on a cherché à “tricher” et ce de façon très vicieuse ^^.^Enfin les souvenirs que j’en ai c’est que ) côté les options “–pedantic -Wall -Werror […]” qu’on peut trouver dans gcc produisent à peu près le même effet une fois toutes cummulées. Un truc très “marrant” à tenter pour bien s’en rendre compte est de faire une erreur de typage avec un framework Ocaml comme Oxygen.

Un truc génial dans Ocaml aussi je trouve c’est la façon de traiter les variables en écrivant des conjonctions (un peu comme un gros switch) … y’a pas mal de choses sympa dans Caml mais je n’ai fait que l’effleurer mais j’y remettrais ptet mes gros doigts boudinés un de ces 4 😛

Ceci dit fran, je ne sais pas ce que tu en penses mais perso j’ai découvert PERL en stage et je le trouve fort sympatique aussi =). L’article wikipedia dessus le désigne comme la “tronçonneuse suisse des langages de programmation” et en un sens je suis assez d’accord, rien que pour la gestion “gratuite” des listes et des hashtables 😛 Ceci dit il me semble qu’il en va de même pour Ocaml, c’est plus dans la façon de concevoir le programme que l’on change d’approche au final.

---

<div class="post-metadata">

**Author:** ![gege2061](https://www.debian-fr.org/user_avatar/www.debian-fr.org/gege2061/32/3493_2.png) [@gege2061](https://www.debian-fr.org/u/gege2061)\
**Post date:** [Février 20, 2016, 9:02 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/19 "2016-02-20T21:02:46Z")

</div>

> [@](#):
>
> @gege2061 : Tricheur 🙂 L’objectif n’est pas de choper des sources déjà faites mais de les faire soi-même sinon il n’y a aucun intérêt.

😢

Pour me faire pardonner, voici le code dans deux langages différents 😃

[Vala](http://live.gnome.org/Vala) :

[code]void print\_tabs (int tabs)  
{  
for (int i = 0; i \< tabs; i++)  
{  
print (" ");  
}  
}

void foo (string folder, int tabs = 0)  
{  
Dir dir;  
string file;  
string filename;

dir = Dir.open (folder);  
while ((filename = dir.read\_name ()) != null)  
{  
file = Path.build\_filename (folder, filename);  
print\_tabs (tabs);  
if (!FileUtils.test (file, FileTest.IS\_DIR))  
{  
print ("|-%s\n", filename);  
}  
else  
{  
print ("+%s\n", filename);  
foo (filename, tabs+1);  
}  
}  
}

void main ()  
{  
foo (".");  
}[/code]

[genie](http://live.gnome.org/Genie) :

[code][indent=2]

def print\_tabs (tabs : int) : void  
for var i = 1 to tabs  
stdout.printf (" ")

def foo (folder : string, tabs : int = 0) : void  
dir : Dir  
file : string  
filename : string

dir = Dir.open (folder)  
while (filename = dir.read\_name ()) != null  
file = Path.build\_filename (folder, filename)  
print\_tabs (tabs)  
if !FileUtils.test (file, FileTest.IS\_DIR)  
print “|-%s”, filename  
else  
print “+%s”, filename  
foo (filename, tabs+1)

init  
foo (".")[/code]

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 9:02 UTC](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239/20 "2016-02-20T21:02:50Z")

</div>

Même code que ma version C++, mais en Java. L’API File de java est vraiment agréable à utiliser.

[code]import java.io.File;

class Rep{  
private static void recurs(int level, String dossier){  
boolean ret = false;  
File dos = new File(dossier);

```
if(!dos.exists() || !dos.isDirectory()){
  return;
}

for(File file: dos.listFiles()){
  if(file.getName().compareTo(".") == 0 || file.getName().compareTo("..") == 0){
    continue;
  }
  if(file.isDirectory()){
    if(!ret){
      for(int i = 0; i < level; ++i){
        System.out.print('|');
      }
      System.out.println("+ "+dos.getName());

      ret = true;
    }
    recurs(level+1, dossier+'/'+file.getName());
  }
}
if(!ret){
  for(int i = 0; i < level;++i){
    System.out.print('|');
  }
  System.out.println("_ "+dos.getName());
}

```

}

public static void main(String[] arg){  
if(arg.length == 0){  
System.out.println(“Le programme a besoin d’argument.\n”);  
return;  
}

```
for(String dossier : arg){
  recurs(0, dossier);
}

```

}  
}[/code]  
J’zi vraiment pas le temps de regarder les algo et astuces que vous utilisez dans les autres langages. J’espère avoir plus de temps ce week end.

[Page suivante](https://www.debian-fr.org/t/coder-dans-plusieurs-langages/23239.md?page=2)
