list - 如何在 Common Lisp 中递归地将函数应用于所有子列表?

标签 list loops recursion lisp common-lisp

现在我有一个列表:

(+ 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/

相关文章:

javascript - 如何使用 dojo 创建可滚动的移动 ListView ?

带有嵌套循环问题的 C++ 完美数

c++ - C++ 的其他循环选项

php - 在 if 条件中放置一个 foreach 循环

c - 在二叉树中插入一个节点 - 将迭代转换为递归

Java 多态性和列表

python - 如何通过字符串尾随数字从列表中选择一个项目

C - 将 9 转为 0

c# - 合并xml文件

r - 将列表对象的列表转换为 R 中的数据框