IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scheme Discussion :

Un programme auto-modifiant — des étoiles dans les yeux.


Sujet :

Scheme

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 18
    Par défaut Un programme auto-modifiant — des étoiles dans les yeux.
    Hello,
    Je ne vais pas le cacher plus longtemps, si je me met au Scheme c'est surtout parce qu'il promet de manipuler les instructions comme des données — promesse wikipédia !
    Je voudrais que le programme puisse lui même se changer pendant son exécution.
    J'ai donc essaye quelque chose comme ça, mais sans succé, helas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (define fnc '(lambda (a) (print a)))
    
    ;; test
    (eval (fnc "OK"))
    Si quelqu'un sait comment utiliser ce genre de programmation ....

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 153
    Par défaut
    Bon, de nos jours eval n'est pas particulier à lisp, bien que ce soit été lisp (je pense) qui l'ait introduit.

    Un programme tipique en lisp est constitué de listes, dont une partie majeure des éléments sont des symboles. En exécutant les instructions lisp évalue les listes selon des régles définies. Par exemple, par défaut la régle d'évaluation d'une list c'est en évaluer les éléments et appliquer le premier élément (qui doit être une fonction) aux autres. Mais il n'y a pas de séparation stricte entre listes comme instructions et listes comme données. On peut bloquer l'évaluation d'une liste en utilisant l'apostrophe ou évaluer un instruction présentée en forme de donnée avec eval.

    Dans ton exemple fnc est le liste de trois éléments, dont le premier est le symbole lambda, le deuxième est lui-même la liste, (a), et la troisieme est aussi une liste, (print a). Ici lambda, print et a sont des symboles comme tout les autres. Si lisp exécutait la liste, lambda et print auraient une signification spéciale, mais l'apostrophe bloque l'évaluation et comme données ils ne sont pas particulières.

    Comme fnc est une list, tu peux l'évaluer:
    Le résultat est une fonction.

    Pourquoi ton exemple avec eval ne marche pas ? eval est une fonction, alors la règre d'évaluation est ordinaire: il faut évaluer les arguments et appliquer la fonction. L'argument, c'est (fnc "OK"). C'est une liste à évaluer. Le premier élément est une variable, dont la valeur est une liste. Mais le premier élément doit être une fonction ! Ça cause un erreur.

    Tu pouvais essayer comme ça :
    Malheureusement, sa ne marcherait non plus. Ici eval obtient une liste (donnée!) et essaie de l'évaluer. A ce qui paraît, le premier élément de la liste est une variable, fnc. Dans notre environnement elle a une valeur, mais eval évalue les listes dans l'environnement nulle. C'est-à-dire, en évaluant il ne prend pas en compte nos définitions. Alors, c'est un erreur.

    Heureusement, Scheme (mais pas Common Lisp) permet de fournir l'environnement à eval:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (eval '(fnc "OK") (interaction-environment))
    Ici eval évalue en sachant la valeur de fnc. Mais cette valeur est une liste! Alors, it devrait appliquer une liste à une chaîne, ce qui est un erreur.

    En effet, nous voudrions qu'eval évalue la liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (eval '((lambda (a) (print (a))) "OK"))
    ce qui ne produit pas d'erreurs. Mais il est facile d'obtenir la liste ((lambda (a) (print (a))) "OK") à partir de fnc:
    marche. Ici l'appelle intérieur à list substitue la valeur de la variable fnc.

    eval n'est pas très pratique : il ne joue pas bien avec le contexte et il faut absolument valider les données à évaluer provenantes des sources extérieures.

    L'homoiconicité permet aussi un autre méchanisme puissant: les macros. Ils sont la vraie spécialité de lisp. L'idée est simple et intelligible : on peut transformer une liste avant de l'évaluer.

    Moi, je suis plutôt familier avec les macros de Common Lisp. Là, les macros sont des fonctions écrites en lisp ordinaire qui transforment leurs arguments en une forme à évaluer. En Scheme « classique », les macros sont plus compliqués et moins puissants qu'en Common Lisp, voire par exemple http://wiki.call-cc.org/man/4/Macros Je ne comprenais jamais bien ni le méchanisme de leur « hygiène » ni la syntaxe particulière pour les définer. En Racket, les macros sont très puissants, mais trop compliqués pour moi. En Common Lisp, les instructions sont envisagées comme listes, mais en Racket elles sont regardées comme « syntax objects ». Ben, ça peut être plus puissant, mais je dirais que c'est moins transparent et je ne suis pas sûr si c'est l'homoiconicité ou pas.

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par MrSiuol Voir le message
    J'ai donc essaye quelque chose comme ça, mais sans succé, helas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (define fnc '(lambda (a) (print a)))
    
    ;; test
    (eval (fnc "OK"))
    Si quelqu'un sait comment utiliser ce genre de programmation ....
    byjav t'a indiqué comment corriger l'erreur (ajouter un quote devant la 2ème parenthèse ouvrante).

    Citation Envoyé par MrSiuol Voir le message
    Je voudrais que le programme puisse lui même se changer pendant son exécution.
    Pourrais-tu décrire plus précisément quel genre de changement tu voudrais que le programme fasse?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 18
    Par défaut
    En faite, j'aimerai essayé de faire de la programmation génétique - très simple, bien sur !
    J'ai vu cette article et j'ai voulu essayer en lisp: Article !

    Je voulais donc commencer par manipuler les programmes créés en les stockant sous forme de list.
    Je n'ai pas réussi à faire marcher aucun des exemples, ils sont tous rejetés ....

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par MrSiuol Voir le message
    En faite, j'aimerai essayé de faire de la programmation génétique - très simple, bien sur !
    J'ai vu cette article et j'ai voulu essayer en lisp: Article !
    Amusant! J'ai un cousin spécialisé dans ce domaine!

    Je voulais donc commencer par manipuler les programmes créés en les stockant sous forme de list.
    Je n'ai pas réussi à faire marcher aucun des exemples, ils sont tous rejetés ....
    Peux-tu indiquer quel environnement lisp/scheme tu utilises?

    Qu'as-tu essayé précisément et quelle est la forme du rejet que tu as observé?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 18
    Par défaut
    Je travail sous DrRacket.
    L'erreur est:
    "fnc: unbound identifier;
    also, no #%app syntax transformer is bound in: fnc"
    Faut-il que je change d'environnement ? ou bien existe t-il une autre méthode ?

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 153
    Par défaut
    C'est en réponse à quoi ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilité des Blocs dans les programmes et JCL
    Par midonet7 dans le forum JCL - SORT
    Réponses: 10
    Dernier message: 19/02/2015, 01h23
  2. [AC-2003] Gestion des erreurs dans les sous-programmes
    Par azertix dans le forum VBA Access
    Réponses: 2
    Dernier message: 26/10/2010, 11h13
  3. modifier des tables dont les noms sont dans une autre
    Par lapin_did dans le forum Requêtes
    Réponses: 1
    Dernier message: 06/09/2010, 09h45
  4. Réponses: 1
    Dernier message: 10/06/2010, 08h03
  5. Modifier des fichiers dans les rep users automatiquement
    Par mazou dans le forum Windows Serveur
    Réponses: 4
    Dernier message: 06/09/2007, 09h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo