我正在尝试使用Common Lisp函数编写一个函数,只会计算s表达式中有多少个s表达式。例如:Lisp 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
。这意味着表达式(if x then ....)
尚未计算在内。
我能以什么方式解释它?添加+2
会重复计算未嵌套的表达式。
我需要这一个功能工作作为嵌套可以在任何地方发生,所以:
((x = y) (if y then (z = w)))
这看起来很奇怪。你说'我正在尝试使用Common Lisp函数编写函数'。然而,你的代码在Scheme中? –
@RainerJoswig我的代码在方案中,但我只使用LISP数字基元,谓词和函数。 – darksky
好吧,但这与Common Lisp无关。 Common Lisp有很多功能 - 不仅仅是一个教育计划。 –