Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
910 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Un petit "chalenge contest" pour perdre son temps

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Un petit "chalenge contest" pour perdre son temps

n°1237994
nlc
Le mieux est l'ennemi du bien
Posté le 03-11-2005 à 18:50:36  profilanswer
 

Le but du jeu, ecrire un programme en C qui affiche son propre code source.
 
Exemple :
 
main.c :
int main ( void )
{
 // Code
}
 
Une fois compilé et executé, il doit afficher :
 
int main ( void )
{
 // Code
}
 
Au boulot !  :bounce:  
 


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
mood
Publicité
Posté le 03-11-2005 à 18:50:36  profilanswer
 

n°1238005
juju286
Posté le 03-11-2005 à 18:59:42  profilanswer
 

c'est vraiment pas difficile.
T'écris un prog qui prend en argument un fichier, qui retranscrit caractère par caractère ou ligne pas ligne de fichier.
--->
$ prog.x prog.c

n°1238012
nlc
Le mieux est l'ennemi du bien
Posté le 03-11-2005 à 19:06:23  profilanswer
 

hehe :)
Sans faire ca evidement......
 
Bien sur je ne l'avais pas precisé, mais ca me paraissait logique car sinon c'est pas un contest :)))))
 
Donc le but du jeu, c'est que le programme, une fois compilé et executé, affiche son propre code source, sans qu'on lui passe en parametre le fichier source, et sans que le programme lise l'entrée standard...
 
Un truc qui ressemblerait a ca quoi :
 
#include <stdio.h>
 
void main ( void )
{
 printf( "#include <stdio.h>\n\nvoid main ( void )\n{...........}" );
}
 
 
 


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
n°1238129
Du caca da​ns l tuyau
Ca me brouille l'écoute
Posté le 03-11-2005 à 20:36:29  profilanswer
 

heuu... t'est sur que ca se fait en mois de six mois de code?

n°1238143
Taz
bisounours-codeur
Posté le 03-11-2005 à 20:43:03  profilanswer
 

Code :
  1. char *p="char *p=%c%s%c;main(){printf(p,34,p,34);}";main(){printf(p,34,p,34);}

n°1238147
thoduv
Posté le 03-11-2005 à 20:47:01  profilanswer
 

Mais c'est impossible ? Un desassembleur qui transforme de l'asm en C ...

n°1238148
masklinn
í dag viðrar vel til loftárása
Posté le 03-11-2005 à 20:48:06  profilanswer
 

nlc a écrit :

hehe :)
Sans faire ca evidement......
 
Bien sur je ne l'avais pas precisé, mais ca me paraissait logique car sinon c'est pas un contest :)))))
 
Donc le but du jeu, c'est que le programme, une fois compilé et executé, affiche son propre code source, sans qu'on lui passe en parametre le fichier source, et sans que le programme lise l'entrée standard...


Ca, ca voudrait dire ouvrir l'exécutable (habituellement passé en argv[0]), le décompiler intégralement, le reformatter et l'afficher [:petrus75]
 
 
lol [:petrus75]
(accessoirement, en Python ça prend 4 lignes)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1238152
Elmoricq
Modérateur
Posté le 03-11-2005 à 20:50:43  profilanswer
 

masklinn a écrit :

(accessoirement, en Python ça prend 4 lignes)


 
Ah ?
 
Remarque, en PERL c'est pareil, ça va assez vite à faire.  [:petrus75]

n°1238156
masklinn
í dag viðrar vel til loftárása
Posté le 03-11-2005 à 20:52:59  profilanswer
 

Elmoricq a écrit :

Ah ?
 
Remarque, en PERL c'est pareil, ça va assez vite à faire.  [:petrus75]


Ben ouais, il y a un package appelé "inspect" dans la lib standard [:cupra]
 

import inspect
 
# Ton bordel de code
 
# Uniquement si ce fichier est celui exécuté :o
if __name__=="__main__":
    # On récupère le nom de module du fichier courant  
    # (en fait on récupère l'objet module correspondant au fichier courant)
    currentModule = __import__(inspect.getmodulename(__file__))
    # Et on récupère le source du dit module
    print inspect.getsource(currentModule)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1238165
Taz
bisounours-codeur
Posté le 03-11-2005 à 20:55:15  profilanswer
 

aucune différence avec lire le fichier directement ...

