• [^] # Re: pourquoi le lisp

    Posté par . En réponse à la dépêche Sortie de SBCL 1.0. Évalué à 3.

    C'est bien évidemment possible en C !


    #include <sys/mman.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>

    typedef int (*add_t)(int x);

    int add(int x)
    {
    return x + 0x42424242;
    }

    add_t addn(int n)
    {
    char *p;
    int size = (char *)addn - (char *)add;
    add_t f = mmap(NULL, size, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
    memcpy(f, add, size);
    for (p=(char *)f; *(int *)p != 0x42424242; p++);
    *(int *)p = n;
    return f;
    }

    int main(void)
    {
    add_t f = addn(5);
    printf("=> %d\n", f(7));
    return 0;
    }


    Je ne dis pas que c'est propre et parfait mais c'est en tout cas parfaitement fonctionnel (y compris sur les CPU gérant la protection en execution des pages de données, style NX bit).
    C'est certe loin d'être aussi élégant qu'en lisp, mais de toutes facon, un programmeur C n'aurait jamais eut l'idée d'écrire ce genre de fonction. Il aurait pris le problème global d'une tout autre manière. Les langages et la manière de les utiliser ne sont absolument pas comparables.