现在我有一个列表:
(+ 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))
我的主要问题是如何让 Lisp 知道我想在得到 (- (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))
但是这个函数不会存储任何东西......我不知道该怎么做:(任何人都可以给我一些帮助吗?谢谢。
最佳答案
如果我正确理解了这个问题,你应该只编写一个处理操作和数字/符号转换的递归函数,例如:
(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)
关于list - 如何在 Common Lisp 中递归地将函数应用于所有子列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54849671/