как применить рекурсивную функцию ко всем подспискам в общем lisp? - PullRequest
0 голосов
/ 24 февраля 2019

теперь у меня есть список:

(+ x (- 4 9))

Сначала мне нужно (- 4 9) поменять на (- (4,0) (9,0)) (пожалуйста, переживайте эту часть слишком сильно)

(defun typecheck (A)
(cond
  ((numberp A)
   (cons A 0))
  ((equal A 'x)
   (cons 1 1))
  (t A)))

тогда мне нужно вычесть (4,0) и (9,0) (но это не моя проблема, я не хочу публиковать эту функцию, потому что она слишком длинная ...

таким образом, оно становится

(+ x (-5 . 0))

, теперь на этот раз я изменяю x на (1. 1), поэтому список становится (+ (1. 1) (- 5. 0)) я, наконец,сложите их вместе (окончательный результат (-4. 1))

Моя главная проблема заключается в том, чтобы дать понять Лиспу, что я хочу сначала вычислить их после того, как получу (- (4. 0) (9 .0))? Моя функция просто сразу перейдет к (+ (1. 1) ((- 4 .0) (9. 0)) и выдала мне сообщение об ошибке.

Мой процесс:

(defun check (A)
  (cond
   ((atom A)
    (let ((newA (typecheck A)))
      (calucalte A)))
   ((listp A)
    (mapcar #'check A))

но эта функция ничего не будет хранить ... и я не знаю, как это сделать :( Кто-нибудь может мне помочь? СПАСИБО.

1 Ответ

0 голосов
/ 24 февраля 2019

Если я правильно понял проблему, вы должны просто написать одну рекурсивную функцию обработки операций и преобразования цифр / символов, например:

(defun tcheck (expr)
  (cond
    ((numberp expr)
     (cons expr 0))
    ((eq expr 'x)
     (cons 1 1))
    ((listp expr)
     (cond
       ((eq (first expr) '+)
        (let ((a (tcheck (second expr)))
              (b (tcheck (third expr))))
          (cons (+ (car a) (car b))
                (+ (cdr a) (cdr b)))))
       ((eq (first expr) '-)
        (let ((a (tcheck (second expr)))
              (b (tcheck (third expr))))
          (cons (- (car a) (car b))
                (- (cdr a) (cdr b)))))
       (T
         (error "Unknown operation"))))
    (T expr)))

С помощью вышеуказанной функции

(tcheck '(+ x (- 4 9)))

возвращает (-4 . 1)

...