Scheme 如何在方案中的do循环中使用多个语句?

Scheme 如何在方案中的do循环中使用多个语句?,scheme,Scheme,问题 计算列表中出现的数字,它们必须相邻。例如:(a a b c a e),返回 ((a2)(b2)(c2)(a1)(e1)) 我试过了 (define (loop lst) (let ((i 1) (j 0)) (do () [(> j (- (length lst) 2))] (if (eq? (car lst) (cadr lst)) (set! i (+ i 1)) (display i) )

问题
计算列表中出现的数字,它们必须相邻。例如:
(a a b c a e)
,返回
((a2)(b2)(c2)(a1)(e1))

我试过了

(define (loop lst) 
  (let ((i 1) (j 0))
    (do ()
      [(> j (- (length lst) 2))]
      (if (eq? (car lst) (cadr lst))
          (set! i (+ i 1))
          (display i)
      )
      (
         (set! lst (cdr lst))
         (set! j (+ j 1))
      )
    )
  )
)
在运行时,DrScheme抱怨

procedure application: expected procedure, given: #<void>; arguments were: #<void>
程序应用:预期程序,给定:#;论点如下:#
如何在像这样的
if
do
循环中使用多个语句


谢谢,

哦,你想计算跑步长度!猜猜看!折叠的另一个问题是:-P

(define (run-lengths lst)
  (fold-right (lambda (elem result)
                (if (and (pair? result)
                         (equal? elem (caar result)))
                    (cons (cons elem (+ (cdar result) 1)) (cdr result))
                    (cons (cons elem 1) result)))
              '() lst))

(我的版本以虚线对的形式返回行程长度,而不是长度2的列表。)因为您使用的是Racket,所以可以使用
foldr
而不是
fold right
;这样,您就不需要加载SRFI 1。

-1我的眼睛!护目镜没用@克里斯·杰斯特·杨:我不明白?你想做什么?这看起来不像一个理智的阴谋家会或应该写的任何代码。@chrisjester-Young:原谅我!我现在正在努力学习这个计划。我被传统的命令式语言结构迷住了。我觉得使用括号作为代码块非常不舒服。老实说,我差点放弃了!是的,这就是为什么我刚刚给你发了一个基于
折叠
的答案。一旦掌握了
折叠
映射
等技巧,您就不想再使用命令式循环了。:-)(顺便说一句,我刚刚撤回了我的反对票。谢谢你解释你的任务。)@Chris Jester Young:现在,你伤了我的眼睛。谢谢@陈:哈哈哈。通过阅读
foldr
的工作原理,尽最大努力研究我的函数是如何工作的。它会启发你的!:-)@克里斯·杰斯特·杨:嗯,我很熟悉折叠的含义。我从Wiki中读到,类似于<>代码:ST::C++中的累积< /代码>。尽管如此,
()
还是非常烦人:(!@Chan:这就像
std::acculate
:-)有一天,你会习惯于看括号(或者更确切地说,不看括号)。:-)@Chan:注意代码结构的不同。Lisper不会像C*语言程序员在一行上放花括号一样,在一行上放“悬空”括号。这实际上增加了代码的可读性。有关更多信息,请查看此lisp样式指南: