read-line в let не будет читать следующую строку

  1 (use-modules (ice-9 rdelim))
  2 
  3 (define (show l) (display l))
  4 
  5 (define (read-two-lines)
  6         (let ((count  (read-line))
  7               (l      (read-line)))
  8              (show l))) ; or (show count)
  9              
 10 (read-two-lines)

Приведенный выше код не может прочитать вторую строку в l. Вместо этого он просто дважды считывает одно и то же значение: -

scheme@(guile-user)> (load "test.scm")

line1
line2
line1

Когда в качестве входных данных задается строка1, за которой следует строка2, в качестве вывода отображается строка1, а не строка2. Что здесь происходит?


person Himanshu    schedule 23.01.2014    source источник


Ответы (1)


У меня не установлен Guile, поэтому я не могу проверить это, но в схеме let не гарантируется порядок оценки. Поэтому я думаю, что count содержит вторую строку, а l — первую.

Попробуйте использовать let* вместо let:

(define (read-two-lines)
  (let* ((count  (read-line))
         (l      (read-line)))
    (show l)))

Более подробное объяснение см. здесь.

person uselpa    schedule 23.01.2014
comment
Да пусть* работает. Однако и (показать количество), и (показать l) показывают только первую строку. - person Himanshu; 24.01.2014