在lispy.py中实现一般的参数数量

时间:2017-04-28 17:01:00

标签: python scheme interpreter

我正在学习如何在python中实现Scheme解释器。我正在查看lispy.py,我想知道如何更改代码,以便算术运算可以处理一般数量的数字。

lispy> (+ 1 2 3 4)
10
lispy> (* 1 2 3)
6
lispy> (+ 4 5 6)
15

在当前状态下,lispy.py一次只能处理两个数字,即

lispy> (+ 1 2)
3
lispy> (+ 3 4)
7

1 个答案:

答案 0 :(得分:0)

可以通过lispy方式完成:

(+ (+ (+ 1 2) 3) 4)

或者如果您按照您所描述的方式进行操作,可以按如下方式添加和修改lispy.py:

.
.
.
def special_add(*numbers):
    sum = 0
    for number in numbers:
        sum += number
    return sum

def add_globals(self):
    "Add some Scheme standard procedures."
    import math, cmath, operator as op
    self.update(vars(math))
    self.update(vars(cmath))
    self.update({
     '+':special_add, '-':op.sub, '*':op.mul, '/':op.div, 'not':op.not_, 
     '>':op.gt, '<':op.lt, '>=':op.ge, '<=':op.le, '=':op.eq, 
     'equal?':op.eq, 'eq?':op.is_, 'length':len, 'cons':cons,
     'car':lambda x:x[0], 'cdr':lambda x:x[1:], 'append':op.add,  
     'list':lambda *x:list(x), 'list?': lambda x:isa(x,list),
     'null?':lambda x:x==[], 'symbol?':lambda x: isa(x, Symbol),
     'boolean?':lambda x: isa(x, bool), 'pair?':is_pair, 
     'port?': lambda x:isa(x,file), 'apply':lambda proc,l: proc(*l), 
     'eval':lambda x: eval(expand(x)), 'load':lambda fn: load(fn), 'call/cc':callcc,
     'open-input-file':open,'close-input-port':lambda p: p.file.close(), 
     'open-output-file':lambda f:open(f,'w'), 'close-output-port':lambda p: p.close(),
     'eof-object?':lambda x:x is eof_object, 'read-char':readchar,
     'read':read, 'write':lambda x,port=sys.stdout:port.write(to_string(x)),
     'display':lambda x,port=sys.stdout:port.write(x if isa(x,str) else to_string(x))})
    return self
.
.
.

您可以看到我添加了函数special_add并将'+'运算符的函数替换为此新定义的函数。

*)编辑代码以处理空的和一个输入案例。