Scheme 方案中的“While”循环跳过迭代

Scheme 方案中的“While”循环跳过迭代,scheme,Scheme,为了完成一个项目,我必须学习Scheme的基础知识,但是我在构建while循环的等价物时遇到了一点困难。例如,在下面的代码中,我想让用户输入一个字符。如果角色是x,我想打破循环。如果是任何其他字符,将显示该字符,循环将继续进行下一次迭代 (define getUserChar (lambda () (define ch) (let loop () (display "Enter character: ") (set! ch (read-char)) (if (not

为了完成一个项目,我必须学习Scheme的基础知识,但是我在构建while循环的等价物时遇到了一点困难。例如,在下面的代码中,我想让用户输入一个字符。如果角色是x,我想打破循环。如果是任何其他字符,将显示该字符,循环将继续进行下一次迭代

(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,我的荣幸!我用一个更为惯用的解决方案更新了我的答案;