2017-05-05 123 views
0

有沒有一種方法可以在不使用休息的情況下完成這項工作(我試圖把cdr lst放在任何地方,但它給了我一個錯誤)以及如何刪除if條件 - (if(> N 0))因爲所有我想要顯示做的是輸出列表 - (名單NE)替代計劃中的其餘部分?

(define (count lst) 
(if (null? lst) '() 
    (let ((display (lambda (N E) 
       (if (> N 0) (list N E) (list N E))))) 
    (let loop ((rest (cdr lst)) 
       (E (car lst)) 
       (N 1)) 
     (cond ((null? rest) 
       (list (display N E))) 
      ((eq? E (car rest)) 
       (loop (cdr rest) E (+ N 1))) 
      (else 
       (cons (display N E) (loop (cdr rest) (car rest) 1)))))))) 
+0

注意:由於'display'是內置函數(打印值),因此將該名稱用於其他目的似乎很奇怪。 – soegaard

回答

0

注意所有程序剛剛綁定變量在全球範圍內 例子:

(let ((rest 5)) 
    (rest '(1 2 3))) 

?在R6RS和更高版本中,您應該得到一個例外說明號碼5不是一個程序。原因是您已覆蓋此範圍內的綁定rest,並且請使用變量rest作爲對5的綁定,而不是嘗試將其稱爲過程。在R5RS和更早的版本中,結果是未定義的,因爲它不是有效的Scheme代碼,但大多數實現可能會有類似的錯誤,因爲R6RS是必需的。

您已經完成了display的相同操作,但是此時display是一個與全局display不同的操作。在R6RS中是可以的,但在R5RS和更早的版本中並不好。一個實現可以用所有支持類型的全局替換它。 display支持全部類型,因此您的代碼可能無法在所有實現中工作,因爲它是無效的R5RS。

+0

我修復了一切並縮短了代碼。謝謝 –