LISP If Statement - 解析文本文件

时间:2011-12-03 18:55:55

标签: lisp common-lisp

我正在上课,回顾各种语言,我们正在用Lisp构建一个文本解析器。我可以让我的Lisp程序用数字做很多不同的函数,但我正在努力处理文本。我想偷看一行中的第一个字符,看它是否包含<然后做点什么,但我似乎无法弄清楚如何去完成这个简单的任务。到目前为止,这是我简单的小代码:

;;;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或任何其他函数式语言,我习惯在VB和Java项目中使用疯狂的函数,但我没有任何体面的Lisp参考资料。

完成此程序后,我们不再需要使用Lisp了,所以我不打算订购任何东西。尝试使用谷歌图书......开始计算出来的东西,但这种语言又古老又艰难!

;;;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 个答案:

答案 0 :(得分:16)

首先,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实际上并不是很难。您可以在一天内学习Lisp的基础知识。如果您已经了解Java,则可能需要两天甚至三天。

答案 1 :(得分:2)

要搜索文本行中的字符,可以使用position,并使用char=函数作为相等比较器。

其次,您最好将文件收集到一个字符串中并在那里搜索。

第三,网上有一些很好的参考资料,比如Common Lisp HyperStandard(link)和Peter Seibel的Practical Common Lisp