60行R++代码实现Lisp解释器

来源:互联网 发布:新网中文域名 编辑:程序博客网 时间:2024/06/01 08:56

还没有处理lambda、上下文等,有待完善。

main{forputsl(eval(getsl))}rstr eval(rstr s){return eval(tokenize(s).split(' '))}rstr eval(rbuf<rstr>& v){if v.get(0)!='('return v.get(0)next=find(v.sub(2))+2switch v.get(1)case '+'return eval(v.sub(2,next)).toint+eval(v.sub(next,v.count-1)).tointcase '-'return eval(v.sub(2,next)).toint-eval(v.sub(next,v.count-1)).tointcase '*'return eval(v.sub(2,next)).toint*eval(v.sub(next,v.count-1)).tointcase '/'return eval(v.sub(2,next)).toint/eval(v.sub(next,v.count-1)).tointreturn ''}int find(rbuf<rstr>& v){return r_cond(v.get(0)=='(',find_sbk(v)+1,1)}int find_sbk(rbuf<rstr>& v){count=0for i in vif '('==v[i]++countif ')'==v[i]--countif 0==countreturn ireturn v.count}rstr tokenize(rstr s){rstr retfor i in sif s[i]==`(ret+=' ( 'elif s[i]==`)ret+=' ) 'elif s[i]==0xa||s[i]==0xd||s[i]==9ret+=' 'elseret+=s[i]return ret}


0 0
原创粉丝点击