Подскажите, как преобразовать строку в список - Lisp
Формулировка задачи:
Возник еще один вопрос:
На вход функции поступает Список.
Каким образом можно преобразовать строку вида: "((x (y L) L) (z L) L))" в список вида '((x (y L) L) (z L) L)) ?
Данная строка или множество подобных строк будут считываться из входного файла.
Функции (concatenate 'list str) и (coerce "abc" 'list) не дают искомого, возвращают список с элементами вида #\x
Заранее благодарен.
Решение задачи: «Подскажите, как преобразовать строку в список»
textual
Листинг программы
(defvar *rt* (copy-readtable)) (setf (readtable-case *rt*) :preserve) (set-macro-character #\L (lambda (x stream) (declare (ignore x stream)) 'l) nil *rt*) (let ((*readtable* *rt*)) (read-from-string "(xaL(kkLzz))")) ==> (|xa| L (|kk| L |zz|)) 12
Объяснение кода листинга программы
- Создаётся переменная rt и инициализируется значением (copy-readtable).
- Устанавливается значение (readtable-case rt) в :preserve.
- Устанавливается макро-символ #\L таким образом, чтобы при чтении строки, начинающейся с этого символа, заменялся на 'l.
- Устанавливается значение readtable в rt.
- Вводится строка
(xaL(kkLzz))
и читается в переменную readtable с использованием функции read-from-string. - Результат чтения строки — список
(|xa| L (|kk| L |zz|))
. - Выводится на экран список с помощью функции print.
- В консоли выводится число 12.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д