在 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 单元格的 car
和 cdr
。当你击中一个原子时,如果匹配则加 1,如果不匹配则加 0。
(defun freq (sym tree)
(if (atom tree)
(if (eq sym tree) 1 0)
(+ (freq sym (car tree)) (freq sym (cdr tree)))))
这是我的函数
(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 单元格的 car
和 cdr
。当你击中一个原子时,如果匹配则加 1,如果不匹配则加 0。
(defun freq (sym tree)
(if (atom tree)
(if (eq sym tree) 1 0)
(+ (freq sym (car tree)) (freq sym (cdr tree)))))