Как разобрать строку как структуру списка? - PullRequest
1 голос
/ 16 ноября 2011

У меня есть строка, которая содержит структуру списка, такую ​​как ((p X) (q (f X))), и я действительно хотел бы найти функцию, которая интерпретирует / преобразует эту строку как список списков, как если бы это был '((p X) (q (f X))).

(list "((p X) (q (f X)))") просто делает его одним списком элементов.

(intern "((p X) (q (f X)))") заключает его в |символы.

Ответы [ 2 ]

7 голосов
/ 16 ноября 2011

Как

(read-from-string  "((p X) (q (f X)))")

работает на вас?Документация найдена здесь .

2 голосов
/ 17 ноября 2011

"((p X) (q (f X)))" - строка в Лиспе. Строки заключены в ".

LIST создает список с аргументами в качестве элементов.

Итак, (list "((p X) (q (f X)))") создает список со строкой в ​​качестве элемента.

INTERN создает символ.

(intern "((p X) (q (f X)))") создает символ со строковым аргументом в качестве имени. В Common Lisp символы могут иметь произвольные имена, включая такие символы, как ( и ). Такие символы печатаются в |. Пример: |((p X) (q (f X)))| - символ с таким странным именем.

Анализ s-выражения называется чтение в Лиспе. Для этого используются, например, READ и READ-FROM-STRING.

.

Существует два основных способа чтения s-выражения:

CL-USER 1 > (read-from-string "((p X) (q (f X)))")
((P X) (Q (F X)))
17

Но вы также можете открыть входной поток на основе строки, используя WITH-INPUT-FROM-STRING, а затем использовать обычный READ:

CL-USER 2 > (with-input-from-string (stream "((p X) (q (f X)))")
              (read stream))
((P X) (Q (F X)))
...