Un petit "chalenge contest" pour perdre son temps

Un petit "chalenge contest" pour perdre son temps - C - Programmation

Marsh Posté le 03-11-2005 à 18:50:36    

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++ );
Reply

Marsh Posté le 03-11-2005 à 18:50:36   

Reply

Marsh Posté le 03-11-2005 à 18:59:42    

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

Reply

Marsh Posté le 03-11-2005 à 19:06:23    

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++ );
Reply

Marsh Posté le 03-11-2005 à 20:36:29    

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

Reply

Marsh Posté le 03-11-2005 à 20:43:03    

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

Reply

Marsh Posté le 03-11-2005 à 20:47:01    

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

Reply

Marsh Posté le 03-11-2005 à 20:48:06    

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
Reply

Marsh Posté le 03-11-2005 à 20:50:43    

masklinn a écrit :

(accessoirement, en Python ça prend 4 lignes)


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

Reply

Marsh Posté le 03-11-2005 à 20:52:59    

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
Reply

Marsh Posté le 03-11-2005 à 20:55:15    

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

Reply

Marsh Posté le 03-11-2005 à 20:55:15   

Reply

Marsh Posté le 03-11-2005 à 20:56:26    

Taz a écrit :

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


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

Reply

Marsh Posté le 03-11-2005 à 20:56:28    

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
Reply

Marsh Posté le 03-11-2005 à 21:00:46    

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.

Reply

Marsh Posté le 03-11-2005 à 21:02:44    

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++ );
Reply

Marsh Posté le 03-11-2005 à 21:06:59    

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]

Reply

Marsh Posté le 03-11-2005 à 21:08:18    

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
Reply

Marsh Posté le 03-11-2005 à 21:14:44    

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++ );
Reply

Marsh Posté le 03-11-2005 à 21:17:03    

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

Reply

Marsh Posté le 03-11-2005 à 21:17:42    

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++ );
Reply

Marsh Posté le 03-11-2005 à 21:19:33    

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]

Reply

Marsh Posté le 03-11-2005 à 21:23:40    

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
Reply

Marsh Posté le 03-11-2005 à 21:24:07    

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
Reply

Marsh Posté le 03-11-2005 à 21:30:34    

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
Reply

Marsh Posté le 03-11-2005 à 21:33:34    

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
Reply

Marsh Posté le 03-11-2005 à 21:35:44    

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++ );
Reply

Marsh Posté le 03-11-2005 à 21:46:55    

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
Reply

Marsh Posté le 03-11-2005 à 21:51:19    

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

Reply

Marsh Posté le 03-11-2005 à 21:54:28    

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
Reply

Marsh Posté le 03-11-2005 à 22:06:14    

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.
Reply

Marsh Posté le 03-11-2005 à 22:15:37    

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
Reply

Marsh Posté le 03-11-2005 à 23:39:49    

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.

Reply

Marsh Posté le 06-11-2005 à 08:57:09    

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
Reply

Marsh Posté le 06-11-2005 à 13:05:45    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed