gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:47:57 25 4
gpt4 key购买 nike

现在我有一个列表:

(+ 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 - 如何在普通 lisp 中递归地将函数应用于所有子列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54849671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com