mood
Publicité
Posté le 03-11-2005 à 20:55:15  profilanswer
 

n°1238166
Elmoricq
Modérateur
Posté le 03-11-2005 à 20:56:26  profilanswer
 

Taz a écrit :

aucune différence avec lire le fichier directement ...


 
Je pensais davantage à cette solution qu'à celle d'un module lambda.  [:petrus75]  

n°1238167
masklinn
í dag viðrar vel til loftárása
Posté le 03-11-2005 à 20:56:28  profilanswer
 

Taz a écrit :

aucune différence avec lire le fichier directement ...


À part le fait qu'on puisse récupérer le source d'un .pyc ou d'un .pyo, ce qui est un peu plus difficile en lisant __file__ via un "open" [:petrus75]
 
Et accessoirement inspect permet également de récupérer le code d'une fonction et autres conneries. Il est marrant ce module


Message édité par masklinn le 03-11-2005 à 20:57:19

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1238172
thoduv
Posté le 03-11-2005 à 21:00:46  profilanswer
 

En plus un décompileur ne pourra jamais afficher les commentaires ni les directives du préprocesseur puisqu'ils ne sont pas compilés. Bref à mon avis c'est difficilement faisable voire impossible.

n°1238176
nlc
Le mieux est l'ennemi du bien
Posté le 03-11-2005 à 21:02:44  profilanswer
 

Ben non vous voyez bien que c'est faisable !
 
Taz a donné un exemple :
 

Code :
  1. char *p="char *p=%c%s%c;main(){printf(p,34,p,34);}";main(){printf(p,34,p,34);}


 
Bon, je suis pas sûr qu'il soit de lui ;), mais le principe est là !
 
En voilà un autre (pas de moi non plus) :
 

Code :
  1. main(){char *c="main(){char *c=%c%s%c;printf(c,34,c,34);}";printf(c,34,c,34);}


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
n°1238180
Elmoricq
Modérateur
Posté le 03-11-2005 à 21:06:59  profilanswer
 

nlc a écrit :

Bon, je suis pas sûr qu'il soit de lui ;), mais le principe est là !


 
Ca va lui faire plaisir. :D
 

nlc a écrit :


En voilà un autre (pas de moi non plus) :
 

Code :
  1. main(){char *c="main(){char *c=%c%s%c;printf(c,34,c,34);}";printf(c,34,c,34);}



 
C'est le même.
 
Tu as compris ce que faisait cet exemple, au moins ?
 
Parce que c'est la même chose, en plus tordu, de faire un programme qui se contente de s'afficher le source. [:spamafote]

n°1238183
masklinn
í dag viðrar vel til loftárása
Posté le 03-11-2005 à 21:08:18  profilanswer
 

nlc a écrit :

Ben non vous voyez bien que c'est faisable !
 
Taz a donné un exemple :
 

Code :
  1. char *p="char *p=%c%s%c;main(){printf(p,34,p,34);}";main(){printf(p,34,p,34);}


 
Bon, je suis pas sûr qu'il soit de lui ;), mais le principe est là !


Tu peux m'expliquer l'intérêt profond de faire ça? À part faire un copier/coller du code et rajouter des printf je veux dire [:petrus75]
 
edit: comme elmoricq l'indique, c'est équivalent (et plus lourd) à ouvrir le fichier source et à l'afficher [:petrus75]
 
Taz >
 
1- Fichier .py

C:\>test.py
Methode 1: file()
 
import inspect
 
if __name__=="__main__":
    print "Methode 1: file()\n"
    for l in file(__file__):
        print l,
    print"\n\n\nMethode 2: inspect\n"
    currentPackage = __import__(inspect.getmodulename(__file__))
    print inspect.getsource(currentPackage)
 
 
Methode 2: inspect
 
import inspect
 
if __name__=="__main__":
    print "Methode 1: file()\n"
    for l in file(__file__):
        print l,
    print"\n\n\nMethode 2: inspect\n"
    currentPackage = __import__(inspect.getmodulename(__file__))
    print inspect.getsource(currentPackage)


2- Fichier .pyc

C:\>test.pyc
Methode 1: file()
 
