如何在Scheme中的do循环中使用多个语句?
问题
计算列表中出现的次数,它们必须是相邻的。例如:(aabbccae)
,返回 ( (a 2) (b 2) (c 2) (a 1) (e 1) )
。
我尝试过,
(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
循环中使用多个语句?
谢谢,
Problem
Count the number occurrence in a list, they must be adjacent. Ex: (a a b b c c a e)
, returns( (a 2) (b 2) (c 2) (a 1) (e 1) )
.
I tried,
(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))
)
)
)
)
When running, DrScheme complained
procedure application: expected procedure, given: #<void>; arguments were: #<void>
How can I use multiple statements inside an if
or a do
loop like this?
Thanks,
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
哦,你想计算游程长度!你猜怎么着!
fold 的另一个问题
! :-P(我的版本以点对的形式返回游程长度,而不是长度为 2 的列表。)由于您使用的是 Racket,因此可以使用
foldr
而不是fold-right;这样,您就不需要加载 SRFI 1。
Oh, you want to compute the run lengths! Guess what! Another problem for
fold
! :-P(My version returns the run lengths as dotted pairs, rather than lists of length 2.) Since you're using Racket, you can use
foldr
instead offold-right
; that way, you won't need to load SRFI 1.