Vous n'êtes pas identifié(e).
Pour m'amuser, j'ai essayé de refaire cela en Haskell.
Tu peux faire ça en scheme (guile par exemple) aussi ?
En perl, sans boucle et sans regexp :
Dernière modification par Beta-Pictoris (19-05-2020 07:16:29)
Hors ligne
Tu peux faire ça en scheme (guile par exemple) aussi ?
Justement, j'y pensais, je vais voir cela dans la journée
Hors ligne
En perl, sans boucle et sans regexp :
Euh, en fait les boucles sont dans le map et le glob…
Hors ligne
merci également pour l'astuce image iso pour épargner les dvd
Hors ligne
Beta-Pictoris a écrit :En perl, sans boucle et sans regexp :
Euh, en fait les boucles sont dans le map et le glob…
Sans boucle explicite.
Hors ligne
Je n'ai pas trouvé de fonction `glob'. Elle existe peut-être.
Je crois qu'il y en a une dans la slib, mais ça fait un moment
que la slib ne fonctionne plus avec guile.
Là j'utilise des modules qui font partie de la distribution standard
de guile. J'utilise guile-3.0. Il compile automatiquement les
programmes .scm. L'extension utilisée pour les fichiers compilés est
.go (!). Ce sont des fichiers ELF, qui ne sont pas exécutables
directement.
Question performance, j'ai trouvé cela assez rapide. Ce n'est pas étonnant,
car ça utilise la fonction ftw de la glibc.
Dernière modification par enicar (19-05-2020 11:49:43)
Hors ligne
Je n'ai pas l'impression que ça fonctionne en perl, en tout cas, pas comme ça
Hors ligne
Le {-# LANGUAGE PackageImports #-}, c'est juste parce
que j'utilise une extension qui me permet de spécifier le package
depuis lequel j'importe le module System.FilePath.Glob car
j'ai deux packages qui exportent ce module. Ici j'utilise le package
Glob. Ce module a une fonction glob qui permet de
rechercher un motif dans le répertoire courant. Le motif **
permet de faire un recherche récursive.
On peut aussi écrire le main sur une seule ligne, mais c'est plus
difficile à lire :
Mais que veut dire ce « . » ? C'est la composition de fonctions.
Donc
va extraire le nom de fichier (takeFileName est équivalent de
basename), ensuite la fonction length est appliqué au résultat.
C'est comme si j'avais écrit :
Sauf que ça m'évite de donner un nom à la fonction.
(>103) est un prédicat qui vaut vrai si le nombre passé en
argument est stritement supérieur à 103 (comme on pouvait s'y attendre).
C'est une section. Ça évite d'utiliser une lambda expression ou
d'écrire une fonction avec un nom explicite pour l'occasion.
On pourrait l'écrire avec une lambda :
ou avec un nom explicite :
mapM_ va appliquer la fonction putStrLn à chaque éléments de la liste
passé en arguments. C'est une fonction, pas une construction du
langage. Le truc ici c'est que mapM_ est une focntion qui attend 2
arguments (pour simplifier). Ici je l'utilise avec un seul argument,
ça crée une nouvelle fonction prendra une liste en argument.
C'est comme si j'avais défini une nouvelle fonction :
et que j'utilisais :
Reste >>= que je vais laisser inexpliqué… (c'est la poudre de
perlinpinpin de Haskell )
Dernière modification par enicar (19-05-2020 15:18:29)
Hors ligne
La ligne est un peu longue, peut-être qu'on peut faire plus court, mais bon
ça marche.
Dernière modification par enicar (19-05-2020 17:12:54)
Hors ligne
Dernière modification par Beta-Pictoris (19-05-2020 17:59:12)
Hors ligne
Hors ligne
Dernière modification par Beta-Pictoris (19-05-2020 18:13:57)
Hors ligne
Hors ligne
Hors ligne
L'indention scheme du forum ne permet pas mieux.
Le code formaté dans emacs n'est pas parfaitement repris.
Oui, j'ai remarqué aussi. J'utilise aussi emacs pour coder (mais avec evil
pour faire à la vim). J'utilise geiser pour gérer le scheme.
C'est mieux comme ça ?
Oui bien mieux
J'aime bien les petites (voire les très petites) fonctions, du coup j'aurais fait comme ça :
Dans mon programme en scheme, je gère aussi les arguments de la cmdline.
J'attends une liste de répertoires ou rien.
Dernière modification par enicar (20-05-2020 20:45:27)
Hors ligne
Dernière modification par Beta-Pictoris (19-05-2020 19:30:07)
Hors ligne
Hors ligne
Tu connais whisp ? : https://archive.fosdem.org/2019/schedul … m_2019.pdf
Non je connaissais pas, décidément lisp inspire encore des gens
Je ne sais pas les « : » et l'indentation sont mieux que les (…).
C'est sûr que ça fait plus clair comme syntaxe. À voir, si le layout
est aussi sensible qu'en python (un truc qui m'agace en python).
En haskell, le layout est plus libre, et ça marche très bien.
Dans la rubrique curiosité, j'ai vu cela Axel. C'est une sorte de lisp
avec la sémantique de haskell…
Il existe un éditeur destiné au clojure qui parenthèse en fonction de
l'indentation : nightcode. Ça permet d'indenter comme en python
et l'éditeur mets les parenthèses à la bonne place.
Dans emacs, j'utilise smartparents et evil-cleverparens (un remake
d'une extension pour vim). Ça fait un beau formatage. Je n'ai
pratiquement rien à faire, les parenthèses se mettent toute seule par
paire, quand j'en ouvre une, la parenthèse fermante se met
automatiquement (ce qui n'est pas toujours idéal). Quand je tape
<return>, le code est directement bien indenté. Et aussi, j'utilise
rainbow-delimiters, ça permet d'avoir des couleurs différentes en
fonction du niveau de « parenthèsage » et de l'endroit où se trouve
le curseur.
Il n'empêche que du point de la syntaxe, je préfère haskell…
Dernière modification par enicar (19-05-2020 19:47:54)
Hors ligne
A noter, je termine les prédicats par un point d'interrogation.
C'est ce que je faisais aussi, quand je faisais du scheme
C'est aussi l'usage en ruby.
Hors ligne
Hors ligne
Hors ligne
C'est comme la fonction glob de perl.
Oui, c'est curieux pour la fonction gob de perl. Je m'attendais à pouvoir
faire un parcours récursif avec. En Haskell, j'ai trois librairies qui proposent
une sorte de glob. Avec une, le parcours récursif ne fonctionne pas avec les glob ** ;
d'un autre côté cette lib (filemanip) propose une excellente interface pour utiliser
un find qui rend les glob ** peu utiles.
Hors ligne
Dans emacs, j'utilise smartparents et evil-cleverparens (un remake
d'une extension pour vim).
As-tu eu l'occasion de comparer smartparents à paredit ?
Pour coder en guile sous emacs, le mode geiser permet d'accéder facilement à la doc (pages d'info). Tu ne l'utilises pas ?
Hors ligne
Beta-Pictoris a écrit :C'est comme la fonction glob de perl.
Oui, c'est curieux pour la fonction gob de perl. Je m'attendais à pouvoir
faire un parcours récursif avec. En Haskell, j'ai trois librairies qui proposent
une sorte de glob. Avec une, le parcours récursif ne fonctionne pas avec les glob ** ;
d'un autre côté cette lib (filemanip) propose une excellente interface pour utiliser
un find qui rend les glob ** peu utiles.
En perl, il y a bien la fonction find du module File::Find, mais, à première vue, elle ne retourne rien.
Perl permet, par contre, de récupérer facilement le résultat des commandes shell sous forme liste/tableau, grâce aux backquotes :
Dernière modification par Beta-Pictoris (20-05-2020 20:05:57)
Hors ligne
As-tu eu l'occasion de comparer smartparents à paredit ?
Apparemment, paredit est beaucoup plus strict que smartparens. C'est à
dire que paredit insiste pour que les parenthèses soient bien
équilibrées. Aussi dans smartparens on peut rajouter des paires de
caractères. Je n'ai pas vraiment testé (ou alors je me souviens plus)
paredit. Par contre j'ai lu ça : Paredit and smartparens
À priori je préfère la façon de faire de smartparens que j'ai
découvert lorque j'ai utilisé spacemacs (c'est le choix par défaut).
Pour coder en guile sous emacs, le mode geiser permet d'accéder facilement à la doc (pages d'info). Tu ne l'utilises pas ?
En fait je n'ai pas encore eu le temps d'explorer geiser, ça fait
vraiment pas longtemps que je l'ai installé et je ne fais pas souvent
du scheme A vrai dire, c'est l'occasion pour que je complète la
configuration de geiser
Hors ligne