CADxp: quote quote - CADxp

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

quote quote

#1 L'utilisateur est hors-ligne   GEGEMATIC 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 661
  • Inscrit(e) : 04-novembre 05

Posté 05 mai 2015 - 15:53

salut à tous,
empêtré dans la migration vers 2015, je me bas avec les command-s.
comme je veux pouvoir gérer plusieurs version et que command-s ne marche pas avec la 2012,
j'essaie plutôt de remplacer par vl-cmdf (plutôt que de devoir tester les versions)
et là j'ai cette curiosité :

(progn(setq lpt (pw_poly_buffer (enam) 1))
   (eval (append '(VL-CMDF "_pline") (mapcar 'quote lpt) '("_close"))))


qui marche très bien, sauf que tous les points sont confondus :
(setq lpt ((-4007.29 77.6245) (-3836.77 115.533) (-3831.78 114.556) (-3832.16 112.594) (-3836.75 113.49) (-4006.85 75.6722)))
(mapcar 'quote lpt) -> 
((quote (-4006.85 75.6722)) (quote (-4006.85 75.6722)) (quote (-4006.85 75.6722)) (quote (-4006.85 75.6722)) (quote (-4006.85 75.6722)) (quote (-4006.85 75.6722)))


Bizarre ou tout à fait logique ?

Gégé
---------------------------------------------------------------------- PowerClic sur http://www.g-eaux.com
0

#2 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 10687
  • Inscrit(e) : 02-septembre 05

Posté 05 mai 2015 - 17:50

Salut,

C'est curieux en effet.
Je pense que c'est dû à la fonction quote.

J'ai toujours pensé que mapcar était implémentée un peu comme ça :
(defun map (f l)
  (if l
    (cons ((eval f) (car l)) (map f (cdr l)))
  )
)

Or ceci ne fonctionne pas avec quote (contrairement aux autres fonctions), par contre, en utilisant apply à la place de eval, ça marche :
(defun map (f l)
  (if l
    (cons (apply f (list (car l))) (map f (cdr l)))
  )
)

et l'expression :
(eval (append '(VL-CMDF "_pline") (map 'quote lpt) '("_close"))))
dessine bien la polyligne.

Dans tous les cas, je préfèrerais faire :
(vl-cmdf "_.pline")
(mapcar 'vl-cmdf lpt)
(vl-cmdf "_close")]

ou, mieux parce que le mapcar n'est pas utile dans ce cas :
(vl-cmdf "_.pline")
(foreach p lpt (vl-cmdf p))
(vl-cmdf "_close")

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
Image IPB
0

#3 L'utilisateur est hors-ligne   GEGEMATIC 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 661
  • Inscrit(e) : 04-novembre 05

Posté 06 mai 2015 - 07:26

Voir le message(gile), le 05 mai 2015 - 17:50 , dit :

Salut,
Salut Gile,

J'ai toujours pensé que mapcar était implémentée un peu comme ça :
(defun map (f l)
  (if l
    (cons ((eval f) (car l)) (map f (cdr l)))
  )
)

Or ceci ne fonctionne pas avec quote (contrairement aux autres fonctions)

Il faut dire que le quote est un peu la fonction "originelle" du lisp, parfois j'en perds un peu la compréhension.
D'ailleur un mapcar quote, quoique logique, me paraissais assez rigolo

Citation

ou, mieux parce que le mapcar n'est pas utile dans ce cas :
(vl-cmdf "_.pline")
(foreach p lpt (vl-cmdf p))
(vl-cmdf "_close")


J'ai toujours utilisé le mapcar 'command par fainéantise,
et je croyais que le vl-cmdf était l'équivalent de command-s, obligeant à donner tous les arguments dès le début (c'est ce qu'explique l'aide lisp)
mais en fait vl-cmdf est un mix entre command et command-s, et à ce titre ne me sortira pas d'affaire:
j'ai eu des erreurs VVC: Internal error avec un simple (vl-cmdf "_redraw"), qui n'est même pas imbriqué dans un mapcar.

il y a des parties centrales de mes programmes pour lesquelle j'ai supprimé depuis longtemps la plupart des appels command par des methodes plus propres,
mais pour beaucoup de petits utilitaires, j'utilise command, et je vais avoir beaucoup de mal à migrer toutes ces petites routines.
---------------------------------------------------------------------- PowerClic sur http://www.g-eaux.com
0

#4 L'utilisateur est hors-ligne   VDH-Bruno 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 898
  • Inscrit(e) : 29-avril 10

Posté 21 juillet 2015 - 14:37

Bonjour,

Je viens seulement de découvrir ce sujet qui à également éveillé ma curiosité. Après quelques teste je vous en donne ma lecture.

Voir le messageGEGEMATIC, le 05 mai 2015 - 15:53 , dit :

Bizarre ou tout à fait logique ?

Logique et bizarre (peut être pas…)

La fonction quote n'est pas une fonction neutre, elle bloque l'évaluation de l'expression qui suit. Par exemple si on tentait une écriture équivalente à ce qui a été codé précédemment via une fonction lambda on aurait:
_$ (mapcar '(lambda (x) (quote x)) '(A B C D E))
(X X X X X)


Et sans fonction lambba on a:
_$ (mapcar 'quote '(A B C D E))
((quote E) (quote E) (quote E) (quote E) (quote E))

La fonction enveloppante lambda n'évaluant plus l'expression quote, c'est l'ensemble de l'expression qui est retourné. Plus précisément la dernière expression, je pense également qu'en interne la fonction est définie de façon récursive et que le quote doit bloquer successivement l'évaluation et donc la substitution des arguments dans la remontée des appels enveloppant.

Donc dans ce cas particulier propre au fonctionnement de la fonction quote, il faut "quoté" le quote (clin d'œil à l'entête du post ;) ) pour que cela fonctionne:
_$ (mapcar '(lambda (x) (list 'quote x)) '(A B C D E))
((QUOTE A) (QUOTE B) (QUOTE C) (QUOTE D) (QUOTE E))


Expression qui fonctionne très bien (également avec command) sous ma veille version 2007 à tester sur une version récente:
_$ (setq lpt '((-4007.29 77.6245) (-3836.77 115.533) (-3831.78 114.556) (-3832.16 112.594) (-3836.75 113.49) (-4006.85 75.6722)))
((-4007.29 77.6245) (-3836.77 115.533) (-3831.78 114.556) (-3832.16 112.594) (-3836.75 113.49) (-4006.85 75.6722))
_$ (eval (append '(VL-CMDF "_pline")  (mapcar '(lambda (x) (list 'quote x)) lpt) '("_close")))
T


Amicalement Bruno
Apprendre => Prendre => Rendre
0

#5 L'utilisateur est hors-ligne   VDH-Bruno 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 898
  • Inscrit(e) : 29-avril 10

Posté 21 juillet 2015 - 15:07

Salut,

Voir le message(gile), le 05 mai 2015 - 17:50 , dit :

J'ai toujours pensé que mapcar était implémentée un peu comme ça :
(defun map (f l)
  (if l
    (cons ((eval f) (car l)) (map f (cdr l)))
  )
)

Or ceci ne fonctionne pas avec quote (contrairement aux autres fonctions), par contre, en utilisant apply à la place de eval, ça marche :
(defun map (f l)
  (if l
    (cons (apply f (list (car l))) (map f (cdr l)))
  )
)


En fait ce qui pose problème sont les fonctions qualifiés de"formes spéciales", elles doivent être "quoté" et ne peuvent donc être évalués puis associés à leurs arguments comme les autres "opérateur Lisp", il faut impérativement construire l'expression puis évaluer cette dernière (avec un eval enveloppant).

Pour un mapcar générique sans apply, l'implémentation Lisp ressemble à quelque chose comme cela:
(defun map (f l)
  (if l
    (cons (eval (list f (car l))) (map f (cdr l)))
  )
)


Amicalement Bruno
Apprendre => Prendre => Rendre
0

#6 L'utilisateur est hors-ligne   VDH-Bruno 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 898
  • Inscrit(e) : 29-avril 10

Posté 22 juillet 2015 - 11:21

Voir le messageVDH-Bruno, le 21 juillet 2015 - 15:07 , dit :

Pour un mapcar générique sans apply, l'implémentation Lisp ressemble à quelque chose comme cela:
(defun map (f l)
  (if l
    (cons (eval (list f (car l))) (map f (cdr l)))
  )
)



Après réflexion, l'écriture suivante me semble plus juste…
(defun map (f l)
  (if l
    (cons (eval (list f (list 'quote (car l)))) (map f (cdr l)))
  )
)

A+ Bruno
Apprendre => Prendre => Rendre
0

Partager ce sujet :


Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)