Подскажите, как преобразовать строку в список - 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

Объяснение кода листинга программы

  1. Создаётся переменная rt и инициализируется значением (copy-readtable).
  2. Устанавливается значение (readtable-case rt) в :preserve.
  3. Устанавливается макро-символ #\L таким образом, чтобы при чтении строки, начинающейся с этого символа, заменялся на 'l.
  4. Устанавливается значение readtable в rt.
  5. Вводится строка (xaL(kkLzz)) и читается в переменную readtable с использованием функции read-from-string.
  6. Результат чтения строки — список (|xa| L (|kk| L |zz|)).
  7. Выводится на экран список с помощью функции print.
  8. В консоли выводится число 12.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.273 из 5
Похожие ответы