C: Переменное количество аргументов функции (при аргументах типа void* // ещё про фун.прог. в си хотел узнать )))

Модератор: Модераторы разделов

MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

NickLion :: Я подумываю о таком использовании - для динамических библиотек:

Код: Выделить всё

void * do_function_with_so ( char * so_name, char * fun_name, void ** args, int n) {
    void * rusult = NULL;
    void * dl_handle;
    dl_handle = dlopen(so_name, RTLD_LAZY);
    if (!dl_handle) {
        // ... error
        return rusult;
    }
    void * _f_ ();
    char * error;
    _f_ = dlsym(dl_handle, fun_name);
    error = dlerror();
    if (error != NULL) {
        // ... mh
        return rusult;
    }
    switch (n) {
    case 0: rusult = (* _f_)();  break;
    case 1: rusult = (* _f_)(args[0]);  break;
    case 2: rusult = (* _f_)(args[0], args[1]);  break;
    // ...
    }
    dlclose( dl_handle );
    return rusult;
}

или то же самое для dll:

Код: Выделить всё

void * do_function_with_dll (char * dll_name, char * fun_name, void ** args, int n) {
    void * rusult = NULL;
    THANDLE dll = GetModuleHandle(dll_name);
    if (dll == NULL) {
        HINSTANCE _dll_ = LoadLibrary(dll_name);
        if (_dll_ == NULL) {
            // ... error-horror!!!
            return rusult;
        }
        dll = _dll_;
    }
    PROC fun_handle = GetProcAddress(dll, fun_name);
    if (fun_handle == NULL) {
        //  ... poor-yoric
        return rusult;
    }
    switch (n) {
     case 0: rusult = (*fun_handle)();  break;
     case 1: rusult = (*fun_handle)(args[0]);  break;
     case 2: rusult = (*fun_handle)(args[0], args[1]);  break;
     // ...
    }
    FreeLibrary(dll);
    return rusult;
}

Для системных вызовов уже бредово как-то, но всё равно:

Код: Выделить всё

extern int syscall(int, ...);
int do_syscall ( int sys_call, void ** args, int n) {
    switch (n) {
            case 0: return syscall(sys_call);
            case 1: return syscall(sys_call, args[0]);
            case 2: return syscall(sys_call, args[0], args[1]);
            // ...
    }
    // error "n"
    return -1;
}
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C: Переменное количество аргументов функции

Сообщение NickLion »

1) Синтаксически неверно:
void * _f_ ();
case 1: rusult = (* _f_)(args[0]); break;
2) А как сама функция _f_ предположительно понимает количество аргументов?
3) Мне кажется (возможно, только кажется), что Вы создаете себе сложности там, где их не было...
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

1) Да вроде всё верно - это в ++ нужно ставить эллипсис, в С запись void * f() означает, что f принимает произвольные аргументы и возвращает неизвестный тип.

2) Думаю, этим заведует компилятор. f - это указатель на точку входа в код, по которому находится функция (в дин. библиотеке). Эта функция берет аргументы из стека, и трактует их тип. Т.е. (*f)(a, b, c) значит фактически - положить в стек a, b, c и передать управлению коду f. Пока я потестил под windows, и при верных аргументах проблем не возникло. Контроль типов это уже второе дело.

Про проблемы - это вы правы! А как бы вы предложили сделать такой интерфейс:

- На входе имеется --функция--, --аргументы--, т.е. строки
- должна быть вызвана
- в Linux это могут быть функции из библиотек, или системные вызовы
- В windows это произвольная api-функция.
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: C: Переменное количество аргументов функции

Сообщение drBatty »

MakkyWelly писал(а):
02.09.2009 23:48
С запись void * f() означает, что f принимает произвольные аргументы и возвращает неизвестный тип.

почему "неизвестный"? известный: void* это указатель. правда неизвестно на что.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: C: Переменное количество аргументов функции

Сообщение deninok »

drBatty писал(а):
03.09.2009 14:34
MakkyWelly писал(а):
02.09.2009 23:48
С запись void * f() означает, что f принимает произвольные аргументы и возвращает неизвестный тип.

почему "неизвестный"? известный: void* это указатель. правда неизвестно на что.

почему "неизвестно на что"? известно: на void. :)
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

^)) Ну вы же поняли о чем я? Как бы это правильно выразится... Указатель на память неприведённого типа - 1b, 2b, 4b ??? прежде чем использовать, нужно привести к типу.
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C: Переменное количество аргументов функции

Сообщение NickLion »

MakkyWelly писал(а):
02.09.2009 23:48
1) Да вроде всё верно - это в ++ нужно ставить эллипсис, в С запись void * f() означает, что f принимает произвольные аргументы и возвращает неизвестный тип.

2) Думаю, этим заведует компилятор. f - это указатель на точку входа в код, по которому находится функция (в дин. библиотеке). Эта функция берет аргументы из стека, и трактует их тип. Т.е. (*f)(a, b, c) значит фактически - положить в стек a, b, c и передать управлению коду f. Пока я потестил под windows, и при верных аргументах проблем не возникло. Контроль типов это уже второе дело.

Про проблемы - это вы правы! А как бы вы предложили сделать такой интерфейс:

- На входе имеется --функция--, --аргументы--, т.е. строки
- должна быть вызвана
- в Linux это могут быть функции из библиотек, или системные вызовы
- В windows это произвольная api-функция.

1) да, точно, давно уже с чистым С не общался, все больше с С++
2) понял, каждый отдельный указатель понимает фиксированное число аргументов, просто указатели меняются, дошло :)
Вообще для такой задачи больше асемблер подходит. Там это все будет очень просто и компактно. Подумайте, если переносимость на другие архитектуры не важна.
Также не забудьте о конвенции вызова. Стандарт Си (и линукса) - cdecl - справа налево, аргументы из стека забирает вызывающая функция. В WinAPI - stdcall - тоже справа налево, но забирает из стека аргументы вызываемая функция.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C: Переменное количество аргументов функции

Сообщение NickLion »

Да, вот примерно вот это можно использовать. Но не стоит :)

Код: Выделить всё

#include <stdio.h>

int func1( int x, int y ) {
    return x + y;
}

int func2( int x, int y, int z ) {
    return x * y + z;
}

void push_stack_void() {}
void __attribute__(( stdcall )) pop_stack_void( void* x ) {}

void (*push_stack) ( void* x ) __attribute__(( stdcall )) = push_stack_void;
void (*pop_stack) () = pop_stack_void;

int main() {
    void* (*f) ();
    f = func2;
    push_stack( 5 );
    push_stack( 4 );
    push_stack( 3 );
    pop_stack(); // пока не понял, почему без этого не работает. долго смотрел на ассеблерный код, но так и не вдуплил... завтра свежим взглядом оценю, а то уже мозги не работают - спать хочу
    int x = (int) f();
    pop_stack();
    pop_stack();
    pop_stack();
    printf( "%d\n", x );
    return 0;
}
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

Поздравляю, ваш пример - на 5 месте в google по запросу push_stack ;)
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C: Переменное количество аргументов функции

Сообщение NickLion »

Видимо это какое-то поведение gcc, что добавляется запас в стеке для следующего вызова функции.
Вот немного изменил схему работы, чтобы было проще. И меньше ненужных вызовов.

Код: Выделить всё

#include <stdio.h>

int func1( int x, int y ) {
    return x + y;
}

int func2( int x, int y, int z ) {
    return x * y + z;
}

void push_stack_void() {}
void __attribute__(( stdcall )) pop_stack_void( void* x ) {}

void (*push_stack) ( void* x ) __attribute__(( stdcall )) = push_stack_void;
void (*pop_stack) () = pop_stack_void;

int main() {
    void* (*f) ();
    f = func2;
    push_stack( 5 );
    push_stack( 4 );
    int x = (int) f( 3 );
    pop_stack();
    pop_stack();
    printf( "%d %d\n", x );
    return 0;
}


PS Спасибо :)
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

Я кажется понял что это я делал ~)) Функция apply для C - принимает указатель на произвольную функцию и список произвольных аргументов, чтобы применить переданную функцию к переданным аргументам.
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: C: Переменное количество аргументов функции

Сообщение Portnov »

А-а. Ну тогда теперь давайте call/cc реализуйте :)
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

(Portnov) писал(а):А-а. Ну тогда теперь давайте call/cc реализуйте :)


Легко:

Код: Выделить всё

int foo() {
    static x = 0;
    return ++x;
}

main () {
    int i;
    for (i = 1; i++ < 10;)
        printf("%d", foo());
}


Осталось только eval придумать.
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

Ещё, с позволения, небольшой пример на тему извратов в Си (хотя не знаю, может это и нормальные выщи).

определим на основе статических переменных и областей видимости такие классические функции range:

Код: Выделить всё

#include <stdio.h>
#include <string.h>

// Генерирует последовательность чисел [a > 0; b)
int range_n(int a, int b) {
    static i = 0;
    if (i < b - a && b > a && a > 0)
        return a + i++;
    else
        return i = 0;
}

// Генерирует последовательность знаков строки : str[a > 0; b)
char range_s(char *str, int a, int b) {
    static i = 0;
        if (a < 0)
            a = 0;
        if (b > strlen(str))
            b = strlen(str);
        if (i <= b - a && b > a)
            return str[a + i++];
        else
            return i = 0;
}

