MIT Scheme имеет string->input-port
, Racket имеет open-input-string
. Как реализовать это в чистой схеме (без Racket, Chicken, Gambit или любого расширения, специфичного для реализации).Преобразование кода в/из строки
ответ
Согласно Chis' answer, у нас есть новый стандарт схемы, R7RS. Он имеет open-input-string
.
Для старых R6RS тривиально реализовать то же самое с make-custom-textual-input-port от (rnrs io ports (6))
библиотеки. Вот что-то я соединял:
#!r6rs
(import (rnrs base (6))
(rnrs io ports (6))
(rnrs mutable-strings (6))
(rnrs io simple (6)))
(define (open-input-string str)
;; might not be so important to have a different indentifier
;; but this will make debugging easier if implementations use the
;; id provided
(define get-id
(let ((n 0))
(lambda (str)
(set! n (+ n 1))
(string->symbol
(string-append "string-port" str "-"
(number->string n))))))
(let ((len (string-length str))
(pos 0))
(make-custom-textual-input-port
(get-id str)
(lambda (string start count)
(let loop ((cur-dst start)
(cur-src pos)
(n 0))
(cond ((or (>= cur-src len)
(>= n count))
(set! pos cur-src)
n)
(else
(string-set! string cur-dst (string-ref str cur-src))
(loop (+ cur-dst 1)
(+ cur-src 1)
(+ n 1))))))
(lambda() pos)
(lambda (new-pos) (set! pos new-pos))
#f)))
(define test (open-input-string "(1 2 3 4)(5 6 7 8)"))
(define str (read test)) ; str == (1 2 3 4)
(define str2 (read test)) ; str2 == (5 6 7 8)
С R5RS
не существует способ сделать это, за исключением использования файла.
Хорошо, давайте сделаем одно лучше: R7RS недавно был ратифицирован, и у него есть 'open-input-string' встроенный. ;-) –
@ ChrisJester-Young Я буду использовать его, у второго Ikarus и Racket есть поддержка для него :) – Sylwester
Написать строку в (временный) файл, а затем возвращает входной порт, чтобы прочитать его обратно в Как это:.
(define (open-input-string string)
(let ((file "/tmp/foo"))
(call-with-output-file file
(lambda (port)
(display string port)))
(open-input-file file)))
> (define ps (open-input-string "This is a test; it is only a test"))
> ps
#<input-port (textual) "/tmp/foo">
> (read-line ps)
"This is a test; it is only a test"
Обратите внимание, вы должны быть более сложными с использованием file
. Например, приведенный выше код работает только один раз; он будет терпеть неудачу с «файлом существует» во втором вызове. Но вышесказанное является простым ответом на ваш вопрос.
Запись в фиксированный файл temp очень небезопасна, так как открывает возможности для [атаки символической ссылки] (http://en.wikipedia.org/wiki/Symlink_race). Чтобы быть в безопасности, вам придется использовать 'mkstemp', который не является« чистой схемой ». –
Спасибо. Здесь не решаются проблемы мира; просто отвечая на вопрос для нуждающегося человека. – GoZoner
Возможно, но это все еще плохое решение, похожее на то, что кто-то использует 'gets' (в C) для чтения в строке из stdin. –
В недавно ратифицированном R7RS, open-input-string
предоставляется непосредственно. (Благодаря Сильвестер за напоминание мне смотреть за R5RS. :-))
В R5RS, чистая Схема реализации строковых портов не является тривиальной, так как она требует, чтобы переопределить все функции ввода/вывода стандарта , См. SRFI 6 для справочной реализации.
Это действительно лучше, если ваша реализация поддерживает строковые порты напрямую.
- 1. Преобразование Рубинового кода строки
- 2. OWL ВИЗ ошибка в Protege 4.2
- 3. Скомпилировать dll/exe с помощью смены виз
- 4. Преобразование этой строки кода на C
- 5. Преобразование одной строки кода VB.Net в C#
- 6. Преобразование одной строки кода delphi в C++
- 7. (Ruby) Преобразование строки в строку кода?
- 8. Преобразование строки кода из VB в C#
- 9. Преобразование кода командной строки в код vbs
- 10. «Преобразование» командной строки кода Java для Weka
- 11. Преобразование строки PHP в строку кода ключа
- 12. Преобразование кода строки из C++ в C
- 13. Groovy-Преобразование строки кода в несколько строк
- 14. Преобразование кода
- 15. Преобразование кода
- 16. Преобразование кода на C++?
- 17. Преобразование кода в IJVM
- 18. Преобразование кода mysql в mysqli
- 19. Преобразование кода Matlab в Python
- 20. Преобразование кода в C#?
- 21. Преобразование кода Java Netbeans
- 22. Преобразование старого C кода
- 23. Преобразование кода в POST
- 24. Преобразование кода Javascript
- 25. Преобразование кода в псевдокод
- 26. Преобразование простого кода JavaScript
- 27. преобразование кода в символ
- 28. Язык Преобразование кода страны
- 29. Преобразование кода в vb.net
- 30. Преобразование кода в клипы
В какой версии вы нацеливаетесь. Текущий R6RS или старый R5RS? – Sylwester