我正在嘗試使用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有很多功能 - 不僅僅是一個教育計劃。 –