Может ли И/ИЛИ использовать рекурсивную функцию, чтобы получить значение и использовать его в Common Lisp?

Я застрял на этом некоторое время. я пробовал и у меня не получается. Я думал, что понял, но тот факт, что это не работает, сбивает с толку. Я должен получить 1, но продолжаю получать ноль. Цель состоит в том, чтобы упростить выражение с помощью правил (которые я добавил ниже). Моя проблема:

(defun simplify (main-list)
  (setq count 1)

  (if (and (eq t (atom (car (cdr main-list))))
           (eq t (atom (car (cdr (cdr main-list))))))
      (print "this says that the 2 ands are cons cells"))

  (if (and (eq nil (cdr main-list))
           (eq t (atom (car main-list))))
      (print "reached end of file, going back now"))

  (if (eq 'and (car main-list))
      (progn
        (if (and (eq t (atom (car (cdr main-list))))
                 (eq nil (atom (car (cdr (cdr main-list))))))
            (if (or (eq nil (car (cdr main-list)))
                    (simplify (car (cdr (cdr main-list)))))
                nil
                (if (eq 1 (car (cdr main-list)))
                    (simplify (car (cdr (cdr main-list))))
                    (if (eq 1 (simplify (car (cdr (cdr main-list)))))))))

        (if (and (eq t (atom (car (cdr main-list))))
                 (eq t (atom (car (cdr (cdr main-list))))))
            (if (or (eq nil (car (cdr main-list)))
                    (eq nil (car (cdr (cdr main-list)))))
                nil
                (if (eq 1 (car (cdr main-list)))
                    (car (cdr (cdr main-list)))
                    (if (eq 1 (car (cdr (cdr main-list))))
                        (car (cdr main-list)))))))))

Список, который я использую:

(and 1 (and 1 1))

Это простая версия того, что я пытаюсь сделать, но я занимаюсь этим шаг за шагом, так как я совершенно не знаком с языком. Вот правила для AND, которым я должен следовать в этом домашнем задании:

(and x nil) => nil; 
(and nil x) => nil;
(and x 1) => x; 
(and 1 x) => x;

Я проверил это, выполнив

(simplify (car(cdr(cdr x))))

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


person Andy    schedule 15.03.2012    source источник
comment
не могли бы вы отформатировать код в соответствии со стандартами Лиспа, пожалуйста?   -  person Rainer Joswig    schedule 16.03.2012
comment
Я пытался, но, честно говоря, дело не в том, чтобы сначала выучить отступы, а затем сам язык ... Похоже, это то, что вы подразумеваете.   -  person Andy    schedule 16.03.2012
comment
ваш код не читается без надлежащего отступа.   -  person Rainer Joswig    schedule 16.03.2012
comment
Отступы являются такой же частью общего кода lisp, как и в коде Python IMO. В хорошем редакторе отступы заменяют необходимость думать обо всех этих скобках. Во-вторых, код не читается как есть.   -  person Clayton Stanley    schedule 16.03.2012
comment
setq не вводит локальные переменные. ПУСТЬ делает. (eq t (атом foo)) просто (атом foo). (eq nil (атом foo)) просто (не (атом foo)). Эквалайзер не работает с цифрами. ИСПОЛЬЗУЙТЕ EQL или =. Используйте такие функции, как FIRST, SECOND, THIRD вместо повторяющихся CAR CDR CDR CDR CDR...   -  person Rainer Joswig    schedule 16.03.2012
comment
первый отпечаток говорит нечто иное, чем код.   -  person Rainer Joswig    schedule 16.03.2012
comment
вторая печать говорит о файле. а файла нет вообще.   -  person Rainer Joswig    schedule 16.03.2012
comment
вы должны документировать свой код на простом английском языке, чтобы мы поняли, чего хотим достичь. Также используйте переменные вместо многократного повторения одного и того же кода.   -  person Rainer Joswig    schedule 16.03.2012
comment
В последний раз, когда у меня были комментарии, объясняющие что-то в моем коде, кто-то жаловался, что они там есть. Я прошу прощения. Очень сложно оценить, чего все хотят, и мой код трудно читать. Мой профессор сказал, что это произойдет, когда мы изучаем язык. Я отредактирую его с тем, что у меня есть сейчас, так как я решил отказаться от него и пойти другим путем.   -  person Andy    schedule 17.03.2012