2011-12-03 43 views
1

我正在审阅各种语言的课程,我们正在用Lisp构建文本解析器。我可以让我的Lisp程序用数字做很多不同的功能,但我正在努力处理文本。我只想偷看一行中的第一个字符,看看它是否包含<然后做一些事情,但我似乎无法弄清楚如何去做这个简单的任务。这是我简单的小码迄今:LISP If语句 - 解析文本文件

;;;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

我认为最好能在班上提出这样的问题。 –

回答

15

首先,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

感谢Rainer的快速响应。我知道Lisp不是OO语言或程序。我参加的这门课很奇怪。我们在15周内只报道12种语言的电池。这是我尝试过的第一种功能语言,所以我非常感谢帮助。 – JKK

+1

从字符到字符串做了一些改变,我现在可以处理if。非常感谢你! – JKK

+2

JKK_1979,Common Lisp是一种可用于OO或程序风格的多范式语言。这里有一个很好的指南,用于在lisps中对代码进行格式化:http://mumble.net/~campbell/scheme/style.txt – naryl

2

要在一行文本中搜索字符,可以使用position,将char=函数用作等式比较器。

其次,你可能会更好地收集你的文件到一个单一的字符串,并在那里搜索。第三,网上有一些很好的参考资料,如Common Lisp HyperStandard(link)和Peter Seibel的Practical Common Lisp

+1

POSITION默认情况下具有EQL作为相等运算符。 EQL适用于角色。 –

+0

确实如此。虽然当我知道我在比较字符时,我更喜欢使用char =作为注释给读者。 – Vatine

+1

此注释不是必需的。所有序列函数默认使用字符串。您正在尝试记录常见情况。 –