ISD実習E 2009年6月1日 read関数 read-macro back-quote 文字列のread 課題 LISPシステム入門 (第3回) read関数 read-macro back-quote 文字列のread 課題
read関数 V0.3 read関数なし V0.4 symbol, 数のみのread関数 V0.5 リスト構造のread V0.6 ' (quote ) #t,#f read_tで、文字がアルファベット、数字、 マクロ文字 (,) “, . , # のどれかを定義する。 マクロ文字の場合は、その処理のための関数を呼ぶ。 リスト構造を読むために、関数list-readが file_readを再帰的に呼び出すことに注意。
quote read-macro a_quoteはmain.cで定義 symbol.cのmake_symbolをcall ptr quote_read(FILE *in){ ptr p,s; p=file_read(in); s=cons(p,NIL); return cons(a_quote,s); } a_quoteはmain.cで定義 symbol.cのmake_symbolをcall lisp.hにも記述がある。
back-quote macro `s をreadすると (back-quote s) を返すようにする。 たとえば `(a b) は (back-quote (a b)) である。
back-quoteを作る a_back_quote をlisp.hに追加 main.c を修正 read.c にback_quote_readを作る。 make ./es により確認
文字列 “abc” をreadすると,文字列データを返すように する。 symbol.c を cp symbol.c string.c とコピーして、それを編集して make_stringを作ろう。(lisp.hも見る)
Makefile.am string.cをシステムに追加するため Makefile.am を修正する。その後以下を実行 autoconf automake -a ./configure make ./es
文字列のプリント print.c を変更して文字列のプリントができるように 変更する。ただし、文字列は” で囲んで画面に表示 する。 STRINGP はlisp.hで定義されている。 print.cの中に print_string(ptr x) を作り、関数 ptr print (ptr x) の条件分岐を追加する。
make_stringのcheck ここまでできたら、main関数から make_string と、それをprintする命令を書いて により実行してみる。
文字列をread read.c において、文字列 の先頭 ”がマクロであることは、定義されているが その関数は定義されていない。 これを修正して、 string_read を作って呼び出すようにしなさい。 ただし、簡単のために、次に”が現れるまでを 文字列とする。また、文字列の大きさは128byte 以下として良い。
課題 セミコロン ; 以下を注釈とするようにしなさい。 つまり、; をマクロ文字として セミコロン ; 以下を注釈とするようにしなさい。 つまり、; をマクロ文字として それが現れたら、行末までをすべて無視するように、 read.c を変更しなさい。マクロ関数の名前は、 read_comment とします。 たとえば “abc;def” ;this is string と入力すると文字列 “abc;def”は読み込まれるが ;this is string は無視される。 期限: 6月12日5時まで、作成したread.cをプリントして レポートにする。