我正在尝试使用 Common Lisp 函数编写一个函数,该函数将计算一个 s 表达式中有多少个 s 表达式。例如:
((x = y)(z = 1)) ;; returns 2
和
((x - y)) ;; returns 1
嵌套表达式是可能的,所以:
((if x then (x = y)(z = w))) ;; returns 3
我写了一个函数来查找长度,如果没有嵌套表达式,它就可以工作。这是:
(define (length exp)
(cond
((null? exp) 0)
(#t (+ 1 (length (cdr exp))))))
现在我修改了它以尝试支持以下嵌套表达式:
(define (length exp)
(cond
((null? exp) 0)
((list? (car exp)) (+ 1 (length (cdr exp))))
(#t (length (cdr exp)))))
这适用于没有嵌套的表达式,但总是比嵌套表达式的答案小 1。这是因为以上面的示例为例((if x then (x = y)(z = w)))
,这将if
首先查看并满足第三个条件,将 cdr(表达式的其余部分作为列表)返回到length
. 在达到 (x=y) 之前也是如此,此时+1
返回 a。这意味着该表达式(if x then .... )
尚未计算在内。
我可以通过哪些方式来解释它?添加+2
将过度计算未嵌套的表达式。
我需要它在一个函数中工作,因为嵌套可以在任何地方发生,所以:
((x = y) (if y then (z = w)))