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
    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
    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
    > 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
    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
    > 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é
    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
    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é
    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
    *** 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
    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 (&#955; (a)
                           (display (car a))
                           (newline))
                           v))
    ; => 1 2 3
    ;(set! (caddr l) 42) => BUG
    (set! l (cons 42 (cdr l)))
    (newline)
    (display (vector-map (&#955; (a)
                           (display (car a))
                           (newline))
                           v))
    ; => 1 2 3

  10. #10
    Expert confirmé
    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.