ошибка в функции lisp - PullRequest
       5

ошибка в функции lisp

1 голос
/ 08 декабря 2011

Здесь 'функция, которая у меня есть.

(defun add-word-2 (n line)
    (let ((temp-word (make-array 0 :element-type 'character
                 :fill-pointer 0
                 :adjustable t)))
      (vector-push-extend (char line n) temp-word)
      (loop 

        (if (or (char= #\newline (char line (+ n 1)))
                (char= #\space (char line (+ n 1))))
            ((vector-push-extend temp-word *word-array-2*)(return-from add-word-2 n)) 
            ((incf n)(vector-push-extend (char line n) temp-word))))))

Я полагаю, что она опускается до конца внутри функции if после оценки в falseЯ получаю ошибку:

Error: Illegal function object: (INCF N).
[condition type: TYPE-ERROR]

Это проблема с областью действия, существует ли n внутри функции let?Не совсем уверен, что означает эта ошибка.

Ответы [ 2 ]

3 голосов
/ 08 декабря 2011

Вы получаете ошибку, потому что первая позиция в списке, который оценивается, как ожидается, будет именем функции. Например, в вашей ветке else:

((incf n) (vector-push-extend (char line n) temp-word))

(incf n) должно быть именем функции, чтобы это было допустимо, но, очевидно, это не так. Если вы хотите поместить последовательность выражений, в которой разрешено только одно, обычное решение - progn. Таким образом, ваша ветвь else станет:

(progn
  (incf n)
  (vector-push-extend (char line n) temp-word))

Хотя в этом случае вы могли бы использовать тот факт, что (incf n) возвращает новое значение n, поэтому вы также можете просто написать:

(vector-push-extend (char line (incf n)) temp-word)

Тогда ветвь должна также иметь progn.

РЕДАКТИРОВАТЬ: альтернативная реализация всей функции

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

(defun add-word-3 (start line)
  (let ((end (position-if (lambda (char) (member char '(#\Newline #\Space)))
                          line
                          :start start)))
    (vector-push-extend (subseq line start end) *word-array-2*)
    end))
1 голос
/ 08 декабря 2011
  1. В Лиспе каждый набор скобок имеет значение. Вы не можете добавлять лишние скобки вольно-невольно. В частности, если вы видите двойные открывающие скобки вне переменных привязок формы let, вы, вероятно, делаете что-то не так.ветвь вашей if, вам, вероятно, необходимо использовать progn.
  2. Во второй ветви вашей if, (+ n 1) находится не в том месте.Вместо этого измените (char line n) на (char line (+ n 1)).

Таким образом:

(if (or ...)
    (progn
     (vector-push-extend temp-word *word-array-2*)
     (return-from add-word-2 n))
    (vector-push-extend (char line (+ n 1)) temp-word))

Сказав это, я понятия не имею, что пытается сделать ваша функция, поэтомуВыше это просто лучшая догадка.; -) * 1 021 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...