Ошибка неверный тип аргумента stringp nil

Ошибка неверный тип аргумента stringp nil

мне нужно использовать update-directory-autoloads функция в маленьком El-скрипте. Когда я пытаюсь вызвать эту функцию с аргументом, который является имя каталога, я получаю эту ошибку:

Wrong type argument: stringp, nil.

вызов выглядит так: (update-directory-autoloads "

2 ответов

генерация файлов автозапуска плохо документирована. Вы испытываете проблему, которая возникает, потому что вы не установили переменную generated-autoload-file . Попробуйте следующее:

обновить generated-autoloads-file привязка должна быть местом, где вы хотите жить.

когда вы Wrong type argument: foo, bar. вы должны M-: (setq debug-on-error t) RET а затем воспроизвести ошибку, чтобы получить обратную трассировку. На самом деле, вы можете установить debug-on-error как это в вашем .в Emacs и Emacs, как правило, остается вполне доступной.

Эта лекция описывает особенности написания программы и отладки в среде VisualLISP.

СОДЕРЖАНИЕ:

Текст программы в редакторе

Возьмем пример для отладки: Пример.

если пользоваться редактором VLISP, то программирование облегчено благодаря контекстно настраиваему интерфейсу редактора. Можно настроить цвета основных элементов программы. Стандартно цвета настроены следующим образом:

Описание кода программы в редакторе

синим отображаются верно написанные операторы. если оператор не раскрасился, значит вы его написали неверно
зеленый — целые числа
бирюзовым — вещественные значения
розовым — символьные выражения

Скобки

При отображении скобок, при вводе закрывающей скобки курсор указывает, с какой открывающей скобкой будет связана закрывающая.
При двойном щелчке мыши на любой скобке, выделяется всё выражение объединенное этой парой скобок.

Далее, если вы написали всё что хотели в теле программы, переходим к следующему этапу.

Загрузка программы

Загрузка программы и основные инструменты для отладки описаны в лекции VisualLISP.
Казалось бы, вы сделали всё что могли, НО.

Программа не загружается

Программа выдает ошибки различного характера.

; error: какая-то ошибка

Давайте рассмотрим их:

Скобки

; error: malformed list on input

— ошибка в количестве скобок (скобок нехватает).

; error: extra right paren on input

— ошибка в количестве скобок (это лишняя правая скобка).

A если при загрузке вдруг начинается выполнение кода.

. и мы выходим в окно автокада, это ошибка в том, что мы рано закрыли последнюю скобку подпрограммы, и остальная часть вместо загрузки в тело программы идет на выполнение сразу. Поэтому если при загрузке программы внезапно начинается выполнение, надо сначала проверить правильность расстановки открывающих и закрывающих скобок подпрограмм.

Кавычки

; error: malformed string on input

— эта надпись говорит об ошибке в количестве кавычек.

Оператор If

Наиболее часто встречаемая ошибка:

; error: too many arguments: (IF (= A B) (SETQ A 3) (PRINT A) (SETQ A 4))

Напомню синтаксис оператора : (if (условие) (выражение-то) (выражение-иначе)). Если необходимо в каждом из выражений осуществить более одного действия, то надо пользоваться оператором progn. Но об этом забывают часто и в одном операторе if получается более трех аргументов. Если больше, то будет ошибка.

Читайте также:  Как убрать geforce experience из автозагрузки

Оператор setq

Напомню синтаксис оператора : (setq имя_переменной выражение имя_переменной выражение . ). Таким образом, идет попарное присваивание аргументов, стоящих на четных местах, в переменные, записанные на нечетных местах

(setq firs "1" 4 as (- (length lst) 1))
; bad variable name in SETQ: 4

— ошибка в том, что на нечетных местах должны быть имена переменных.

(setq firs "1" 4 as)
; error: too few arguments in SETQ: (SETQ FIRS "1" 4 AS)

— ошибка в том, что не указано присваиваемое значение, ведь количество аргументов должно быть четным.

Если неизвестно, где в коде программы возможна ошибка, а код программы содержит несколько подпрограмм, необходимо разделить загрузку на отдельные этапы. Например, проводить загрузку последовательно по подпрограммам. Тогда легче определить, где содержится ошибка.

Если исключены ошибки вышеперечисленных типов и программа загружается успешно, это победа 🙂

Программа загружена

Если программа загружается, то выводится надпись, сколько подпрограмм успешно загружено:

; 1 form loaded from # loading. ">

Дальше можно переходить в Автокад и тестировать программу. Запуск программы осуществляется через командную строку:

(имя_функции аргументы)

Но в процессе выполнения могут возникать новые ошибки, которые либо будут прерывать выполнение программы, либо программа будет работать неточно.

Ошибки, которые обнаруживаются при выполнении программы

Несмотря на то, что программа загружена, текст программы может по прежнему содержать некоторые видимые глазу ошибки:

(nth 3 b)
; error: bad argument type: consp nil

— ошибка обращения к несуществующему списку и попытка извлечения элементов из несуществующего списка.

(setq a (list 1 2 3 4))
(nth "3" a)
; error: bad argument type: fixnump: "3"

— ошибка неверного типа аргумента функции, там где должен быть целый тип, задается почему-то строка.

error: Too many arguments

— слишком много аргументов подается в функцию, не рассчитанную на такое количество аргументов.

error: Too few arguments

— маловато аргументов. Проявляется, когда наоборот, слишком мало аргументов указано для функции.

error: bad argument type

— неверный тип агрумента, подаваемого в функцию.

error: no function definition.

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

Читайте также:  A1shb транзистор чем заменить на российский

(ssget "x" ‘((8. "0")))
; error: bad SSGET list

— ошибка формирования фильтра ssget.

Последовательность действий при отладке

Программа загружается, но не работает как нужно. Тогда будем просматривать код программы для поиска места, в котором программа совершает ошибку.

Необходимо поставить паузу/останов на код программы на тот этап, в котором предполагается ошибка. Снова производим запуск программы.

Программа остановится и выделит выражение, на котором установлена пауза. Далее c помощью инструментов отладки мы можем продолжить выполнение программы, выйти из подпрограммы выйти из выполнения кода вообще. По работе в отладке мы можем: зайти внутрь выражения, перешагнуть на следующее выражение и выйти на уровень выше. Таким образом мы прослеживаем выполнение программы.

Для того чтобы увидеть, что содержится в переменных, есть инструмент Watch (очки). Мы должны в тексте программы выделить интересующую нас переменную или выражение и нажать (очки). Содержимое переменной или результат расчета выражения сразу появится в окне просмотра. Важно что при отладке программы в окне просмотра показываются все изменения, происходящие с выражением или переменной в процессе выполнения кода программы.

Предположим, что вы нашли искомую ошибку. Предлагаю такую последовательность действий для ее исправления и проверки:

Шаги выхода из отладки и перезапуска

1. исправляем ошибку
2. расставляем новые паузы, избавляемся от лишних
3. сохраняем код программы
4. Загружаем программу
5. прерываем отладку
6. запускаем программу

Ниже приведен список сообщений об ошибках, которые вы время от времени увидите, когда вы пишете или выводите функции AutoLISPа. Если функция "ERROR" определена не пользователем ("ERROR" связана с nil), ошибка является стандартной акцией , тогда эти сообщения выводятся на экран дисплея в виде:

следом за прослеженнй функцией. Если существует пользователь-определитель функции "ERROR", эта функция , называемая сообщением, пройдет только в качестве аргумента.

Функции, отклоняемые AutoCADом

Аргументы проходящих в AutoCAD функций недействительны ( таких, как функции GETVAR "NOSUCH" или SETVAR с только читаемыми системными переменными), или функция, переходящая сама в себя, недействительна в текущем контексте.

Функция снабжена некорректным типом аргумента.( Например, вы не можете взять STRLEN как целое.)

Список , объявленный функцией ASSOC, не состоит из "(нужная кла- виша ) списков.

Аргумент, проходящий в функцию ENTMOD,имеет неподходящий вход списка данных (так же , как возвращаемый функцией ENTGET).

Когда вычислена эта функция, AutoLISP удалит список недействите- льных формальных аргументов. Возможно, что функция вовсе не является функцией , а в некоторой степени , список данных.

Читайте также:  Причины списания принтера в акте на списание

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

Неподходяще организован список, которым снабжена функция. Это мо- жет случиться , если действительное число начинает десятичная точка; в таком случае вы должны использовать введение 0.

Недействителен пункт , встречаемый функцией TYPE.

Недействителен пункт , встречаемый функцией FOREACH.

Недостаточно определена точка ( список двух действительных чисел) проходящая в функцию , ожидающую точку. Будьте внимательны, не начинайте действительное число с десятичной точки; в таком случае, вы должны ис- пользовать введение 0.

То же самое ,что выше.

Первый аргумент функции BOOLE (Булева функция) должно быть це- лое мажду 0 и 15.

Эта ошибка может быть вызвана неправильным местоположением деся- тичной точки и с другой стороны, недостаточно сформулированным выражени- ем.

Пользователь ввел CTRL C , в то время , когда функция обрабаты- валась.

Деление на нуль не разрешается.

Встретились одни или более лишние правые скобки.

Описатель файла для операции ввода-вывода (I/O) не такой , как у доступного файла.

Пользователь нажал CTRL C в ответ на подсказку.

Аргумента, обозначенного в функциях LOG или SQRT,нет в диапазоне.

Аргумент функции вместо целого числа обозначен действительным. Например, (LSH val 1.2)

Аргумент в GCD отрицательное число или ноль.

Количество аргументов определяемой пользователем функции не соот- ветствует количеству формальных аргументов, объявленных функцией DEFUN.

Недостаточен участок памяти node , для того чтобы вместить потреб- ные действия. См. главу 6.

Недостаточен участок памяти heap , чтобы вместить строку текста. См. главу 6.

Неправильный тип аргумента или аргумент вне диапазона.

Выражение содержит неверный знак.

Точечные пары-это списки, содержащие два элемента, разде- ленные конструкцией "space-period-space". Вы можете получить это сооб- щение об ошибке , если вы начинаете действительное число с десятичной точки; в таком случае вы должны использовать введение 0.

Стек AutoLISPа переполнен. Это происходит из-за чрезмерного повторения функции или очень больших списков аргументов функции. Попы- тайтесь увеличить среду LISPSTACK для переменных.

Это может иметь место , если действительное число начинает деся- тичная точка; в таком случае вы должны использовать введение 0 .

Была сделана попытка вычислить функцию , которая имеет нулевой определитель.

Это результат вызова функций QUIT или EXIT. Эти функции сейчас не используются в AutoLISPе.

Слишком мало аргументов объявлено во встроенной функции

Слишком много аргументов объявлено во встроенной функции.

Ссылка на основную публикацию
Отчет времени от даты
Дата от: Год Месяц День Час Минута Дата до: Год Месяц День Час Минута Между датами прошло: Лет Месяц Дней...
Оао мобильные телесистемы зачем звонят
Давайте разберемся, что за организация Вымпел-Коммуникации. Что такое они собой представляют и зачем звонят из этой организации? Наверняка вы слышали...
Обратный элемент по модулю python
Этот алгоритм использует соотношения для НОД: НОД(2*a, 2*b) = 2*НОД(a,b) НОД(2*a, b) = НОД(a,b) при нечетном b, Он иллюстрируется следующей...
Очистка wsus от ненужных обновлений
Хранилище WSUS состоит из двух частей: базы данных MS SQL (обычно на Windows Internal Database) с информацией о всех ПК,...
Adblock detector