Преобразовать строку в код в схеме - PullRequest
8 голосов
/ 26 ноября 2008

Как мне преобразовать строку в соответствующий код в PLT Scheme (который не содержит метод string->input-port)? Например, я хочу преобразовать эту строку:

"(1 (0) 1 (0) 0)"

в этот список:

'(1 (0) 1 (0) 0)

Возможно ли это сделать без открытия файла?

Ответы [ 4 ]

10 голосов
/ 26 ноября 2008

Схема имеет процедуру read для чтения s-выражений из входного порта, и вы можете преобразовать строку во входной поток с помощью string->input-port. Таким образом, вы можете прочитать объект Scheme из строки с

(read (string->input-port "(1 (0) 1 (0) 0)"))

У меня не установлена ​​схема, поэтому я только прочитал ее из ссылки и фактически не проверял ее.

5 голосов
/ 26 ноября 2008

Из руководства по схеме PLT:

(open-input-string string [name-v]) создает входной порт, который считывает байты из кодировки UTF-8 строки (см. Раздел 1.2.3) строки. Необязательный аргумент name-v используется в качестве имени для возвращаемого порта; по умолчанию 'string.

2 голосов
/ 26 ноября 2008

Из этого аналогичного вопроса на comp.lang.scheme вы можете сохранить строку в файл, а затем прочитать из него.

Это может выглядеть примерно так:

(let ((my-port (open-output-file "Foo")))
  (display "(1 (0) 1 (0) 0)" my-port)
  (close-output-port my-port))

(let* ((my-port (open-input-file "Foo"))
       (answer (read my-port)))
  (close-input-port my-port)
  answer)
1 голос
/ 26 ноября 2008

Многие схемы имеют with-input-from-string str thunk, который выполняет thunk в контексте, где str - это стандартный входной порт. Например, в схеме гамбит:

(with-input-from-string "(foo bar)" (lambda () (read)))

оценивается в:

(foo bar)

Лямбда необходима, потому что thunk должна быть процедурой без аргументов.

...