我正在上课,回顾各种语言,我们正在用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)
)
)
)
谢谢你们
答案 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=
将该行与字符串"<"
进行比较。
文档:
char=
及相关。string=
及相关。Lisp很老,但仍然使用,它有很多有趣的概念。
学习Lisp实际上并不是很难。您可以在一天内学习Lisp的基础知识。如果您已经了解Java,则可能需要两天甚至三天。
答案 1 :(得分:2)
要搜索文本行中的字符,可以使用position
,并使用char=
函数作为相等比较器。
其次,您最好将文件收集到一个字符串中并在那里搜索。
第三,网上有一些很好的参考资料,比如Common Lisp HyperStandard(link)和Peter Seibel的Practical Common Lisp。