Ce n'est pas vraiment un "shell lisp" ce que je montre en exemple c'est juste un usage interactif dans la boucle d'interaction mais les fonctions en question sont "juste" des fonctions utilisables dans n'importe quel programme. (Lisp gomme beaucoup de différences entre l'usage interactif du langage et l'usage non interactif.)
La bibliothèque définit un type "command" et des fonctions pour exécuter une commande selon les modes que j'ai décrits "utilitaire", "test", "recherche" ou "filtre". L'utilisation de la fonction "cp" renvoie donc une commande, et pour rendre l'écriture d'interfaces comme la fonction "cp" et le programme Unix "cp" facile, j'ai écrit une macro qui s'occupe de toute la plomberie et qui s'utilise comme ça:
(define-commandcp(pathname-listdestination)((follow:flag"-H")(force:flag"-f")(recursive:flag"-R"))(:program#p"/bin/cp":documentation"Run cp(1) on PATHNAME-LIST and DESTINATION.":reference"http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cp.html":rest(append(ensure-listpathname-list)(listdestination))))
En évaluant ce bout de code, Lisp définit une fonction "cp" qui comprend les options "follow", "force" et "recursive" et les traduits en les arguments correspondants du programme "cp".
Cette macro traite "le cas facile" mais pour "find*" j'ai du comme tu le devinais dans ton commentaire écrire une interface spécifique:
(defunfind*(predicate-exprpathname&keydirectoryenvironmentfollow)"Prepare a find(1) command on PATHNAME with the given PREDICATE-EXPR.The options are FOLLOW If set, symbolic links are followed. DIRECTORY A pathname to a working doirectory to use when running the command.";; References: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html(make-instance'command:program#p"/usr/bin/find":directorydirectory:environmentenvironment:argv(append(whenfollow(list"-L"))(mapcar#'define-command/to-string(ensure-listpathname))(find-predicate-to-argvpredicate-expr))))
(Le "make-instance" en Lisp c'est comme le "new" en C++ pour faire vite.)
La partie compliquée est cachée dans la fonction "find-predicate-to-argv" qui convertit un prédicat comme '(:and (:has-kind :regular)(:name "*.lisp")) en quelque chose que le programme "find" comprend.
[^] # Re: Rashell
Posté par Michaël (site web personnel) . En réponse au journal Rashell – Une bibliothèque pour remplacer les scripts shells par du Lisp. Évalué à 2.
Ce n'est pas vraiment un "shell lisp" ce que je montre en exemple c'est juste un usage interactif dans la boucle d'interaction mais les fonctions en question sont "juste" des fonctions utilisables dans n'importe quel programme. (Lisp gomme beaucoup de différences entre l'usage interactif du langage et l'usage non interactif.)
La bibliothèque définit un type "command" et des fonctions pour exécuter une commande selon les modes que j'ai décrits "utilitaire", "test", "recherche" ou "filtre". L'utilisation de la fonction "cp" renvoie donc une commande, et pour rendre l'écriture d'interfaces comme la fonction "cp" et le programme Unix "cp" facile, j'ai écrit une macro qui s'occupe de toute la plomberie et qui s'utilise comme ça:
En évaluant ce bout de code, Lisp définit une fonction "cp" qui comprend les options "follow", "force" et "recursive" et les traduits en les arguments correspondants du programme "cp".
Cette macro traite "le cas facile" mais pour "find*" j'ai du comme tu le devinais dans ton commentaire écrire une interface spécifique:
(Le "make-instance" en Lisp c'est comme le "new" en C++ pour faire vite.)
La partie compliquée est cachée dans la fonction "find-predicate-to-argv" qui convertit un prédicat comme
'(:and (:has-kind :regular)(:name "*.lisp"))en quelque chose que le programme "find" comprend.