python如何实现一个简单的lisp
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章给大家分享的是有关python如何实现一个简单的lisp的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。示例:#coding=utf-8import types,sy
千家信息网最后更新 2025年01月19日python如何实现一个简单的lisp
这篇文章给大家分享的是有关python如何实现一个简单的lisp的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
示例:
#coding=utf-8import types,sysimport operator as opfrom functools import reducefrom inspect import getargspec##########################def quote(code): return codedef atom(code): if type(code) is list and code != []: return [] return Truedef eq(car, cdr): if car==cdr: return True return []def noteq(car, cdr): if car != cdr: return True return []def and2(car, cdr):#用lisp实现一个and吧 if car!=[] and cdr!=[]: return True return []def car(code): if code == [] or code == '':#fix map func error return [] return code[0]def cdr(code): return code[1:]def cons(arg1, arg2): res = [arg1] res.extend(arg2); return resdef cond(code):passdef define():passdef fun():passdef fun_seq():passclass S(str):pass#extradef lt(car, cdr):#< if car < cdr: return True return []def gt(car, cdr):#> if car > cdr: return True return [] return reduce(op.mul, args) return reduce(op.div, args) return reduce(op.sub, args) return reduce(op.add, args)def mod(car, cdr):#% return car % cdrdef show(code): print( code) return codedef seti(key, val): pass# def yf():# pass# def yd():# passdef nexti(sq, n): if not hasattr(sq, '__next__'): sq = iter(sq) while n: if n == 1: return next(sq) next(sq) n = n - 1def use(pg, _as=None): try: mod = __import__(pg) return mod, _as except Exception as e: print('') return None, Nonedef attr(obj, prop): return getattr(obj, prop)###############################class Env(dict): def __init__(self, outer, params=None, args=None): params = params if params else [] args = args if args else [] #for currying for i in range(len(args),len(params)): args.append([]) #end self.update(zip(params,args))# self.outer = outer def find(self, key): ks = key.split('.') if len(ks) > 1: if ks[0] in self: for k in ks[1:]: ks[0] = getattr(self[ks[0]], k) return ks[0] return self.outer[key] else: if key in self: return self[key] return self.outer.find(key) def seti(self, key,value): if key in self: self[key] = value else: self.outer.seti(key,value)#############################lisp_env = {'quote':quote,'_':quote,'atom':atom,'eq':eq,'car':car, 'cdr':cdr,'cons':cons,'cond':cond,'define':define,'fun':fun, 'lt':lt,'mul':mul,'sub':sub,'gt':gt,'div':div,'mod':mod, 'add':add,'noteq':noteq,'and2':and2, 'next':next, 'nexti':nexti, 'show':show, 'seti':seti, 'True':True, 'False':False, 'use':use, 'attr':attr }#############################def run(code,env): # print '===code===', code, '======' # print '===env===', env, '======' # print '===outer===', env.outer, '======' #return S('val'),变量 if type(code) is S: try: return env.find(code) except: print( ' ' % code, '') raise RuntimeError #常量 #for empty list and no list elif code==[] or type(code) is not list: return code #设置变量的值 elif code[0] is seti: if type(code[1]) is not S: print (" " % code[1], '') raise RuntimeError try: key = env.seti(code[1], run(code[2], env)) return env.find(code[1]) except: print( " " % code[1], '') raise RuntimeError #变量引用,for quote exp elif code[0] is quote: #特别函数,for def, fun, let elif code[0] is define: env[ code[1]] = run(code[2],env) # if code[1] == 'inner' or code[1]=='E': # print '--define--', code[1], code[2], env return env[ code[1]] #执行function体 elif code[0] is fun_seq: last = None codelen = len(code[1:]) - 1 for i, c in enumerate(code[1:]): res = run(c, env) if i == codelen: last = res return last elif code[0] is fun: # if code[1] and code[1][-1] == 'ident' or code[1] and code[1][-1] == '__outer__': # print '--eval--', env if len(code[1]) == 0: if type(code[1]) is S: #条件,for cond, [cond [p1,e1],[p2,e2],...] elif code[0] is cond: for c in code[1:]: if run(c[0], env): res = [run(ii, env) for ii in c[1:]] return res[-1] elif code[0] is use: mod, _as = None,None if len(code) > 2: mod, _as = use(code[1], code[2]) else: mod, _as = use(code[1]) if not mod: raise RuntimeError if _as: env[_as] = mod else: env[code[1]] = mod return env[_as] if _as else env[code[1]] #[S] elif type(code[0]) is S and len(code) == 1: try: return run(env.find(code[0]), env) except: print( ' ' % code[0], '') raise RuntimeError else: exps = [ run(exp, env) for exp in code] f = exps.pop(0) if not (type(f) is types.FunctionType) and not (type(f) is types.BuiltinFunctionType) and not f is type: return [f]+exps try: #print f, exps except TypeError as e:#pass arg for next(), if not a iterator print (' ') raise RuntimeError
感谢各位的阅读!关于"python如何实现一个简单的lisp"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
变量
内容
更多
篇文章
不错
实用
函数
常量
文章
条件
看吧
知识
示例
参考
帮助
有关
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
安阳软件开发参考价
web服务器登录
数据库float范围
sql数据库约束逻辑大全
服务器默认管理地址是什么
没有基础怎么学习软件开发
网络安全好做吗
科技互联网房地产
一键分享抖音软件开发
拼多多平台服务器是干嘛的
软件开发涉密信息系统集成机构
云时代的网络安全讲座视频
数据库开始时间结束时间
邮件传输服务器
河南手机软件开发报价
奶茶店点餐软件开发文档
vivox9的服务器在哪
数据库的分支语句
外服手游英雄联盟服务器卡
百度网络安全员培训班
深圳休闲吧线上点餐软件开发
bae服务器
哪些网络技术可以实现在线学习
广州慧亚互联网科技怎么样
数据库发展三大事件
抖音下载幻塔是什么服务器
计算机二级数据库考试
软件开发与软件工程哪个难
计算机网络安全教程期末论文
鑫永祎网络技术工作室