VToine Posté(e) le 26 février 2003 Posté(e) le 26 février 2003 Bonsoir, Comme dit dans le titre, je cherche à lancer une fonction depuis une autre fonction AutoLISP. Je sais, c'est la base mais regarder le code ci-dessous et vous comprendrez la difficulté. (defun c:test () (setq Fonction '() Fonction (cons "2" Fonction) Fonction (cons "1" Fonction)) (setq Lancer (getstring "\nQuelle fonction voulez-vous tester ?")) (if (= Lancer "1") (command (strcat "(c:"(nth 0 Fonction) ")")) (command (strcat "(c:"(nth 1 Fonction) ")")) ) (princ) ) (defun c:1 () (alert "Test, fonction 1 lancée") ) (defun c:2 () (alert "Test, fonction 2 lancée") ) Voilà, comme vous l'avez sans doute compris, je cherche à lancer une fonction dont je ne connais pas à l'avance le nom (même si pour l'exemple je le connais puisque c'est 1 et 2). En fait, le programme complet lit le nom des fonctions disponible dans un fichier et les place dans une liste. Puis en fonction des valeurs calculées lance la fonction associée. Merci de votre aide. Et si vous ne comprenez pas tout, je repasse plus tard pour donner plus d'infos. Cordialement Toine
Invité Patrick Posté(e) le 26 février 2003 Posté(e) le 26 février 2003 Ben écoute, la syntaxe suivante: <? (defun c:test () m'a plutôt l'air d'être du PHP que du LISP... Fonction (cons "2" Fonction) Et là aussi, en LISP une fonction commence par une parenthèse en principe..
Patrick_35 Posté(e) le 27 février 2003 Posté(e) le 27 février 2003 Le plus simple est de passer par un initget puis un getkword dans cette applipar exemple : (defun c:test(/ selection) (defun fonction_1() (alert "Test, fonction 1 lancée")) (defun fonction_2() (alert "Test, fonction 2 lancée")) (initget "1 2") (setq selection (getkword "\nQuelle fonction voulez-vous tester ? ")) (if (= selection "1") (fonction_1) (if (= selection "2") (fonction_2) (alert "Pas de fonction") ) ) (princ)) Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
VToine Posté(e) le 27 février 2003 Auteur Posté(e) le 27 février 2003 Bonsoir, Excuses moi Patrick, j'ai relu, en vitesse le message. il fallait comprendre (defun c:test () (setq Fonction '() Fonction (cons "2" Fonction) Fonction (cons "1" Fonction)) (setq Lancer (getstring "\nQuelle fonction voulez-vous tester ?")) (if (= Lancer "1") (command (strcat "(c:"(nth 0 Fonction) ")")) (command (strcat "(c:"(nth 1 Fonction) ")")) ) (princ)) (defun c:1 () (alert "Test, fonction 1 lancée")) (defun c:2 () (alert "Test, fonction 2 lancée")) et les lignes(setq Fonction '() Fonction (cons "2" Fonction) Fonction (cons "1" Fonction))s'écrivent tout à fait en LISP, si on respecte les parenthèses. En fait, je voudrais pouvoir charger une liste de fonctions depuis un fichier texte (que l'utilisateur pourra modifier comme il le veut) et lancer ensuite la fonction désirée à la demande de l'utilisateur. Or c'est cette phase que je ne sais pas faire. Comment appler une fonction dont le nom est contenu dans une variable ? Voilà Cordailement Toine
Invité Patrick Posté(e) le 27 février 2003 Posté(e) le 27 février 2003 Regarde l'aide LISP sur la fonction (read), fonction très peu utilisée mais dans ton cas, elle pourrait être utile. Elle transformera le nom d'une fonction qui est un type de donnée STRING en symbole. Si cette fonction est définie, elle pourra être exécutée.
VToine Posté(e) le 27 février 2003 Auteur Posté(e) le 27 février 2003 Merci, je ragrde cela de suite, je teste demain et je vous tiens au courant dans la foulé. A+ Toine
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