有没有一种方法可以让我在不使用休息的情况下完成这项工作(我试图将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 :(得分:0)
请注意,所有过程仅绑定到全局范围中的变量。 例如:
(let ((rest 5))
(rest '(1 2 3)))
在R6RS及更高版本中,你应该得到一个例外,说5
号不是一个程序。原因是您已覆盖此范围内的绑定rest
,并且shoudl使用变量rest
作为5
的绑定,而不是尝试将其称为过程。在R5RS及更早版本中,结果是未定义的,因为它不是有效的Scheme代码,但大多数实现可能会有类似的错误,因为需要R6RS。
您已对display
做了同样的事情,但这次display
是一个除全局display
以外的其他程序。它在R6RS中没问题,但在R5RS及更早版本中表现不佳。对于所有受支持的类型,可以使用全局替换它。 display
支持所有类型,因此您的代码可能无法在所有实现中使用,因为它是无效的R5RS。