「システムプログラム01-ver01」の編集履歴(バックアップ)一覧はこちら
「システムプログラム01-ver01」(2010/05/10 (月) 15:24:31) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
<p>#include <stdio.h><br />
#include <stdlib.h><br />
#include <ctype.h><br />
#include <string.h><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->atr.symbol.pname;}<br /><br />
Ptr symbolp(Ptr x)<br />
{ if((x->tag)==SYMBOL)return true_pointer;<br />
else return nil_pointer;<br />
}<br /><br />
Ptr CAR(Ptr x) {return x->atr.cell.car;}<br />
Ptr CDR(Ptr x) {return x->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->tag=SYMBOL;<br />
x->atr.symbol.pname=copy_string(pname);<br />
x->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->tag=LIST;<br />
z->atr.cell.car=x;<br />
z->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&&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->atr.symbol.plist=nil_pointer;<br />
oblist->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 <stdio.h><br />
#include <stdlib.h><br />
#include <ctype.h><br />
#include <string.h><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->atr.symbol.pname;}<br /><br />
Ptr symbolp(Ptr x)<br />
{ if((x->tag)==SYMBOL)return true_pointer;<br />
else return nil_pointer;<br />
}<br /><br />
Ptr CAR(Ptr x) {return x->atr.cell.car;}<br />
Ptr CDR(Ptr x) {return x->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->tag=SYMBOL;<br />
x->atr.symbol.pname=copy_string(pname);<br />
x->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->tag=LIST;<br />
z->atr.cell.car=x;<br />
z->atr.cell.cdr=y;<br />
return z;}<br /><br />
Ptr intern(char* s)<br />
{ Ptr p=oblist;<br />
Ptr id;<br />
while(p!=NULL&&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->atr.symbol.plist=nil_pointer;<br />
oblist->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>