python如何实现一个简单的lisp
admin
2023-07-06 16:04:26
0

示例:

#coding=utf-8
import types,sys
import operator as op
from functools import reduce
from inspect import getargspec
##########################
def quote(code):
    return code
def atom(code):
    if type(code) is list and code != []:
        return []
    return True
def 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 res
def cond(code):pass
def define():pass
def fun():pass
def fun_seq():pass
class S(str):pass
#extra
def 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 % cdr
def show(code):
    print( code)
    return code
def seti(key, val):
    pass

# def yf():
#     pass
# def yd():
#     pass
def nexti(sq, n):
    if not hasattr(sq, '__next__'):
        sq = iter(sq)
    while n:
        if n == 1:
            return next(sq)
        next(sq)
        n = n - 1

def use(pg, _as=None):
    try:
        mod = __import__(pg)
        return mod, _as
    except Exception as e:
        print('')
        return None, None

def 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

相关内容

热门资讯

我国科学家为细胞信号“导航”开... 新华社济南5月31日电(记者张力元)人体细胞犹如一座精密的通信城市,每天都有大量“指令”穿梭传递,调...
极端大风突袭哈尔滨!过山车停摆... 极目新闻记者 詹钘5月31日,受强对流天气影响,哈尔滨国际会展中心体育场相关设施受到损坏,原计划当晚...
三原电缆取得电缆接头连接用防护... 国家知识产权局信息显示,上海三原电缆附件有限公司取得一项名为“一种电缆接头连接用防护结构”的专利,授...
原创 识... 还是那句话,机圈苦大屏久已…… 虽然大屏有大屏的美,但是小屏也有小屏的俏。在大屏旗舰占据主流的手机市...
玄戒技术取得分频电路专利,实现... 国家知识产权局信息显示,北京玄戒技术有限公司取得一项名为“分频电路、分频器、射频芯片和电子设备”的专...
为什么今年香会基调明显变了 5月29日—31日在新加坡举行的第23届香格里拉对话会(简称“香会”),见证着元首引领下大国关系继续...
成本几毛钱、假驱蚊液香精兑水,... 入夏升温,蚊虫进入活跃期,驱蚊防护成为民生刚需,《财经调查》持续接到消费者投诉,他们买到的多款网红驱...
越来越多80后90后,正在丧失... 六一儿童节到来之际,朋友圈里开始出现一种熟悉的热闹。有人晒出零食礼包,有人半开玩笑地向伴侣讨礼物,还...
洋保电子取得用于低温环境的电气... 国家知识产权局信息显示,洋保电子(太仓)有限公司取得一项名为“一种用于低温环境的电气柜”的专利,授权...
中日韩飞手争霸宁波!2026无... 潮新闻客户端 记者 陈冲 通讯员 朱凝 5月31日,2026小遛·无人机竞速世界杯(中国·宁波鄞州站...