ADN Open CIS
Сообщество программистов Autodesk в СНГ

24/02/2014

Ошибка AutoLISP progn - слишком много аргументов

При проверке текста в VLIDE (при некоторых условиях) можно получить ошибку. При этом некомпилированный lisp продолжает корректно работать. Попытка скомпилировать lisp в fas или vlx также приводит к ошибке вида "too many arguments..."
Подобное сообщение способно повергнуть в шок, пока программист не сообразит, что функция progn понимает только 255 (и не больше!) аргументов!
progn нередко используется для объединения вычислений, и вполне вероятна ситуация, когда количество аргументов progn превысит допустимый предел.
Элементарный пример:
Код - Auto/Visual LISP: [Выделить]
  1. (progn   1    2    3     4    5       6    7    8      9    10   11     12   13   14   15   16   17     18   19   20    21   22      23   24   25     26   27   28   29   30   31     32   33   34    35   36      37   38   39     40   41   42   43   44   45     46   47   48    49   50      51   52   53     54   55   56   57   58   59     60   61   62    63   64      65   66   67     68   69   70   71   72   73     74   75   76    77   78      79   80   81     82   83   84   85   86   87     88   89   90    91   92      93   94   95     96   97   98   99   100  101     102  103  104    105  106  107  108  109     110  111  112   113  114  115     116  117  118    119  120  121  122  123     124  125  126   127  128  129     130  131  132    133  134  135  136  137     138  139  140   141  142  143     144  145  146    147  148  149  150  151     152  153  154   155  156  157     158  159  160    161  162  163  164  165     166  167  168   169  170  171     172  173  174    175  176  177  178  179     180  181  182   183  184  185     186  187  188    189  190  191  192  193     194  195  196   197  198  199     200  201  202    203  204  205  206  207     208  209  210   211  212  213     214  215  216    217  218  219  220  221     222  223  224   225  226  227     228  229  230    231  232  233  234  235     236  237  238   239  240  241     242  243  244    245  246  247  248  249     250  251  252   253  254  255     256  )

Есть несколько вариантов решения возникающей проблемы:
  1. добавить несколько вложенных progn
  2. использовать конструкцию cond по принципу:
  3. объявить и тут же использовать анонимную функцию lambda
  4. объявить через defun стороннюю функцию и использовать ее (естественно, что функция может быть и локальной)

Вполне возможно, Вы придумаете еще какие-то методы.
Следует помнить, что наряду с progn аналогичный механизм использует, например, и repeat: внутри цикла также может быть не более 255 вычислений. --- На основе материалов jtbworld.com

Обсуждение: http://adn-cis.org/forum/index.php?topic=555

Опубликовано 24.02.2014