现在我有一个列表:
(+ 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)