Aller au contenu

Messages recommandés

Posté(e)

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]

Posté(e)

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 fois

il 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...

Posté(e)

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+

Posté(e)

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 >= 0

une 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 faut

modifier simplement l'algo de fonction en prenant les Y ers caractères au-lieu du 1er

si tmp = ancien retourner nouveau + fonction entrée - Y caractères

sinon 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...

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

Ah ben tient, la fonction à ElpanovEvgeniy c'est la version lisp

de l'algo que j'ai donné :cool:

 

Sinon, la récursivité à de son coté la simplicité et facilité (enfin pour ceux

qui en comprenne la puissance), mais un gros défaut: empilement d'appels de

la fonction => si trop d'empilement = diminution des performances

voir plantage machine car la pile est remplie.

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité