Как сохранить пользовательский ввод в список в схеме? - PullRequest
1 голос
/ 02 мая 2019

Мне нужно иметь возможность принять ввод от пользователя (сохранить его в списке) и распечатать его на экране, чтобы доказать, что он был сохранен в списке, или напечатать #f, если список содержит элемент, который не являетсячисло.Идея состоит в том, чтобы затем использовать результат этой функции в другой, которая даст мне сумму (я уже сделал эту функцию).Я искал повсюду и не могу найти никакой информации о том, как это сделать, в Схеме.Я знаю, что нужно использовать let, но я не уверен, как бы я это реализовал.

(read-user-ints)

=> 1

=> 2

=> 3

=> 4

=> 5

=> e

(1 2 3 4 5)

1 Ответ

1 голос
/ 02 мая 2019

начните с определения e как пустого списка.

(define e '())

, затем вы можете использовать рекурсивный цикл с READ для получения целых, каждый раз, когда вы получаете один, вы можете добавить его в конец списканапример:

(set! e (append e (list number)))

Если вы боролись с LET-частью, вы можете сделать что-то вроде этого

(let loop ((number (read)))
    ;; check if number is actually a number or if it's 'e'
    ;; either append it or exit the loop (by not calling loop)
    )

Отвечая на ваш следующий комментарий.

Вы можете использовать BEGIN, чтобы поместить несколько операторов в одну ветвь выражения IF, например:

(define read-int-list
  (lambda ()
    (let loop ((number (read)))
      (if (number? number)
          (begin (set! e (append e (list number)))
                 (loop))
          'done
          ))))
...