m≥
█njCc        ♥   @   sf   d  k  Z  e☺ d☺ j☻ oL ☺d☻ GHx↑ e☻ e♥ â☺ D]
 Z♦ e♦ Gq( Wd♥ GHe♣ e  i♠ e♥ â☺ â☺ Z e  e â☺ GHn☺ ☺d  S(♦      __main__s↕   Meth
ode 1: file()
s▬
 
 
Methode 2: inspect
(          t   inspect   __name__t♦   file   __file__t☺   lt
   getmodulenamet♫   currentPackaget       getsource(♥      R☺   R♣   (    (
 ☺♣☺§☺ \Administrator\Desktop\test.pyt☺   ?☺   s►       ☻
 
 
Methode 2: inspect
 
import inspect
 
if __name__=="__main__":
    print "Methode 1: file()\n"
    for l in file(__file__):
        print l,
    print"\n\n\nMethode 2: inspect\n"
    currentPackage = __import__(inspect.getmodulename(__file__))
    print inspect.getsource(currentPackage)


[:petrus75]

Message cité 1 fois
Message édité par masklinn le 03-11-2005 à 21:09:21

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1238198
nlc
Le mieux est l'ennemi du bien
Posté le 03-11-2005 à 21:14:44  profilanswer
 

Elmoricq a écrit :

Ca va lui faire plaisir. :D
 
 
 
C'est le même.
 
Tu as compris ce que faisait cet exemple, au moins ?
 
Parce que c'est la même chose, en plus tordu, de faire un programme qui se contente de s'afficher le source. [:spamafote]


 
 
Pourquoi tant de N  :ouch:  :ouch:  :ouch:  
 
Evidemment que j'ai compris comment marchait cet exemple !
 
Je pige pas ce que t'as voulu dire : Parce que c'est la même chose, en plus tordu, de faire un programme qui se contente de s'afficher le source. ??
 
Sinon en voila un autre que je trouve exceptionnel, car non seulement il affiche son propre code source, mais c'est un palindrome !!
 

Code :
  1. /**/char q='"',*a="*//**/char q='%c',*a=%c%s%c*/};)b(stup;]d[b=]d-472[b)--d(elihw;)q,a,q,q,2+a,b(ftnirps;)b(stup{)(niam;731=d tni;]572[b,",b[275];int d=137;main(){puts(b);sprintf(b,a+2,q,q,a,q);while(d--)b[274-d]=b[d];puts(b);}/*c%s%c%=a*,'c%'=q rahc/**//*"=a*,'"'=q rahc/**/



---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
n°1238200
Elmoricq
Modérateur
Posté le 03-11-2005 à 21:17:03  profilanswer
 

C'est un concours d'obfuscation ou quoi ? :heink:

n°1238202
nlc
Le mieux est l'ennemi du bien
Posté le 03-11-2005 à 21:17:42  profilanswer
 

masklinn a écrit :

Tu peux m'expliquer l'intérêt profond de faire ça? À part faire un copier/coller du code et rajouter des printf je veux dire [:petrus75]
 
edit: comme elmoricq l'indique, c'est équivalent (et plus lourd) à ouvrir le fichier source et à l'afficher [:petrus75]
 
Taz >
 
1- Fichier .py

C:\>test.py
Methode 1: file()
 
import inspect
 
if __name__=="__main__":
    print "Methode 1: file()\n"
    for l in file(__file__):
        print l,
    print"\n\n\nMethode 2: inspect\n"
    currentPackage = __import__(inspect.getmodulename(__file__))
    print inspect.getsource(currentPackage)
 
 
Methode 2: inspect
 
import inspect
 
if __name__=="__main__":
    print "Methode 1: file()\n"
    for l in file(__file__):
        print l,
    print"\n\n\nMethode 2: inspect\n"
    currentPackage = __import__(inspect.getmodulename(__file__))
    print inspect.getsource(currentPackage)


2- Fichier .pyc

C:\>test.pyc
Methode 1: file()
 
m≥
█njCc        ♥   @   sf   d  k  Z  e☺ d☺ j☻ oL ☺d☻ GHx↑ e☻ e♥ â☺ D]
 Z♦ e♦ Gq( Wd♥ GHe♣ e  i♠ e♥ â☺ â☺ Z e  e â☺ GHn☺ ☺d  S(♦      __main__s↕   Meth
ode 1: file()
s▬
 
 
Methode 2: inspect
(          t   inspect   __name__t♦   file   __file__t☺   lt
   getmodulenamet♫   currentPackaget       getsource(♥      R☺   R♣   (    (
 ☺♣☺§☺ \Administrator\Desktop\test.pyt☺   ?☺   s►       ☻
 
 
Methode 2: inspect
 
import inspect
 
if __name__=="__main__":
    print "Methode 1: file()\n"
    for l in file(__file__):
        print l,
    print"\n\n\nMethode 2: inspect\n"
    currentPackage = __import__(inspect.getmodulename(__file__))
    print inspect.getsource(currentPackage)


[:petrus75]


 
 
Heu.... mais tu n'as pas du bien comprendre...
Le but du jeu c'est de la faire en C, et si tu crois que faire ce genre de chose est aussi simple que de faire un copié collé du code source dans un printf, essaye d'en faire un pour voir !
 
Evidemment ca n'a aucun interet, c'est juste pour se remuer un peu les neuronnes  :pt1cable:  
 


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
n°1238205
Elmoricq
Modérateur
Posté le 03-11-2005 à 21:19:33  profilanswer
 

nlc a écrit :

Heu.... mais tu n'as pas du bien comprendre...
Le but du jeu c'est de la faire en C, et si tu crois que faire ce genre de chose est aussi simple que de faire un copié collé du code source dans un printf, essaye d'en faire un pour voir !


 
 [:orly2]

n°1238212
masklinn
í dag viðrar vel til loftárása
Posté le 03-11-2005 à 21:23:40  profilanswer
 

nlc a écrit :

Heu.... mais tu n'as pas du bien comprendre...
Le but du jeu c'est de la faire en C, et si tu crois que faire ce genre de chose est aussi simple que de faire un copié collé du code source dans un printf, essaye d'en faire un pour voir !


T'es brave, mais ce que tu postes (dernier compris) ce n'est rien de plus que stocker tout le source dans une chaîne de caractère et l'afficher deux fois de suite [:petrus75]
Le dernier étant original parce qu'il stocke le source en inverse (puis le retourne grâce à "while(d--) b[274-d]=b[d];" ) et ajoute un commentaire en fin de code pour les bouts qui manquent (/*c%s%c%=a*,'c%'=q rahc/**//*"=a*,'"'=q rahc/**/ est un unique commentaire)

Message cité 2 fois
Message édité par masklinn le 03-11-2005 à 21:26:05

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1238214
el muchach​o
Comfortably Numb
Posté le 03-11-2005 à 21:24:07  profilanswer
 

Et hop une page sur les programmes qui produisent leur propre source par un élève de l'ENS.
http://www.madore.org/~david/computers/quine.html

Message cité 1 fois
Message édité par el muchacho le 03-11-2005 à 21:31:47
n°1238224
masklinn
í dag viðrar vel til loftárása
Posté le 03-11-2005 à 21:30:34  profilanswer
 

el muchacho a écrit :

Et hop une page sur les programmes qui produisent leur propre source par un élève de l'ENS.
http://www.madore.org/~david/computers/quine.html


Les exemples de bootstrapping sont jolis là par contre :jap:  
 
Et les exemples en Scheme (ou tout dialecte de Lisp) un peu faciles [:ddr555]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1238227
el muchach​o
Comfortably Numb
Posté le 03-11-2005 à 21:33:34  profilanswer
 

masklinn a écrit :

Les exemples de bootstrapping sont jolis là par contre :jap:  
 
Et les exemples en Scheme (ou tout dialecte de Lisp) un peu faciles [:ddr555]


Tu veux parler de l'interpréteur scheme écrit en Scheme qui interprète un interpréteur Scheme, qui interprète...  :D  
 
Sinon le prog de Taz se trouve la-dedans:  
http://www.madore.org/~david/misc/ [...] ck/selfrep
(sacrée maitrise du shell :sweat:, les mecs de l'ENS sont décidément des E.T.)
 
edit: putain, il donne même un exemple en Postscript. :sweat:  
Sachant comment ce langage est merdique, il avait vraiment rien à foutre de ses uits en salle S, le père Madore :sweat:

Message cité 1 fois
Message édité par el muchacho le 03-11-2005 à 21:38:05
n°1238231
nlc
Le mieux est l'ennemi du bien
Posté le 03-11-2005 à 21:35:44  profilanswer
 

masklinn a écrit :

T'es brave, mais ce que tu postes (dernier compris) ce n'est rien de plus que stocker tout le source dans une chaîne de caractère et l'afficher deux fois de suite [:petrus75]
Le dernier étant original parce qu'il stocke le source en inverse (puis le retourne grâce à "while(d--) b[274-d]=b[d];" ) et ajoute un commentaire en fin de code pour les bouts qui manquent (/*c%s%c%=a*,'c%'=q rahc/**//*"=a*,'"'=q rahc/**/ est un unique commentaire)


 
Ok, puique je suis brave et qu'il faut stocke 2x le source dans une chaine et l'afficher 2x de suite, essaye d'en pondre un pour voir !
Pourquoi me dire que je suis brave, si le sujet t'interesse pas, il suffit de ne pas repondre...


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
n°1238236
masklinn
í dag viðrar vel til loftárása
Posté le 03-11-2005 à 21:46:55  profilanswer
 

el muchacho a écrit :

Tu veux parler de l'interpréteur scheme écrit en Scheme qui interprète un interpréteur Scheme, qui interprète...  :D


Ben oui, écrire un interpréteur Lisp en Lisp ca semble être un passe temps fréquent de ces gens là :D.
 
Je l'avais déjà vu dans The Roots Of Lisp de Paul Graham (PDF de l'article avec le code).
 
Ca donne:

(defun eval. (e a)
  (cond
    ((atom e) (assoc. e a))
    ((atom (car e))
     (cond
       ((eq (car e) 'quote) (cadr e))
       ((eq (car e) 'atom)  (atom   (eval. (cadr e) a)))
       ((eq (car e) 'eq)    (eq     (eval. (cadr e) a)
                                    (eval. (caddr e) a)))
       ((eq (car e) 'car)   (car    (eval. (cadr e) a)))
       ((eq (car e) 'cdr)   (cdr    (eval. (cadr e) a)))
       ((eq (car e) 'cons)  (cons   (eval. (cadr e) a)
                                    (eval. (caddr e) a)))
       ((eq (car e) 'cond)  (evcon. (cdr e) a))
       ('t (eval. (cons (assoc. (car e) a)
                        (cdr e))
                  a))))
    ((eq (caar e) 'label)
     (eval. (cons (caddar e) (cdr e))
            (cons (list. (cadar e) (car e)) a)))
    ((eq (caar e) 'lambda)
     (eval. (caddar e)
            (append. (pair. (cadar e) (evlis. (cdr e) a))
                     a)))))
 
(defun evcon. (c a)
  (cond ((eval. (caar c) a)
         (eval. (cadar c) a))
        ('t (evcon. (cdr c) a))))
 
(defun evlis. (m a)
  (cond ((null. m) '())
        ('t (cons (eval.  (car m) a)
                  (evlis. (cdr m) a)))))

Message cité 1 fois
Message édité par masklinn le 03-11-2005 à 21:47:12

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1238240
Elmoricq
Modérateur
Posté le 03-11-2005 à 21:51:19  profilanswer
 

My God. Y a des psychopathes quand même.  [:chalouf]

n°1238245
masklinn
í dag viðrar vel til loftárása
Posté le 03-11-2005 à 21:54:28  profilanswer
 

Et gaffe, c'est du Lisp roots de chez roots ça, c'est le code originel de John McCarthy, donc ça date de 1960, avec les 7 (? si je me plante pas) opérateurs originels de Lisp [:ddr555]


Message édité par masklinn le 03-11-2005 à 21:55:15

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1238253
0x90
Posté le 03-11-2005 à 22:06:14  profilanswer
 

masklinn a écrit :

T'es brave, mais ce que tu postes (dernier compris) ce n'est rien de plus que stocker tout le source dans une chaîne de caractère et l'afficher deux fois de suite [:petrus75]
Le dernier étant original parce qu'il stocke le source en inverse (puis le retourne grâce à "while(d--) b[274-d]=b[d];" ) et ajoute un commentaire en fin de code pour les bouts qui manquent (/*c%s%c%=a*,'c%'=q rahc/**//*"=a*,'"'=q rahc/**/ est un unique commentaire)


 
 
Il me semble voir 2 commentaires dans le code posté non ?
/*c%s%c%=a*,'c%'=q rahc/**/ et /*"=a*,'"'=q rahc/**/


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1238268
masklinn
í dag viðrar vel til loftárása
Posté le 03-11-2005 à 22:15:37  profilanswer
 

0x90 a écrit :

Il me semble voir 2 commentaires dans le code posté non ?
/*c%s%c%=a*,'c%'=q rahc/**/ et /*"=a*,'"'=q rahc/**/


Vrai, tu fais bien de me reprendre :jap:  
 
Mais ça fait pas une grande différence sur les résultat final

Code :
  1. /**/
  2. char q='"'
  3.     ,*a="*//**/char q='%c',*a=%c%s%c*/};)b(stup;]d[b=]d-472[b)--d(elihw;)q,a,q,q,2+a,b(ftnirps;)b(stup{)(niam;731=d tni;]572[b,"
  4.     ,b[275];
  5. int d=137;
  6. main()  {
  7.     puts(b);
  8.     sprintf(b,a+2,q,q,a,q);
  9.     while(d--)
  10.             b[274-d]=b[d];
  11.     puts(b);
  12. }
  13. /*c%s%c%=a*,'c%'=q rahc/**/
  14. /*"=a*,'"'=q rahc/**/


 
Quelle merde le parseur de Joce [:petrus75]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1238332
matafan
Posté le 03-11-2005 à 23:39:49  profilanswer
 

Masklinn, tes remarques dans ce thread montrent clairement que tu n'as pas compris les problemes poses par la question initiale (creer un programe C qui affiche sont propre code). Je t'invite a faire comme si tu n'avais pas vu la solution proposee par Taz (enfin, a mon avis il l'a juste recopie) et a chercher seul quelques minutes. Tu te rendra vite compte des problemes que ca pose, et je t'assure qu'avant de (re)trouver l'astuce proposee par Taz, tu passera quelques heures a t'arracher les cheveux.

n°1239568
el muchach​o
Comfortably Numb
Posté le 06-11-2005 à 08:57:09  profilanswer
 

masklinn a écrit :

Ben oui, écrire un interpréteur Lisp en Lisp ca semble être un passe temps fréquent de ces gens là :D.


C'est parce qu'en Lisp :
1. les instructions sont des données manipulables dans des listes comme tout le reste. Tout programme est une liste. Il suffit donc de mettre l'interpréteur Lisp dans une liste pour pouvoir l'interpréter.
2. La syntaxe est volontairement minimale. En fait on peut presque dire qu'il n'y a pas de syntaxe, ou que la syntaxe est un reflet de l'AST lui-même. (Ceci explique d'ailleurs sans doute pourquoi il y a eu tant versions de Lisp, Lisp n'ayant pas été spécifié comme un langage, mais plutôt créé comme un système.)
Du coup, ça rend ce genre de choses très facile (enfin toutes proportions gardées [:itm]).
Ca a l'air un peu magique, d'ailleurs, si tu veux avoir un exposé très complet de la chose, je t'invite à downloader le renommé "Wizard book" d'Abelson & Sussman et/ou même les vidéos de cours associées, cours qui explique comment on crée un compilateur Lisp en Lisp.
http://swiss.csail.mit.edu/classes [...] -lectures/ (PDF + vidéos)
http://mitpress.mit.edu/sicp/ (HTML)

Message cité 1 fois
Message édité par el muchacho le 06-11-2005 à 09:04:27

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1239631
masklinn
í dag viðrar vel til loftárása
Posté le 06-11-2005 à 13:05:45  profilanswer
 

el muchacho a écrit :

Ceci explique d'ailleurs sans doute pourquoi il y a eu tant versions de Lisp, Lisp n'ayant pas été spécifié comme un langage, mais plutôt créé comme un système.


Pas d'accord, Lisp est un langage, mais c'est un langage qui ne dispose que de 7 instructions.
 
Et il n'y a pas "tant de versions de Lisp", il y a "tant de dialectes de Lisp" [:aloy]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Un petit "chalenge contest" pour perdre son temps

 

Sujets relatifs
petit problemeeProjet d'un petit système d'exploitation
Besoin d'aide pour un petit prog!Petit problème de FTP
Petit problème de CSS sur mon siteAppel à une âme charitable pour compiler un PETIT projet C
Contrôler le temps d'exécution d'une partie d'un scriptpetit probleme en php
un petit ex en c++petit soucis avec intval() - pfff facile de crier qd on ne sait pas :p
Plus de sujets relatifs à : Un petit "chalenge contest" pour perdre son temps


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR