2011-12-03 66 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

此註釋不是必需的。所有序列函數默認使用字符串。您正在嘗試記錄常見情況。 –