#define itern(i, a, b) { int i; \
                                 while (i = range_n(a, b)) {

#define iters(c, str, a, b) { char c; \
                                       char *s = str; \
                                       while (c = range_s(s, a, b)) {

#define end }}


Тогда можно писать такие странные вещи:

Код: Выделить всё

main () {

    itern (i, 1, 10)
        printf("%d", i);
    end
    // Даст 123456789

    iters (c, "йцукен", 1, 4)
        printf("%c", c);
    end
    // срез строки и всё такое - "цуке"
}

Во первых это итераторы, во вторых переменные i и c выглядят как динамические - их не нужно объявлять, и они не будут иметь отношения к таким же переменным "снаружи".
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C: Переменное количество аргументов функции

Сообщение NickLion »

А зачем такие страшные вещи? Чем это лучше, чем просто:

Код: Выделить всё

    for( int i = 1; i < 10; i++ ) {
        printf( "%d", i );
    }

    for( char* s = "qwerty", *p = s + 1, c = *p; p - s <= 4; c = *++p ) {
        printf( "%c", c );
    }

Если сильно хочется, эти циклы просто в макрос такой же обернуть... но не вижу смысла. Во втором случае переменная 'c' не нужна, просто чтобы было как у Вас, а не '*p'.
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

А зачем такие страшные вещи?


Все эти странности - как повод для размышления (для меня) о ФП в Си. Нет ли чего нибудь такого в виде библиотек? Которые бы позволили использовать в Си (вроде императивном, хотя...) функциональный стиль (взять тот же tcc c eval-ом и компиляцией "на-лету")?

З.Ы. то что можно написать обычно - я знаю. Учебник читал ;))
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C: Переменное количество аргументов функции

Сообщение NickLion »

Ну, в приведенном коде я что-то не заметил функциональности ;) К тому же функции с побочными эффектами - уже не очень хоршо.

Не, ясное дело, что любой функциональный язык на наших компах раскладывается в итоге в императивные команды, а значит на Си можно сделать эмуляцию функциональности. Но:
1. Зачем забивать гвозди микроскопом.
2. Некоторые вещи, банальные для ФП - на Си придется извращаться. К примеру, оптимизация хвостовой рекурсии.
3. На С++ ФП проще эмулировать, но см.п.1.
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

NickLion, значит функциональные вещи это "гвозди", Си это "микроскоп", а функциональные языки это "молотки", так получается? Тогда выходит что молотки делают при помощи микроскопов! Если где-то работает хвостовая рекурсия, значит её кто-то написал, зачастую на том же Си. Должны же быть стандартные ходы, которые добавили бы в Си немного рефлексии )) Например - память о типах, apply и range я могу неуклюже продемонстрировать, да и видел я нечто подобное. Так нет ли чего-нибудь подобного, в какую сторону посмотреть?
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: C: Переменное количество аргументов функции

Сообщение Portnov »

[captain obvious mode on]
В трансляторы функциональных языков, написанные на C?
[/captain obvious mode off]
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

Возможно.
Только они замкнуты на себе - никаких функций не поставляют.
Насчет функционального программирования в C++ - что-то находится, буду смотреть.
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C: Переменное количество аргументов функции

Сообщение NickLion »

MakkyWelly писал(а):
20.09.2009 22:25
NickLion, значит функциональные вещи это "гвозди", Си это "микроскоп", а функциональные языки это "молотки", так получается? Тогда выходит что молотки делают при помощи микроскопов! Если где-то работает хвостовая рекурсия, значит её кто-то написал, зачастую на том же Си. Должны же быть стандартные ходы, которые добавили бы в Си немного рефлексии )) Например - память о типах, apply и range я могу неуклюже продемонстрировать, да и видел я нечто подобное. Так нет ли чего-нибудь подобного, в какую сторону посмотреть?

Ну, начнем :)
Во-первых, на С пишут либо интерпретатор, либо компилятор для функционального языка, а не транслятор в С. Таким образом, хвостовая рекурсия будет реализована при помощи обновления содержимого программного стека для интерпретатора, либо pop/push/mov инструкциям ассемблера. Писать такое на С - еще большие извращения, чем приведенные мною ранее функции, потому что после замещения контекста функции следует goto/jmp на другую функцию (а не вызов), что в С нельзя делать.
Во-вторых, ФЯ - наши молотки с наноструктурой ;) делают при помощи микроскопов, а не ИЗ них, как это пытаетесь сделать Вы :)
В-третьих, да, отражение можно добавить в С. Хотя опять же проще в С++ через механизм абстракции. Посмотрите на тот же COM под Windows - по сути готовый механизм, реализующий рефлексию (может не в полной мере, но доработать несложно).
В-четвертых, можно сделать именно транслятор. Т.е. писать код на одном языке, затем запускать транслятор и получать выход на С/С++, который уже компилировать и линковать со своим. Но в этом случае, имхо, будет проще отказаться от непосредственно функций С, а эмулировать их вызов и контекст. Так будет проще проводить оптимизации.

