替代计划中的其余部分?
问题描述:
有没有一种方法可以在不使用休息的情况下完成这项工作(我试图把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))))))))
答
注意所有程序刚刚绑定变量在全球范围内 例子:
(let ((rest 5))
(rest '(1 2 3)))
?在R6RS和更高版本中,您应该得到一个例外说明号码5
不是一个程序。原因是您已覆盖此范围内的绑定rest
,并且请使用变量rest
作为对5
的绑定,而不是尝试将其称为过程。在R5RS和更早的版本中,结果是未定义的,因为它不是有效的Scheme代码,但大多数实现可能会有类似的错误,因为R6RS是必需的。
您已经完成了display
的相同操作,但是此时display
是一个与全局display
不同的操作。在R6RS中是可以的,但在R5RS和更早的版本中并不好。一个实现可以用所有支持类型的全局替换它。 display
支持全部类型,因此您的代码可能无法在所有实现中工作,因为它是无效的R5RS。
+0
我修复了一切并缩短了代码。谢谢 –
注意:由于'display'是内置函数(打印值),因此将该名称用于其他目的似乎很奇怪。 – soegaard