2024-06-01 04:08:46 发布
网友
我正在学习如何用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 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,并将用于'+'操作符的函数替换为这个新定义的函数
special_add
'+'
*)编辑代码以处理空输入和单输入情况
这可以通过简单的方式完成:
或者,如果您希望按照所描述的方式添加和修改lispy.py,如下所示:
您可以看到,我已经添加了函数
special_add
,并将用于'+'
操作符的函数替换为这个新定义的函数*)编辑代码以处理空输入和单输入情况
相关问题 更多 >
编程相关推荐