在 L. LISP 的任何地方发现符号 A 的出现

Occurrence of symbol A found anywhere in L. LISP

这是我的函数

(defun freq (symbol_A List_L)
    (cond ((atom (car List_L)) 
        (cond ((eq (car List_L) symbol_A) t (+ 1 (freq symbol_A (cdr List_L))))
            (t 0))) 
    (T (freq symbol_A (cdr List_L))))
)

我收到一个错误变量 ATOM 没有值。这是我用

测试的内容
(freq  'c '((a c) c e)) --> 2
(freq  'f '(((s) o ) d)) --> 0
(freq  'f '(((f) f) f f)) --> 4

无法理解我的错误在哪里。

我也试过这个:

(defun freq (a L)
  (cond
   ((null L) 0)
   ((equal a (car L)) (+ 1 (freq a (cdr L))))
   (t (freq a (cdr L)))))

您的代码中存在语法错误。

缩进和格式化代码

首先你需要格式化你的代码:

(defun freq (A L)
  (cond (atom (car L))             ; first clause
        (eq A (car (car L )))      ; second clause
        (T (+ 1 (freq A (cdr L)))) ; third clause
        (T (freq A (cdr L)))))     ; fourth clause

一个有用的COND:

(cond ((> i 0) :positive)
      ((< i 0) :negative)
      (t       :equal))

你写了类似的东西:

(cond (> i 0) :positive
      (< i 0) :negative
      (t      :equal))

这里 Lisp 解释器会抱怨 > 没有价值。这是因为它被用作变量。 (> i 0) 被视为第一个子句,测试形式是变量 >。因为 > 通常不是变量,所以这是一个错误。

编译器甚至可能在编译时拒绝整个形式,因为有些子句不是列表。

如您所见,您的代码中缺少子句两边的括号。 检查 cond...

的语法
cond {clause}* => result*

A cond 有零个或多个子句。

clause::= (test-form form*) 

每个子句都是一个列表 (!!),以测试形式开头,后跟零个或多个形式。

T作为测试形式的两个子句也是没有意义的。第一个将始终被采用,第二个将始终被忽略。

知道 nil 是一个原子,您可以简单地递归每个 cons 单元格的 carcdr。当你击中一个原子时,如果匹配则加 1,如果不匹配则加 0。

(defun freq (sym tree)
  (if (atom tree)
      (if (eq sym tree) 1 0)
      (+ (freq sym (car tree)) (freq sym (cdr tree)))))