Обрезка списка с использованием языка программирования Lisp - PullRequest
0 голосов
/ 24 сентября 2019

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

(defun trim-to (symbol list)
   (cond
   ((null list) 0) 
   ((equal symbol (car list)) (cons symbol (cdr list))
   (t (trim-to (cdr list))))))

Код для запуска функции:

(trim-to 'c '(a b c d e))

Предполагается, что будет выведено (c d e)но он возвращает только NIL.Есть идеи, что я сделал не так с моим кодом?

1 Ответ

4 голосов
/ 24 сентября 2019

Предполагается вывести (cde), но возвращает только NIL.Любая идея, что я сделал не так с моим кодом?

Вот ваш код, переформатированный:

(defun trim-to (symbol list)
  (cond
    ((null list) 0)
    ((equal symbol (car list))
     (cons symbol (cdr list))
     (t (trim-to (cdr list))))))

Когда я компилирую его с SBCL, у меня появляется следующее предупреждение:

предупреждение: функция T не определена, и ее имя зарезервировано ANSI CL, так что даже если он будет определен позже, код, делающий это, не будет переносимым.

Действительно, ваш код имеет следующую форму (t ...) в обычном контексте оценки;Вы хотели, чтобы это было предложение в форме cond, но перед ним отсутствует закрывающая круглая скобка, из-за чего (t ...) формирует выражение, которое будет оцениваться после (cons symbol (cdr list)) (и, таким образом, оно создает предыдущую формубесполезно, так как его результат отбрасывается).В этом вам может помочь редактор, который выделяет совпадающие скобки (большинство современных редакторов делают это «из коробки»).

Поскольку ваш тест не соответствует второму предложению cond, код не достигчасть, где вы хотите вызвать функцию с именем T, и у вас не было ошибки во время выполнения.Но значением по умолчанию для формы cond является NIL, поэтому вы видите этот результат.

Не давая полного ответа, вот ожидаемый след выполнения для вашего примера:

0: (TRIM-TO C (A B C D E))
  1: (TRIM-TO C (B C D E))
    2: (TRIM-TO C (C D E))
    2: TRIM-TO returned (C D E)
  1: TRIM-TO returned (C D E)
0: TRIM-TO returned (C D E)
...