2017-05-05 96 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

我修复了一切并缩短了代码。谢谢 –