2011-12-03 17 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)) 
) 

私は文は、それが「<」を見つけることができるかどうかを確認し、もしそうなら、単にその行を印刷し、doesnの他のものをスキップする場合にループを組み合わせてみました。この次の部分は、仕事はありません。この本当に簡単な作業を行う上で助けがあれば、大変感謝しています。以前はLispやその他の関数型言語を使ったことはありませんでしたが、私はVBやJavaプロジェクトで狂気のような関数を使うのに慣れていましたが、Lispの参考資料はありません。

このプログラムが終了した後は、私はもうLispを混乱させる必要はないので、何も注文することはありませんでした。 Google Booksを試してみましょう。何かを理解し始めましたが、この言語は古くて難しいものです!

;;;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を学ぶことは実際にはあまり難しくありません。 1日でLispの基本を学ぶことができます。 Javaをすでに知っている場合は、2〜3日が必要かもしれません。

+1

迅速な対応のためRainerさんに感謝します。私は、LispがOO言語でも手続き的でもないことを知っています。私のクラスは変だ。私たちは15週間で12言語のバッテリーをカバーしています。これは私が試した最初の関数型言語なので、私は助けに感謝します。 – JKK

+1

charからstringへの変更をいくつか行い、ifを処理することができました。どうもありがとうございました! – JKK

+2

JKK_1979、Common LispはOOや手続き型でも使えるマルチパラダイム言語です。そしてlispsのコードを書式化するための素晴らしいガイドがあります:http://mumble.net/~campbell/scheme/style.txt – naryl

2

テキスト行の文字を検索するには、positionを使用し、char=を等価コンパレータとして使用できます。

次に、ファイルを1つの文字列に集めて検索する方がよい場合があります。

第3に、Common Lisp HyperStandard(link)とPeter SeibelのPractical Common Lispのような、Web上で利用できる優れた参考資料があります。

+1

POSITIONは、デフォルトで等価演算子としてEQLを持ちます。 EQLは文字のために働きます。 –

+0

真。私が文字を比較していることを知っているとき、私はchar =を人間の読者に注釈として使うことを好む。 – Vatine

+1

この注釈は必要ありません。すべてのシーケンス関数は、デフォルトで文字列に対して機能します。あなたは一般的なケースを文書化しようとしています。 –