Получение строки пользовательского ввода в схеме? - PullRequest
4 голосов
/ 04 июля 2010

Я знаю, что вы можете использовать (чтение), чтобы получить введенное пользователем выражение, но (чтение) получит только первое выражение, оценивая что-либо впоследствии. Мне было интересно, есть ли какой-нибудь способ, которым я мог бы прочитать всю строку пользовательского ввода, возможно, превратив упомянутую строку в список?

(let ((input (read-user-line)))
   ;; user could type "cons 2 3" without quotes
   ;; input could contain '(cons 2 3)
   (apply (car input) (cdr input)))

Спасибо! * * 1004

Ответы [ 3 ]

5 голосов
/ 04 июля 2010

Если ваша Схема является реализацией R6RS, вы можете использовать GET-LINE. Если та же самая Схема также реализует SRFI-13, вы можете использовать STRING-TOKENIZE, чтобы превратить ее в список.

Одна схема, которая квалифицируется как Ypsilon:

(import (srfi srfi-13))

(let ((input (get-line (current-input-port))))
  (for-each (lambda (x) (display x) (newline))
            (string-tokenize input)))
$ <b>ypsilon try.scm</b>
<b>the quick brown fox jumps over the lazy dog.</b>
the
quick
brown
fox
jumps
over
the
lazy
dog.

В противном случае вы сами по себе с любыми нестандартными расширениями, которые обеспечивает ваша реализация.

2 голосов
/ 04 июля 2010

Некоторые схемы имеют функцию read-line, которая читает строку и возвращает ее в виде строки.

(Но перейти от этого к чему-то, что вы можете apply, - это другая история.)

0 голосов
/ 05 июля 2010

Вы можете использовать read-line для чтения его как строки.

Затем вы просто разделяете его на пробелы в список строк

Затем вы используете read для тех, кто использует with-input-from-string

И затем вы используете apply.

Вы не можете просто применять строки, вы можете только применять данные схемы, строки - это данные схемы, а не процедуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...