2013-11-24 3 views
-1

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

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

*** - EVAL: undefined function NEW-D1 

Я смущен, почему я получать эту ошибку, потому что new-d1 не является функцией, это переменная для длины кратчайшего края данного поля.

Вот код, где new-d1 сначала инициализируется и установить:

(defun get-box() 
    (let ((d1 0) (d2 0) (d3 0) (new-d1 0) (new-d2 0) (new-d3 0)) 
    (setf d1 (read)) 
    (setf d2 (read)) 
    (setf d3 (read)) 
    (if (= d1 -1) 
     (exit) 
     (progn 
     (setq new-d1 (first (sort (list d1 d2 d3) #'<))) 
     (setq new-d2 (second (sort (list d1 d2 d3) #'<))) 
     (setq new-d3 (third (sort (list d1 d2 d3) #'<))) 
     (next-part-of-program (new-d1 new-d2 new-d3)))))) 

Как я могу изменить свой код, интерпретатор знает новый-d1 не функция, а не рассматривать его как таковой? Спасибо за любую помощь!

Edited добавить: Следующая часть кода программы:

(defun next-part-of-program(d1 d2 d3) 
    (if (> d2 b) 
     (put-on-c-list(d1 c-list)) 
     (if (> d2 a) and (< d2 c) 
      (put-on-b-list (d1 b-list)) 
      (put-on-a-list (d1 a-list))))) 

Примечание: Я инициировало-лист, б-лист, и с-список ранее как глобальные переменные/списки, которые будут добавлены позже ,

Еще раз спасибо!

+0

Когда я бегу вашей функции, я получаю другую ошибку: функция 'next-part-of-program' не определена. Символ 'new-d1' не используется как funtion в приведенном выше коде. Пожалуйста, обновите свой вопрос с фактическим кодом, который вызывает ошибку. – Kaz

+0

Возможно, что у вас определенная функция 'next-part-of-program', и это место, где' new-d1' вызывается или иным образом используется как функция. – Kaz

+0

Спасибо; Я добавил в следующую функцию в своем коде. Является ли 'new-d1' использоваться как функция здесь или может быть даже позже в моем коде, например, в' put-on-a-list'? – user1462294

ответ

3

Последняя строка get-box должна быть:

(next-part-of-program new-d1 new-d2 new-d3))))) 

Вы не должны иметь скобки вокруг аргументов next-part-of-program

+0

+1; который покажет еще одну ошибку: Ошибка: переменная B не связана. – henginy

+0

Спасибо; очень признателен! – user1462294

+0

В этом случае «переменная B» относится к другой переменной B ранее в моей программе или к одному из параметров «next-part-of-program»? – user1462294

1

Вы можете написать его немного короче:

(defun get-box (&aux (d1 (read)) (d2 (read)) (d3 (read))) 
    (if (= d1 -1) 
     (exit) 
    (apply #'next-part-of-program 
      (sort (list d1 d2 d3) #'<))))