Lisp分析原子和列表的列表

时间:2013-12-06 23:10:50

标签: recursion lisp iteration

我正在学习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.

2 个答案:

答案 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

  1. l,列表 - 如果列表不为空,则为true
  2. 'atom或'list - 两者都是符号,两者在逻辑上都是真的
  3. 如果列表的其余部分为空,或者分析结果(始终为真)
  4. ,则为true

    所以它相当于(和t t ...),t的数量是列表中的项目数。

答案 1 :(得分:0)

如果你有一个列表并想要创建一个具有相同数量元素的新列表,其中新列表的每个元素都是以原始列表中的相应元素计算的,通常的方法是使用某种类型的映射功能。

在这里,mapcar在Common Lisp中是正确的。

atom list 之间的区别不是真正的二分法 - atom 的“对立面”是 cons 。练习有两种解释:

  1. 假设 list 意味着任何不是原子的东西。请注意nil(与()相同,空列表)不是缺点而是原子。

    (defun type-symbol (thing)
      (if (atom thing)
          'atom
          'list))
    
  2. 假设 atom 意味着任何不是列表的东西。在这种情况下,nil会产生list

    (defun type-symbol* (thing)
      (if (listp thing)
          'list
          'atom))
    
  3. 将其用于mapcar

    (defun analyze (list)
      (mapcar #'type-symbol list))