在方案中更换休息?

时间:2017-05-05 09:45:43

标签: functional-programming scheme mit-scheme

有没有一种方法可以让我在不使用休息的情况下完成这项工作(我试图将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))))))))

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。