我正在学习lisp,我被要求编写一个名为analyze的函数,它接受一个列表并返回一个由符号'atom'和'list'组成的列表。
例如, (分析'(a b(c d)e f))应该返回(原子原子列表原子原子)
这是我到目前为止所拥有的:
(defun analyze(l)
(and l
(if (not(null (atom (first l))
)
)
'atom 'list
)
(or (null (rest l))
(analyze (rest l)))
)
)
由于某种原因,它总是返回T.
答案 0 :(得分:2)
我猜你的意图是这样的:
(defun analyze (l)
(if l ; if list is not empty
(cons ; add
(if (atom (car l)) ; 1) a symbol describing the type of (car a)
'atom
'list)
(analyze (cdr l))))) ; 2) do the same with the rest of the list
您的代码正确缩进,如下所示:
(defun analyze (l)
(and l
(if (not (null (atom (first l))))
'atom 'list)
(or (null (rest l))
(analyze (rest l)))))
所以它是<{p}之间的and
所以它相当于(和t t ...),t的数量是列表中的项目数。
答案 1 :(得分:0)
如果你有一个列表并想要创建一个具有相同数量元素的新列表,其中新列表的每个元素都是以原始列表中的相应元素计算的,通常的方法是使用某种类型的映射功能。
在这里,mapcar
在Common Lisp中是正确的。
atom 和 list 之间的区别不是真正的二分法 - atom 的“对立面”是 cons 。练习有两种解释:
假设 list 意味着任何不是原子的东西。请注意nil
(与()
相同,空列表)不是缺点而是原子。
(defun type-symbol (thing)
(if (atom thing)
'atom
'list))
假设 atom 意味着任何不是列表的东西。在这种情况下,nil
会产生list
。
(defun type-symbol* (thing)
(if (listp thing)
'list
'atom))
将其用于mapcar
:
(defun analyze (list)
(mapcar #'type-symbol list))