Scheme 方案中的“While”循环跳过迭代
为了完成一个项目,我必须学习Scheme的基础知识,但是我在构建while循环的等价物时遇到了一点困难。例如,在下面的代码中,我想让用户输入一个字符。如果角色是x,我想打破循环。如果是任何其他字符,将显示该字符,循环将继续进行下一次迭代Scheme 方案中的“While”循环跳过迭代,scheme,Scheme,为了完成一个项目,我必须学习Scheme的基础知识,但是我在构建while循环的等价物时遇到了一点困难。例如,在下面的代码中,我想让用户输入一个字符。如果角色是x,我想打破循环。如果是任何其他字符,将显示该字符,循环将继续进行下一次迭代 (define getUserChar (lambda () (define ch) (let loop () (display "Enter character: ") (set! ch (read-char)) (if (not
(define getUserChar (lambda ()
(define ch)
(let loop ()
(display "Enter character: ")
(set! ch (read-char))
(if (not (char=? ch #\x))
(begin
(display choice)
(loop)
)))))
这在技术上是可行的,但它跳过了一次迭代。例如:
Enter character: a
Enter character:
Enter character: s
在第二次迭代中,我无法输入字符。我似乎不能准确地指出问题所在。非常感谢您的帮助。问题是您实际上在阅读两个字符。你打的那个,加上换行符。我试图尽可能多地保留您最初的解决方案,这就是我想到的:
(define getUserChar
(lambda ()
(define ch #\0)
(let loop ()
(display "Enter character: ")
(set! ch (string-ref (read-line) 0))
(if (not (char=? ch #\x))
(begin
(display ch)
(newline)
(loop))))))
IMHO一个更惯用的解决方案不需要变异操作,我更喜欢这个:
(define (getUserChar)
(let loop ((ch #\0))
(unless (char=? ch #\x)
(display "Enter character: ")
(let ((ch (string-ref (read-line) 0)))
(display ch)
(newline)
(loop ch)))))
问题是你实际上在读两个字符。你打的那个,加上换行符。我试图尽可能多地保留您最初的解决方案,这就是我想到的:
(define getUserChar
(lambda ()
(define ch #\0)
(let loop ()
(display "Enter character: ")
(set! ch (string-ref (read-line) 0))
(if (not (char=? ch #\x))
(begin
(display ch)
(newline)
(loop))))))
IMHO一个更惯用的解决方案不需要变异操作,我更喜欢这个:
(define (getUserChar)
(let loop ((ch #\0))
(unless (char=? ch #\x)
(display "Enter character: ")
(let ((ch (string-ref (read-line) 0)))
(display ch)
(newline)
(loop ch)))))
这与您在循环的第一次迭代中输入两个字符有关,即a\n a~n,这使得第二次迭代仅将您与\a一起输入的\NewLine作为字符
如果您想一次取一整行,您可以选择R6RS或阅读R7RS行,或者在开始新的迭代之前查看R6RS并吞咽字符以继续使用字符。这与您在循环的第一次迭代中输入两个字符有关,即a\n a~n,这使得第二次迭代只需将您与\a一起输入的\NewLine作为字符
如果您想一次使用一整行字符,可以使用R6RS或阅读R7RS行,或者在开始新的迭代之前查看R6RS并吞咽字符以继续使用字符。在阅读输入时,我总是忘记这个细节。非常感谢你的帮助。@Robbeh,我的荣幸!我用一个更为惯用的解决方案更新了我的答案;在阅读输入时,我总是忘记那个细节。非常感谢你的帮助。@Robbeh,我的荣幸!我用一个更为惯用的解决方案更新了我的答案;