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 :

define ou defun ?


Sujet :

Scheme

  1. #1
    Membre régulier Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Points : 114
    Points
    114
    Par défaut define ou defun ?
    Bonjour,

    Je viens de récupérer un code source LISP.
    Je le copie/colle dans mon DrScheme 4.1.1 avec le langage "Essentials of Programming Languages".
    DrScheme me dit que la fonction defun utilisée n'existe pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    reference to undefined identifier: defun
    Dans la documentation Scheme, on n'évoque pas la présence d'une fonction defun.
    De plus, j'ai toujours appris à définir des fonctions en Scheme avec define.
    Comment faire pour que DrScheme puisse correctement interpréter ce code source?
    Merci.

    PS : la source en question est ici.

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Scheme est un dialecte de Lisp. Common Lisp en est un autre. Il y a donc des différence de syntaxe.

    Alors comment faire pour utiliser un programme C++ en C ? Le recoder pour qu'il fonctionne en C.

    C'est à peu près la même idée. Dans le meilleur des cas, il te suffira de déclarer une macro qui s'appelle defun et qui n'est qu'un define (attention macro obligatoire pas une simple fonction). Mais il y a d'autre différences de syntaxe (setq -> set!, null -> null? etc.) et de sémantique (la liste vide est la valeur fausse en CLisp mais pas en Scheme). Si la différence est plus profonde : tu recodes.

    Vu le programme, il est possible que des simples macro suffisent. Maintenant c'est tellement petit que si tu n'as jamais vu les macros en Scheme t'es mieux de tout recoder pour être sûr.

  3. #3
    Membre régulier Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Points : 114
    Points
    114
    Par défaut
    Dans ce cas, j'aimerai bien déclarer une macro qui s'appelle defun et qui n'est qu'un define.
    J'ai trouvé la fonction Scheme define-macro que j'ai utilisé ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ; macro defun
    (define-macro defun define)
    Malheureusement, il semblerait que ce ne soit pas si simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    define: bad syntax in: define
    Un peu d'aide?

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par YuGiOhJCJ Voir le message
    Dans ce cas, j'aimerai bien déclarer une macro qui s'appelle defun et qui n'est qu'un define.
    J'ai trouvé la fonction Scheme define-macro que j'ai utilisé ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ; macro defun
    (define-macro defun define)
    Malheureusement, il semblerait que ce ne soit pas si simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    define: bad syntax in: define
    Un peu d'aide?
    Mais dans quel cadre as-tu besoin de ça ?
    Tu vas vite te sentir dépasser par les macros.
    Voici celle que tu veux. Il n'est pas dans mon habitude de donner une solution toute cuite, mais bon ça serait très long de t'expliquer le mécanisme des macros si tu n'as pas vu ça en classe.
    Code plt-scheme 4.15 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (require mzlib/defmacro)
    (define-macro (defun . l)
      `(define ,@l))
    
    (defun (f x) (+ x 1))
    (f 5)

  5. #5
    Membre régulier Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Points : 114
    Points
    114
    Par défaut
    J'ai besoin de cela dans le cadre de mes études.
    Ce n'est pas dans mon habitude d'utiliser des concepts que je ne comprends pas (en l'occurrence, des macros).
    Dans ce cas j'ai préfère pour l'instant tout simplement remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ;Modifications apportees au fichier LISP pour une
    ;compatibilite Scheme :
    ;   1) (defun foo (x))->(define (foo x))
    ;   2) eq->eq?
    ;   3) defvar->define
    Avec ces 3 remplacements, Scheme parvient à interpréter le fichier.
    Tant pis pour les macros, je vais devoir lire de bons tutoriaux sur les macros...

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par YuGiOhJCJ Voir le message
    [...]
    Dans ce cas j'ai préfère pour l'instant tout simplement remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ;Modifications apportees au fichier LISP pour une
    ;compatibilite Scheme :
    ;   1) (defun foo (x))->(define (foo x))
    ;   2) eq->eq?
    ;   3) defvar->define
    Je pense que c'est un bon choix.
    Si tu vois des comportements étranges, n'hésites pas à venir poser des questions. Il existe des petites distinctions entre Scheme et CommonLisp dont il faut se méfier.

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

Discussions similaires

  1. #define D3D_DEBUG_INFO
    Par moldavi dans le forum DirectX
    Réponses: 7
    Dernier message: 03/02/2005, 14h14
  2. INSO Filter : "USER-defined exception" avec ctx_do
    Par Wiztiti dans le forum Oracle
    Réponses: 2
    Dernier message: 01/06/2004, 16h14
  3. USER DEFINE FONCTION : PB éxécution requête
    Par juelo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/01/2004, 11h12
  4. Define sur plusieurs lignes
    Par Gogoye dans le forum C
    Réponses: 6
    Dernier message: 06/10/2003, 11h45
  5. define avec GCC.
    Par vagabon dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 12/06/2003, 14h04

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