MakkyWelly писал(а):
21.09.2009 00:04
Возможно.
Только они замкнуты на себе - никаких функций не поставляют.
Насчет функционального программирования в C++ - что-то находится, буду смотреть.

Да, в boost было немножко вещей для ФП на С++. И специальные разработки для ФП встречал. Но мне всегда казалось, что для ФП есть специальные инструменты для этого предназначенные. Лучше изучить КАК работает ФЯ, написать свой компилятор/интерпретатор, который уже можно встроить в свою программу на С/С++.
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

Продолжаю вникать. Как пользоваться микроскопом))
Есть такая книга `P. H. Hartel and H. L. Muller. Functional C` кто-нибудь её видел? В google находится только статья о книге.
Вот ещё одна библиотека для С++ : http://www.cc.gatech.edu/~yannis/fc++/

Во-первых, на С пишут либо интерпретатор, либо компилятор для функционального языка, а не транслятор в С.

Кстати, есть и трансляторы - называется компиляция via C.
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
korvin
Сообщения: 39
ОС: >_<

Re: C: Переменное количество аргументов функции

Сообщение korvin »

MakkyWelly писал(а):
26.08.2009 11:44
Спасибо. Интересно, но в том примере предполагается, что тип аргументов известен! У меня void* и функция не каррируется :)), т.е. нельзя вызвать её f(f(f(...))) в цикле. Напишу подробнее:

каррирование довольно тесно связано с замыканиями. есть мнение, что правильные замыкания крайне проблематично реализовать без автоматической сборки мусора. есил Вы мазохист и хотите делать это на Си, то Ваше право, но, имхо, лучше воспользоваться OCaml/Haskell или CL/Scheme
(© '(define LISP (такой язык-программирования (состоящий-из смайликов (чуть более) (чем целиком)))) lurkmore)
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: C: Переменное количество аргументов функции

Сообщение Portnov »

Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

Спасибо за объяснение и ссылки :) Согласен, что моё использование слов "карирование" или "замыкание" было не вполне правильным, мягко говоря, но я просто называл так некоторые вещи которые реально в си есть (вроде статических переменных в функциях и "обощённых" указателей, взял в кавычки чтобы опять не поняли неправильно :))

А как по вашему решить для себя проблему выбора ((OCaml или Haskell) или (CL или Scheme )) и для каких задач что лучше использовать?

З.Ы. "если я мазохист и хочу сделать это на си..." -- gc пишется (обычно?) на си ;)
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: C: Переменное количество аргументов функции

Сообщение Portnov »

Ну ML-и имеют статическую типизацию с выводом типов, а лиспы - динамическую (хотя можно, при желании, в хаскеле использовать динамическую, а в лиспе статическую, но это уж на крайний случай). Плюс знаменитое лисповое метапрограммирование. Вот и выбирайте.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
korvin
Сообщения: 39
ОС: >_<

Re: C: Переменное количество аргументов функции

Сообщение korvin »

MakkyWelly писал(а):
10.02.2010 11:43
З.Ы. "если я мазохист и хочу сделать это на си..." -- gc пишется (обычно?) на си ;)

не обязательно...

Сборка мусора

Сборка мусора была впервые применена Джоном Маккарти в 1959 году в среде программирования на разработанном им функциональном языке программирования Лисп.
(© '(define LISP (такой язык-программирования (состоящий-из смайликов (чуть более) (чем целиком)))) lurkmore)
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

Т.е. вы хотите сказать что сборщик мусора для целевого языка был написан на целевом языке? Тогда где можно на это взглянуть?
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
korvin
Сообщения: 39
ОС: >_<

Re: C: Переменное количество аргументов функции

Сообщение korvin »

MakkyWelly писал(а):
10.02.2010 18:52
Т.е. вы хотите сказать что сборщик мусора для целевого языка был написан на целевом языке? Тогда где можно на это взглянуть?

это может зависеть от реализации, но некоторые реализации CL, как я слышал, пишутся полностью на самом CL, без Си.

хотя в SBCL, например, как пишут здесь: http://www.doc.gold.ac.uk/~mas01cr/papers/s32008/sbcl.pdf , GC написан на Си из некоторых прагматических соображений
(© '(define LISP (такой язык-программирования (состоящий-из смайликов (чуть более) (чем целиком)))) lurkmore)
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

Хотелось бы мне увидеть gc на Лиспе :)

Код: Выделить всё

(set var (allocate (:address (size-of var))))
(if (= var NULL) (error "WTF!"))
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали: