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 :

Utiliser un compilateur scheme


Sujet :

Scheme

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 18
    Points : 10
    Points
    10
    Par défaut Utiliser un compilateur scheme
    Bonjour,

    Après avoir écrit un programme en Scheme sur DrRacket (sans utiliser de librairies propre à Racket), il me semble que le compilateur intégré à DrRacket n'est pas très performant !?
    Par rapport à "MIT/GNU Scheme" ou "Chicken" et d'autre..... ....que je n'ai pas réussi à utiliser dû au fait qu'ils soient en ligne de commande
    .....
    Est-il possible de facilement compiler un programme Racket avec un autre compilateur scheme ? ou avec un compilateur Lisp comme "Steel Bank Common Lisp" ?
    Et si oui, comment utiliser ces compilateurs en ligne de commande ? (Mon programme est en un seul fichier)

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

    Informations forums :
    Inscription : Mai 2013
    Messages : 152
    Points : 275
    Points
    275
    Par défaut
    On pourrait commencer l'optimisation par l'algorithme.

    > Est-il possible de facilement compiler un programme Racket avec un autre compilateur scheme ?

    Généralement, le code en scheme n'est pas portable, mais si tu dis que tu n'a pas utilisé rien de spécifique de Racket, il vaut la peine de l'essayer.

    > ou avec un compilateur Lisp comme "Steel Bank Common Lisp" ?

    Non, ce sont des langages tout à fait differents.

    > comment utiliser ces compilateurs en ligne de commande ? (Mon programme est en un seul fichier)

    Si tu as Linux, c'est facile. Par exemple, le compilateur de Chicken Scheme est csc. Il admet plusieures options, mais l'invocation la plus simple c'est
    Par exemple, voici un fragment de session de ligne de commande où je démontre le contenu d'un fichier, le compile et exécute le programme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    % cat helloworld.scm
    (display "Hello, world.")
    (newline)
    % csc helloworld.scm
    % ./helloworld
    Hello, world.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    > On pourrait commencer l'optimisation par l'algorithme.

    En faite, j'utilise énormément (trop ?) de vecteurs (vector) dans mon algorithme, ce qui pourrait être la cause de la lenteur,... je pourrai n'utiliser que des listes si les pointeurs existaient en schème (ce qui n'as pas l'air d’être la cas ?)

    Mon algorithme (jeu de go) (trop de lignes pour le poster):

    Un vecteur d'une taille de 19*19: quand une case à la valeur 0 c'est quel est vide, si elle a un nombre négatif = c'est un pion noir, positif = blanc.
    La valeur absolue d'un nombre non nulle est le numéro d'index réutiliser dans les vecteurs suivants:
    1) Vecteur pour le nombre de pions dans le groupe
    2) pour nombre de libertés
    3) pour une liste de chacune des positions des pions apparentent à ce même groupe (pour supprimer le groupe une fois mort)

    Je suis conscient que c'est très tiré par les cheveux -et mon explication ne doit pas pas aider - mais je n'ai pas trouver de système plus simple

    > le code en scheme n'est pas portable

    J'avais crus comprendre qu'ils étaient tous définit par une sorte de standard ?

    > Si tu as Linux, c'est facile

    Et si tu as Windows, c'est difficile..... ...... ...j'ai Windows
    Le meme procédé est aussi valable sous Windows ?

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 152
    Points : 275
    Points
    275
    Par défaut
    On dit que go est très difficile, alors rien d'étonnant que un algorithme si simple est inefficace. Il faut plus de mathématiques!

    Quant à Windows, je ne sais pas, il faut voir la documentation des implémentations concretes. Par exemple
    https://wiki.call-cc.org/compiling-c...-xp-with-mingw
    paraît un peu compliqué.

    > J'avais crus comprendre qu'ils étaient tous définit par une sorte de standard ?

    Les standards RnRS, n <= 5, sont minimalistes. Pour la plupart, les programmes sérieux utilise des extensions spécifiques, ce qui rend le code pas portable. Le standard R6RS n'est pas répandu.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    > On dit que go est très difficile, alors rien d'étonnant que un algorithme si simple est inefficace. Il faut plus de mathématiques !

    Non, on dit que l'IA de go est très difficile, ce qui semble faux (de mon point de vu simpliste): https://interstices.info/jcms/c_4386...de-monte-carlo

    Effectivement, Chicken parait plutôt tordu sur Windows...... Il n'existe pas d'autres compilateur scheme avec une interface graphique ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par MrSiuol Voir le message
    je pourrai n'utiliser que des listes si les pointeurs existaient en schème (ce qui n'as pas l'air d’être la cas ?)
    Peux-tu préciser ce que tu veux dire?

    En Scheme comme dans la plupart des lisp, il n'y a que des pointeurs.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    On peut enregistrer l'adresse d'une case d'une liste dans un vecteur ? et l'utiliser pour retrouver la valeur ensuite ?

    En fait, l'IA rependue consiste à jouer plein de parties totalement aléatoires et en exploiter les scores, actuellement je suis à 10 000 parties aléatoires pour un plateau de 9x9 en environ "real time: 6801" ..... (Le jeu normal est sur un plateau 19x19 )
    Source: https://interstices.info/jcms/c_4386...de-monte-carlo

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par MrSiuol Voir le message
    On peut enregistrer l'adresse d'une case d'une liste dans un vecteur ? et l'utiliser pour retrouver la valeur ensuite ?
    Tout-à-fait!

    Pour enregistrer l'adresse d'une case d'une liste dans un vecteur, il suffit de stocker le bon nthcdr de la liste elle-même.

    Pour retrouver la valeur ensuite, il suffit d'utiliser la fonction d'indirection d'un pointeur de liste, qui s'appelle "CAR" (à l'origine "Content of Address Register").

    par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    *** Welcome to IELM ***  Type (describe-mode) for help.
    ;; On crée une liste:
    ELISP> (setq l '(a b c))
    (a b c)
    
    ;; On stocke dans un vecteur les différents pointeurs de la liste:
    ELISP> (setq v (vector l (cdr l) (cddr l)))
    [(a b c)
     (b c)
     (c)]
    
    ;; On vérifie qu'on peut bien accéder aux éléments en utilisant la fonction d'indirection "CAR":
    ELISP> (car (aref v 0))
    a
    ELISP> (car (aref v 1))
    b
    ELISP> (car (aref v 2))
    c
    
    ;; On modifie les valeurs de la liste:
    ELISP> (setf (caddr l) 'cc)
    cc
    
    ;; On vérifie les modifications dans la liste:
    ELISP> l
    (a b cc)
    
    ELISP> (setf (cadr l) 'bb)
    bb
    
    ELISP> l
    (a bb cc)
    
    ELISP> (setf (car l) 'aa)
    aa
    
    ELISP> l
    (ab bb cc)
    
    ;; On vérifie qu'on retrouve bien les valeurs dans le vecteur:
    
    ELISP> (car (aref v 0))
    aa
    ELISP> (car (aref v 1))
    bb
    ELISP> (car (aref v 2))
    cc
    ;; CQFD

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Il semblerai que ça ne marche pas en Racket.......:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #lang racket
    (require racket/vector)
    
    (define l '(1 2 3))
    (define v (vector l (cdr l) (cddr l)))
    (newline)
    (display (vector-map (λ (a)
                           (display (car a))
                           (newline))
                           v))
    ; => 1 2 3
    ;(set! (caddr l) 42) => BUG
    (set! l (cons 42 (cdr l)))
    (newline)
    (display (vector-map (λ (a)
                           (display (car a))
                           (newline))
                           v))
    ; => 1 2 3

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par MrSiuol Voir le message
    Il semblerai que ça ne marche pas en Racket.......:
    Hum...

    LISP is made general in terms of list structure by means of the basic list operators "rplaca" and "rplacd". ...
    The Scheme procedures set-car! and set-cdr! correspond to, respectively, rplaca and rplacd.
    En Common Lisp (et d'autres lisps), on peut utiliser (setf (car l) 41) ou (rplaca l 41).
    En Scheme (autres que DrRacket), il semble qu'on puisse faire: (set-car (car l) 41).

    Il semblerait que DrRacket ne possède pas l'opérateur de base pour changer le premier élément d'une liste
    à moins qu'il n'ait un autre nom de fonction ou qu'il n'y ait un module spécifique à charger.

    En fait, il faut soit changer de langage, par exemple #lang r5rs (puis clic bouton "Exécuter") ou bien importer (require scheme/mpair) comme indiqué ici: http://stackoverflow.com/questions/9...ound-in-racket

    En fait, je préfère la programmation objet (comme CLOS), auquel cas on n'a pas d'état d'âme à modifier des champs d'un objet, contrairement à l'école purement fonctionnelle.

Discussions similaires

  1. Utilisation du compilateur VS dans NetBeans 8.1
    Par circusfile dans le forum Autres éditeurs
    Réponses: 0
    Dernier message: 28/05/2016, 09h51
  2. [POA] Utiliser le compilateur AspectC++ (et plus si affinités)
    Par pikron dans le forum Langages de programmation
    Réponses: 0
    Dernier message: 25/08/2013, 23h25
  3. [Flash Pascal] Comment utiliser le compilateur
    Par Roland Chastain dans le forum Flash Pascal
    Réponses: 3
    Dernier message: 21/02/2012, 10h21
  4. Utiliser le compilateur de Microsoft sur Code::Blocks
    Par Irken dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 09/09/2007, 20h26
  5. utilisation de dll avec diverses compilateurs
    Par Thylia dans le forum C++
    Réponses: 30
    Dernier message: 21/10/2004, 16h30

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