fabcad Posté(e) le 20 octobre 2009 Posté(e) le 20 octobre 2009 Bonjour, Ecoutant les conseils avisés de (Gile), je voudrais éviter l'utilisation de fonctions externes aux langages LISP et Visual LISP. C'est le cas de dos_strreplace de doslib qui permet de remplacer un caractère d'une chaine de caractères par un autre caractère ou par une autre chaine de caractères, j'ai cherché un équivalent Visual LISP mais avec vl-string-translate et vl-string-subst je ne vois pas mon texte modifié en entier mais seulement la portion. exemple avec dos_strreplace : (setq index_voie "Rue de l'Eglise d'Artois") (setq index_voie (dos_strreplace index_texte "'" "' ")) --> retourne "Rue de l' Eglise d' Artois" Merci pour vos réponses, Fabrice [Edité le 20/10/2009 par fabcad]
bseb67 Posté(e) le 20 octobre 2009 Posté(e) le 20 octobre 2009 Salut fabcad, Je ne vois pas où le problème :casstet: (setq index_texte "Rue de l'Eglise" index_texte_dos (dos_strreplace index_texte "'" "' ") index_texte_vl (vl-string-subst "' " "'" index_texte) ) (print index_texte_dos) (print index_texte_vl) "Rue de l' Eglise" "Rue de l' Eglise" Mais je pense que ton exemple n'est pas très bien choisi ;) car (setq index_texte "Ru'e de l'Eglise") on obtient:"Ru' e de l' Eglise" "Ru' e de l'Eglise" => et voilà le problème, vl-string-subst ne le fait qu'une foisil faut boucler pour effectuer le changement sur toute la chaine en entrée. Sauf que .... Attention aux boucles infinies avec des trucs du genre:remplacer "\" par "\\" Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
fabcad Posté(e) le 20 octobre 2009 Auteur Posté(e) le 20 octobre 2009 Merci bseb67, Oui j'ai vu l'erreur et j'ai changé mon exemple avec une valeur de chaine qui contient deux apostrophes. Tu dis de boucler mais sur quoi caractere par caractère ou bien mot par mot, je ne vois pas ou tu veux en venir. :) A+
bseb67 Posté(e) le 20 octobre 2009 Posté(e) le 20 octobre 2009 Je n'ai pas fait de fonction réellement pour ca, mais je pense que si tu veux remplacer un seul caractère par X caractères ou X >= 0une fonction récursive de ce genre devrait aller (fonction entrée ancien nouveau prendre 1er caractère d'entrée => tmp si tmp = ancien retourner nouveau + (fonction "entrée - 1er caractère" ancien nouveau) sinon retourner tmp + (fonction "entrée - 1er caractère" ancien nouveau)) Par contre, si tu veux remplacer plusieurs (Y) caractères par X caractères, il fautmodifier simplement l'algo de fonction en prenant les Y ers caractères au-lieu du 1ersi tmp = ancien retourner nouveau + fonction entrée - Y caractèressinon retourner 1er caractère + fonction entrée - 1er caractère edit:bien-sur il ne faut pas oublier la condition d'arrêt pour la récursivité: entrée = ""et tester si les paramètres sont bien des chaines de caractères [Edité le 20/10/2009 par bseb67] Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
bonuscad Posté(e) le 20 octobre 2009 Posté(e) le 20 octobre 2009 Hello En voilà un challenge! concret en plus. Je vais faire une proposition qui reprend le même principe à ta discussion Je suis sur que ElpanovEvgeniy va faire un truc de ouf en récursivité ;) (defun match_replace (string pattern target / l_str l_pat l_trg n tmp l_rv) (cond ((and (eq (type string) 'STR) (eq (type pattern) 'STR) (eq (type target) 'STR)) (setq l_str (vl-string->list string) l_pat (vl-string->list pattern) l_trg (vl-string->list target) ) (while l_str (repeat (setq n (length l_pat)) (setq tmp (cons (nth (setq n (1- n)) l_str) tmp)) ) (cond ((equal tmp l_pat) (setq l_rv (append (reverse l_trg) l_rv)) (repeat (1- (length l_pat)) (setq l_str (cdr l_str))) ) (T (setq l_rv (cons (car l_str) l_rv)) ) ) (setq l_str (cdr l_str)) (setq tmp nil) ) (vl-list->string (reverse l_rv)) ) ) ) exemple d'usage:(MATCH_REPLACE "\nAvec CadXp, on trouve les réponses,\nCadXp la référence?\nCadXp faites la différence" "CadXp" "FabCad")ou encore(MATCH_REPLACE "\nAvec CadXp, on trouve les réponses,\nCadXp la référence?\nCadXp faites la différence" "\n" "\t ") Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 20 octobre 2009 Posté(e) le 20 octobre 2009 Salut, C'est pas récursif, c'est sûrement pas très rapide, mais c'est concis ;) (defun strSubstAll (new old str / pos len) (setq len (strlen new) pos (- len) ) (while (setq pos (vl-string-search old str (+ pos len))) (setq str (vl-string-subst new old str pos)) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
fabcad Posté(e) le 21 octobre 2009 Auteur Posté(e) le 21 octobre 2009 Bonjour à vous tous, Vraiment heureux et un grand merci pour votre aide, A+
ElpanovEvgeniy Posté(e) le 21 octobre 2009 Posté(e) le 21 octobre 2009 Je suis sur que ElpanovEvgeniy va faire un truc de ouf en récursivité ;) (defun test (s o n) (cond ((= s "") s) ((wcmatch s (strcat o "*")) (strcat n (test (substr s (1+ (strlen o))) o n))) ((strcat (substr s 1 1) (test (substr s 2) o n))) ) ;_ cond ) Evgeniy
bonuscad Posté(e) le 21 octobre 2009 Posté(e) le 21 octobre 2009 Hi Evgeniy, Very nice, and compatibility for all versions. My code is the least smart, but arguments are tested. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
ElpanovEvgeniy Posté(e) le 22 octobre 2009 Posté(e) le 22 octobre 2009 Hi bonuscad. My code, slowly works on the big texts... Evgeniy
bseb67 Posté(e) le 22 octobre 2009 Posté(e) le 22 octobre 2009 Ah ben tient, la fonction à ElpanovEvgeniy c'est la version lispde l'algo que j'ai donné :cool: Sinon, la récursivité à de son coté la simplicité et facilité (enfin pour ceuxqui en comprenne la puissance), mais un gros défaut: empilement d'appels dela fonction => si trop d'empilement = diminution des performancesvoir plantage machine car la pile est remplie. Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant