LISP If заявление - синтаксический анализ текстового файла - PullRequest
1 голос
/ 03 декабря 2011

Я учусь на разных языках и создаю анализатор текста с помощью Lisp.Я могу заставить свою программу на Лиспе выполнять множество различных функций с числами, но я борюсь с текстом.Я хочу просто взглянуть на первый символ в строке, чтобы увидеть, содержит ли он <, затем сделать что-то, но я не могу понять, как выполнить эту простую задачу.Вот мой простой маленький код: </p>

;;;Sets up the y.xml file for use
(setq file (open "c:\\temp\\y.xml"))

;;;Just reads one line at a time, (jkk file)
(defun jkk (x)
(read-line x)
)

;;;Reads the entire file printing each line, (loopfile file)
(defun loopfile (x)
(loop for line = (read-line x nil)
    while line do (print line))
)

В следующей части я попытался объединить цикл с оператором if, чтобы посмотреть, может ли он найти "<", и если это так, просто напечатайте эту строку и пропустите все остальныекоторый не работает.Любая помощь в выполнении этой действительно простой задачи будет принята с благодарностью.Никогда раньше не использовал Lisp или любой другой функциональный язык, я привык использовать такие функции, как crazy, в своих проектах на VB и Java, но у меня нет приличных справочных материалов по Lisp.</p>

После завершения этой программы нам больше не нужно связываться с Лиспом, поэтому я не стал ничего заказывать.Попробую Google Книги ... начинаю разбираться, но этот язык старый и жесткий!

;;;Reads the entire file printing the line when < is found
(defun loopfile_xml (x)
(loop for line = (read-line x nil)

    while line do 
    (
        if(char= line "<")
            (print line)
    )
)
)

Спасибо, ребята

Ответы [ 2 ]

16 голосов
/ 03 декабря 2011

Во-первых, Lisp не является C или Java - у него разные соглашения об отступах:

;;;Sets up the y.xml file for use
(setq file (open "c:\\temp\\y.xml"))

;;;Just reads one line at a time, (jkk file)
(defun jkk (x)
  (read-line x))

;;;Reads the entire file printing each line, (loopfile file)
(defun loopfile (x)
  (loop for line = (read-line x nil)
        while line do (print line)))

и

;;;Reads the entire file printing the line when < is found
(defun loopfile_xml (x)
  (loop for line = (read-line x nil)
        while line
        do (if (char= line "<")
             (print line))))

Я бы также дал переменным осмысленные имена.x не имеет смысла.

Функция char= работает с символами.Но оба аргумента в вашем коде являются строками.Строки не символы.#\< это персонаж.Строки также являются массивами, поэтому вы можете получить первый элемент строки, используя функцию aref.

Если вы хотите проверить, является ли строка просто <, то вы можете сравнить строку, используяфункция string= со строкой "<".

Документация:

Lisp устарел, но все еще используется иу него много интересных концепций.

Изучать Лисп на самом деле не очень сложно.Вы можете выучить основы Lisp за один день.Если вы уже знаете Java, вам может потребоваться два или даже три дня.

2 голосов
/ 03 декабря 2011

Для поиска символа в строке текста вы можете использовать position, с функцией char= в качестве компаратора равенства.

Во-вторых, вам МОЖЕТ быть лучше собрать ваш файл в одну строку и искать там.

В-третьих, в Интернете есть несколько превосходных справочных материалов, таких как HyperStandard Common Lisp ( link ) и Practical Common Lisp Питера Сейбела .

...