我正在尝试在lisp中进行深度反转功能。例如:
// the alert view
let alert = UIAlertController(title: "", message: "alert disappears after 5 seconds", preferredStyle: .alert)
self.present(alert, animated: true, completion: nil)
// change to desired number of seconds (in this case 5 seconds)
let when = DispatchTime.now() + 5
DispatchQueue.main.asyncAfter(deadline: when){
// your code with delay
alert.dismiss(animated: true, completion: nil)
}
这是我的代码。
(a (b c d) e) -> (e (d c b) a)
每当我编译并加载时,都会出错:
错误:尝试乘坐不是listp的E的汽车
答案 0 :(得分:4)
最简单的选择是仅REVERSE
当前列表,并使用MAPCAR
来反转具有相同功能的所有子列表。
(defun tree-reverse (tree)
"Deep reverse TREE if it's a list. If it's an atom, return as is."
(if (listp tree)
(mapcar #'tree-reverse
(reverse tree))
tree))
(tree-reverse '(a (b c d) e)) ;=> (E (D C B) A)
答案 1 :(得分:3)
在你的函数中,你假设如果l
输入变量不是nil
,那么它必然是一个cons-cell,因为你无条件地在{{1}内取(car l)
功能。这就是你出错的原因。还有许多其他不是(list ...)
的东西,此时可以绑定到nil
,例如数字或符号。
顺便说一下,l
只是构建一个列表,您需要使用(list ...)
。由于您排除了listp
案例并且列表定义为nil
或nil
,因此您也可以使用cons
。