python如何实现一个简单的lisp
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章给大家分享的是有关python如何实现一个简单的lisp的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。示例:#coding=utf-8import types,sy
千家信息网最后更新 2026年11月01日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安全错误
数据库的锁怎样保障安全
互联网科技企业
互联网金融科技
互联网科技公司经营范围
科技金融是不是互联网金融
科技赋能下的互联网金融
互联网科技与金融科技
未来的互联网科技
天津摩尔互联网科技
互联网科技博客
广州市恰铎互联网科技有限公司
内蒙古九一互联网科技
玉溪新华互联网科技好不好
卓翼科技产业互联网合作
众安科技工业互联网合作
黑科技 体验场景 互联网大会
上海互联网科技公司ppt
互联网科技包装股份有限公司上市
南京一网一红互联网科技有限公司
互联网科技手抄报图片
互联网科技收购价值
伟宏互联网科技
互联网科技未来
中资互联网科技
互联网科技股有哪些
众安科技工业互联网合作
广东鹅鹅鹅互联网科技有限公司
普陀区互联网教育科技管理办法
国产互联网科技公司
北京品多多互联网科技有限公司
互联网科技大会大佬