如何在通用LISP中递归地将函数应用于所有统一的函数



现在我有一个列表:

(+ x (- 4 9))

i首先需要(-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))

我的主要问题是如何让LISP知道我要在获得( - (4。0)(9 .0)之后先计算它们)?我的功能只会对( (1。1)(( - 4 .0)(9。0)),然后给我一个错误msg。

我的过程:

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

但是这个功能不会存储任何东西...我不知道该怎么做:(任何人可以给我一些帮助吗?谢谢。

如果我正确理解了问题,您应该只编写单个递归功能处理操作和数字/符号转换,例如:

(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)

最新更新