Тема: Как передать список из LISP в ObjectARX?

Как создать функцию для LISP-а, аргументом которой является список? Например (sp (list 1 2 3)).

Re: Как передать список из LISP в ObjectARX?

Элементарно! :)
Расписываю по шагам. Для простоты описания используем ObjectARX Wizard.
1) Создаем при помощи ObjectARX Wizard новый проект (назовем его, например, LispFunction).
2) На панели ObjectARX Wizard выбираем ObjectARX Commands (крайняя левая иконка).
3) В появившемся диалоговом окне находим строку ADS symbols & commands
4) В первой пустой строке под ней нажимаем правую кнопку мыши и из меню выбираем New
5) В поле Symbol Name вводим имя функции (например, как ты просишь sp и указываем (это не обязательно, но желательно) Invok'able - True.
6) Нажимаем Ok - и на этом фактически все - ObjectARX Wizard создал нам заготовку функции:

  // ----- ads_sp symbol (do not rename)
  static int ads_sp(void)
  {
    //----- Remove the following line if you do not expect any argument for this ADS function
    struct resbuf *pArgs =acedGetArgs () ;
    // TODO: add your code here
    // TODO: Replace the following line by your returned value if any
    acedRetVoid () ;
    return (RSRSLT) ;
  }

В переменной pArgs - указатель на связанный список переданных параметров.
Одно небольшое замечание. Список (list 1 2 3) будет передан в эту функцию не как список, а как 3d-точка, т.е. pArgs->restype == RT3DPOINT
Список (list 1 2) будет передан как 2d-точка, т.е. pArgs->restype == RTPOINT,
а вот список (list 1 2 3 4) уже будет передаваться как список, т.е.:

pArgs->restype == RTLB
pArgs->rbnext->restype == RTSHORT и pArgs->rbnext->resval.rint == 1
pArgs->rbnext->rbnext->restype == RTSHORT и pArgs->rbnext->rbnext->resval.rint == 2
pArgs->rbnext->rbnext->rbnext->restype == RTSHORT и pArgs->rbnext->rbnext->rbnext->resval.rint == 3
pArgs->rbnext->rbnext->rbnext->rbnext->restype == RTSHORT и pArgs->rbnext->rbnext->rbnext->rbnext->resval.rint == 4
pArgs->rbnext->rbnext->rbnext->rbnext->rbnext->restype == RTLE

Вот пожалуй и все. Для возврата значения в lisp необходимо использовать одну из acedRetXXX-функций в зависимости от того, какой тип значения ты хочешь вернуть. acedRetVoid(), которую вписал ObjectARX Wizard ничего не возвращает.
P.S.: А вообще это все есть в ObjectARX Developer Guide. Только нужно внимательно посмотреть.