如何在Lisp中进行深度反转功能

时间:2016-10-08 09:37:28

标签: recursion lisp common-lisp reverse

我正在尝试在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的汽车

2 个答案:

答案 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案例并且列表定义为nilnil,因此您也可以使用cons