Все примеры по приему и передаче списков достаточно хорошо расписаны в документациях.
До 12 версии на русском языке она поставлялась только в печатном виде. С 13 версии и выше документация идет в электронном виде и на английском языке.
Ну а если лень копаться в поисках вот простейшие примеры:
// Пример приема (функция '(строка целое_число) точка)
int primer1()
{
struct resbuf *rb;
int c;
ads_point pt;
ads_real r;
char str[_MAX_PATH];
// Выборка аргументов
rb = ads_getargs();
// --- Проверка и запись в переменные аргументов ---
if (rb == NULL) {
ads_fail("Нет аргументов");
return RTERROR;
}
if (rb->restype != RTLB) { // проверка аргумента
ads_fail("Первый аргумент должен быть списком");
return RTERROR;
}
rb = rb->rbnext; // следующий аргумент
if (rb->restype == RTSTR) { // проверка аргумента
strcpy(str, rb->resval.rstring); // Сохраняем в локальной переменной
} else {
ads_fail("Первый аргумент в списке должен быть строкой");
return RTERROR;
}
rb = rb->rbnext; // следующий аргумент
if (rb->restype == RTSHORT) { // проверка аргумента
c = rb->resval.rint; // Сохраним в локальной переменной
} else {
ads_fail("Второй аргумент в списке должен быть целым числом.");
return RTERROR;
}
rb = rb->rbnext; // следующий аргумент
if (rb->restype != RTLE) { // проверка аргумента
ads_fail("Первый аргумент должен быть списком из 2-х элементов");
return RTERROR;
}
rb = rb->rbnext; // следующий аргумент
if (rb == NULL) {
ads_fail("Недостаточное количество аргументов");
return RTERROR;
}
if (rb->restype == RTPOINT !!
rb->restype == RT3DPOINT) { // проверка аргумента
ads_point_set(rb->resval.rpoint,pt); // Сохраняем в локальной переменной
} else {
ads_fail("Второй аргумент должен быть 2-х или 3-х мерной точкой.");
return RTERROR;
}
// Проверка числа аргументов
rb = rb->rbnext;
if (rb != NULL) {
ads_fail("Избыточное число аргументов");
return RTERROR;
}
// --- конец проверки аргументов ---
.................................
return RTNORM;
}
// Создание статического списка - строка, число, точка
int primer2()
{
struct resbuf *res_list;
int c=5;
ads_point pt = {100.0, 200.0, 0.0};
char *str = "Строка";
if ((res_list = ads_buildlist(RTSTR,str,RTSHORT,c,
RT3DPOINT,pt,0)) == NULL) {
ads_fail("Не могу создать список.");
return RTERROR;
}
ads_retlist(res_list); // возврат списка Автолиспу
ads_relrb(res_list); // освобождает память,выделенную буферу результату
return RTNORM;
}
// Создание динамического списка из десяти целых чисел
int primer3()
{
struct resbuf *rb1, *rb2;
struct resbuf *res_list;
int i=0;
res_list = rb2 = rb1 = NULL;
for(i=0; i resval.rint = i;
res_list = rb2 = rb1;
} else { // другие атомы
if ((rb1 = ads_newrb(RTSHORT)) == NULL) {
ads_fail("Не могу выделить память для буфера.");
return RTERROR;
}
rb1->resval.rint = i;
rb2->rbnext = rb1;
rb2 = rb1;
}
}
ads_retlist(res_list); // возврат списка Автолиспу
ads_relrb(res_list); // освобождает память,выделенную буферу результату
rb2 = rb1 = res_list;
return RTNORM;
}