システムプログラム01-ver01

「システムプログラム01-ver01」の編集履歴(バックアップ)一覧はこちら

システムプログラム01-ver01」(2010/05/10 (月) 15:24:31) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

<p>#include &lt;stdio.h&gt;<br /> #include &lt;stdlib.h&gt;<br /> #include &lt;ctype.h&gt;<br /> #include &lt;string.h&gt;<br /><br /> #define LIST 00<br /> #define SYMBOL 01<br /><br /> typedef struct ptr{<br /> int tag;<br /> union{<br /> struct cell{<br /> struct ptr*car;<br /> struct ptr*cdr;<br /> }cell;<br /> struct symbol{<br /> char *pname;<br /> struct ptr*plist;<br /> }symbol;<br /> long int intv;<br /> }atr;<br /> }*Ptr;<br /><br /> Ptr oblist=NULL;<br /> Ptr true_pointer;<br /> Ptr nil_pointer;<br /> Ptr dot_pointer;<br /> Ptr rpar_pointer;<br /> Ptr quote_pointer;<br /> char* pname(Ptr x) {return x-&gt;atr.symbol.pname;}<br /><br /> Ptr symbolp(Ptr x)<br /> { if((x-&gt;tag)==SYMBOL)return true_pointer;<br /> else return nil_pointer;<br /> }<br /><br /> Ptr CAR(Ptr x) {return x-&gt;atr.cell.car;}<br /> Ptr CDR(Ptr x) {return x-&gt;atr.cell.cdr;}<br /> Ptr print_expr(Ptr x)<br /> {<br /> if(symbolp(x)==true_pointer){<br />    fprintf(stdout, "%s",pname(x));<br />   }<br /> else if(CAR(x)==quote_pointer){<br />   fprintf(stdout, "\'");<br /> x=CDR(x);<br /> print_expr(CAR(x));<br /> x=CDR(x);<br /> while(symbolp(x)==nil_pointer){<br /> fprintf(stdout," ");<br /> print_expr(CAR(x));<br /> x=CDR(x);}<br /> if(x==nil_pointer){<br /> }else{<br /> fprintf(stdout," . %s)",pname(x));<br /> }<br /> }<br /> else{<br /> fprintf(stdout, "(");<br /> print_expr(CAR(x));<br /> x=CDR(x);<br /> while(symbolp(x)==nil_pointer){<br /> fprintf(stdout," ");<br /> print_expr(CAR(x));<br /> x=CDR(x);}<br /> if(x==nil_pointer){<br /> fprintf(stdout,")");<br /> }else{<br /> fprintf(stdout," . %s)",pname(x));<br /> }}<br /> return nil_pointer;}<br /> Ptr new_ptr()<br /> {Ptr p;<br /> p=(Ptr)malloc(sizeof(struct ptr));<br /> if(p==NULL)exit(1);<br /> return p;}<br /><br /> char *copy_string(char*s)<br /> {char*p;<br /> p=malloc(strlen(s)+1);<br /> strcpy(p,s);<br /> return p;}<br /><br /> Ptr new_symbol(char *pname)<br /> {Ptr x;<br /> x=new_ptr();<br /> x-&gt;tag=SYMBOL;<br /> x-&gt;atr.symbol.pname=copy_string(pname);<br /> x-&gt;atr.symbol.plist=nil_pointer;<br /> return x;}<br /><br /> Ptr cons(Ptr x, Ptr y)<br /> {Ptr z;<br /> z=new_ptr();<br /> z-&gt;tag=LIST;<br /> z-&gt;atr.cell.car=x;<br /> z-&gt;atr.cell.cdr=y;<br /> return z;}<br /><br /><br /><br /><br /> Ptr intern(char* s)<br /> {Ptr p=oblist;<br /> Ptr id;<br /> while(p!=NULL&amp;&amp;p!=nil_pointer){<br /> if(strcmp(s,pname(CAR(p)))==0){<br /> return CAR(p);<br /> }<br /> p=CDR(p);<br /> }<br /> oblist=cons(id=new_symbol(s),oblist);<br /> return id;<br /> }<br /> char buf[100];<br /><br /> Ptr read_atom(int ch)<br /> {int i=0;<br /> buf[i++]=ch;<br /> while(isalnum(ch=getchar()))buf[i++]=ch;<br /> ungetc(ch,stdin);<br /> buf[i]=0;<br /> return intern(buf);}<br /><br /> Ptr read_expr();<br /><br /> Ptr read_expr_list()<br /> {Ptr p;<br /> p=read_expr();<br /> if(p==rpar_pointer)return nil_pointer;<br /> if(p==dot_pointer){p=read_expr();read_expr();return p;}<br /> return cons(p, read_expr_list());}<br /><br /> Ptr read_expr()<br /> {int ch;<br /> while(isspace(ch=getchar()));<br /> if(ch!=EOF){<br /> if(isalnum(ch)) return read_atom(ch);<br /> switch(ch){<br /> case '(':return read_expr_list();<br /> case '.':return dot_pointer;<br /> case ')':return rpar_pointer;<br /> case '\'':return cons(quote_pointer,cons(read_expr(),nil_pointer));<br /> default:fprintf(stderr,"unknown input");<br /> return nil_pointer;<br /> }<br /> }else{<br /> exit(0);<br /> }<br /> }<br /><br /><br /><br /> void main()<br /> {Ptr x,y,z,w;<br /> nil_pointer=intern("nil");<br /> nil_pointer-&gt;atr.symbol.plist=nil_pointer;<br /> oblist-&gt;atr.cell.cdr=nil_pointer;<br /> true_pointer=intern("t");<br /> printf("%p %p\n", nil_pointer, true_pointer);<br /> dot_pointer=intern(".");<br /> rpar_pointer=intern(")");<br /> quote_pointer=intern("quote");<br /> x=new_symbol("X");<br /> y=new_symbol("Y");<br /> z=cons(y,nil_pointer);<br /> w=cons(x,y);<br /> z=cons(w,z);<br /> z=cons(x,z);<br /> print_expr(z);<br /> printf("\n");<br /><br /> z=read_expr();<br /> printf("z=%p\n",z);<br /> print_expr(z);<br /> printf("\n");}</p>
<p>#include &lt;stdio.h&gt;<br /> #include &lt;stdlib.h&gt;<br /> #include &lt;ctype.h&gt;<br /> #include &lt;string.h&gt;<br /><br /> #define LIST 00<br /> #define SYMBOL 01<br /><br /> typedef struct ptr{<br />     int tag;<br />     union{<br />         struct cell{<br />         struct ptr*car;<br />         struct ptr*cdr;<br />     }cell;<br />     struct symbol{<br />         char *pname;<br />         struct ptr*plist;<br />     }symbol;<br />     long int intv;<br />     }atr;<br /> }*Ptr;<br /><br /> Ptr oblist=NULL;<br /> Ptr true_pointer;<br /> Ptr nil_pointer;<br /> Ptr dot_pointer;<br /> Ptr rpar_pointer;<br /> Ptr quote_pointer;<br /> char* pname(Ptr x) {return x-&gt;atr.symbol.pname;}<br /><br /> Ptr symbolp(Ptr x)<br /> {    if((x-&gt;tag)==SYMBOL)return true_pointer;<br />     else return nil_pointer;<br /> }<br /><br /> Ptr CAR(Ptr x) {return x-&gt;atr.cell.car;}<br /> Ptr CDR(Ptr x) {return x-&gt;atr.cell.cdr;}<br /> Ptr print_expr(Ptr x)<br /> {    if(symbolp(x)==true_pointer){<br />         fprintf(stdout, "%s",pname(x));}<br />     else if(CAR(x)==quote_pointer){<br />         fprintf(stdout, "\'");<br />         x=CDR(x);<br />         print_expr(CAR(x));<br />         x=CDR(x);<br />         while(symbolp(x)==nil_pointer){<br />             fprintf(stdout," ");<br />             print_expr(CAR(x));<br />             x=CDR(x);}<br />         if(x==nil_pointer){}<br />         else{}}<br />     else{<br />         fprintf(stdout, "(");<br />         print_expr(CAR(x));<br />         x=CDR(x);<br />         while(symbolp(x)==nil_pointer){<br />             fprintf(stdout," ");<br />             print_expr(CAR(x));<br />             x=CDR(x);}<br />         if(x==nil_pointer){<br />             fprintf(stdout,")");<br />         }else{<br />             fprintf(stdout," . %s)",pname(x));}}<br />     return nil_pointer;}<br /> Ptr new_ptr()<br /> {    Ptr p;<br />     p=(Ptr)malloc(sizeof(struct ptr));<br />     if(p==NULL)exit(1);<br />     return p;}<br /><br /> char *copy_string(char*s)<br /> {    char*p;<br />     p=malloc(strlen(s)+1);<br />     strcpy(p,s);<br />     return p;}<br /><br /> Ptr new_symbol(char *pname)<br /> {    Ptr x;<br />     x=new_ptr();<br />     x-&gt;tag=SYMBOL;<br />     x-&gt;atr.symbol.pname=copy_string(pname);<br />     x-&gt;atr.symbol.plist=nil_pointer;<br />     return x;}<br /><br /> Ptr cons(Ptr x, Ptr y)<br /> {    Ptr z;<br />     z=new_ptr();<br />     z-&gt;tag=LIST;<br />     z-&gt;atr.cell.car=x;<br />     z-&gt;atr.cell.cdr=y;<br />     return z;}<br /><br /> Ptr intern(char* s)<br /> {    Ptr p=oblist;<br />     Ptr id;<br />     while(p!=NULL&amp;&amp;p!=nil_pointer){<br />         if(strcmp(s,pname(CAR(p)))==0){<br />             return CAR(p);}<br />         p=CDR(p);}<br />     oblist=cons(id=new_symbol(s),oblist);<br />     return id;}<br /><br /> char buf[100];<br /><br /> Ptr read_atom(int ch)<br /> {    int i=0;<br />     buf[i++]=ch;<br />     while(isalnum(ch=getchar()))buf[i++]=ch;<br />     ungetc(ch,stdin);<br />     buf[i]=0;<br />     return intern(buf);}<br /><br /> Ptr read_expr();<br /><br /> Ptr read_expr_list()<br /> {    Ptr p;<br />     p=read_expr();<br />     if(p==rpar_pointer)return nil_pointer;<br />     if(p==dot_pointer){p=read_expr();read_expr();return p;}<br />     return cons(p, read_expr_list());}<br /><br /> Ptr read_expr()<br /> {    int ch;<br />     while(isspace(ch=getchar()));<br />     if(ch!=EOF){<br />         if(isalnum(ch)) return read_atom(ch);<br />         switch(ch){<br />             case '(':return read_expr_list();<br />             case '.':return dot_pointer;<br />             case ')':return rpar_pointer;<br />             case '\'':return cons(quote_pointer,cons(read_expr(),nil_pointer));<br />             default:fprintf(stderr,"unknown input");<br />             return nil_pointer;}}<br />     else{<br />         exit(0);}}<br /><br /> void main()<br /> {    Ptr x,y,z,w;<br />     nil_pointer=intern("nil");<br />     nil_pointer-&gt;atr.symbol.plist=nil_pointer;<br />     oblist-&gt;atr.cell.cdr=nil_pointer;<br />     true_pointer=intern("t");<br />     printf("%p %p\n", nil_pointer, true_pointer);<br />     dot_pointer=intern(".");<br />     rpar_pointer=intern(")");<br />     quote_pointer=intern("quote");<br />     x=new_symbol("X");<br />     y=new_symbol("Y");<br />     z=cons(y,nil_pointer);<br />     w=cons(x,y);<br />     z=cons(w,z);<br />     z=cons(x,z);<br />     print_expr(z);<br />     printf("\n");<br /><br />     z=read_expr();<br />     printf("z=%p\n",z);<br />     print_expr(z);<br />     printf("\n");}</p>

表示オプション

横に並べて表示:
変化行の前後のみ表示: