为python编辑norvig的方案解释器

Lyovin K.

我正在尝试为球拍程序编辑Norvig的lispy.py方案到python的解释器,在其中,除了他包括的过程之外,我还使用open-input-stringstring-replace

看起来我可以将相应的python定义添加到他的add_globals()函数中,如下所示。


    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({
         '+':op.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, 
        #  Additions below
         'open-input-string':lambda x:x.decode('string_escape'),
         'string-replace':lambda strng,x,y: strng.replace(x, y),
        #  Additions above
         '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

但是,当我尝试使用相关的球拍功能时,我从norvig的lispy repl中收到以下错误:


    % python lispy.py
    Lispy version 2.0
    lispy> (define (ex s)
      (read (open-input-string (string-replace (string-replace s "\'" "\"") "," ""))))
    lispy> (define inputlistsliceexample
      (ex "[0, 0, 1, 0, 1, 1, 0, 1, 0, 0]"))
    AttributeError: 'str' object has no attribute 'next_token'
    lispy>

然后,如果open-input-string在的定义中放弃使用,则会ex得到以下交互:

    % python lispy.py
    Lispy version 2.0
    lispy> (define (exnihilo s)
      (string-replace (string-replace s "\'" "\"") "," ""))    
    lispy> (define inputlistsliceexample
      (exnihilo "[0, 0, 1, 0, 1, 1, 0, 1, 0, 0]"))
    lispy> inputsliceexample
    LookupError: inputsliceexample

大概我在简化过程,但是在我真正深入研究其余的lispy.py之前,我想在这里问一下,在所添加的内容中该错误是否在表面上可见。

编辑:

这是我当前的add_globals:


    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({
         '+':op.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, 
        #  Additions below
         'string->jsexpr':lambda x: json.loads(x),
         'string-replace':lambda strng,x,y: strng.replace(x, y),
        #  Additions above
         '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

在lispy repl中,string-replace似乎成功了:


    % python lispy.py
    Lispy version 2.0
    lispy> (string-replace "[['Noth', '<b>ing</b>'], ' in']" "\'" "\"")
    "[[\"Noth\", \"<b>ing</b>\"], \" in\"]"
    lispy>

但是,当在lispy.py结尾时,我运行


    if __name__ == '__main__':
        x = eval(parse("""(begin
        (string-replace "[['Noth', '<b>ing</b>'], ' in']" "\'" "\"")
        )
        """
        ))
    
        print x

而不是运行它(这是文件来的方式),


    if __name__ == '__main__':
        repl()

程序挂起-当我对其进行跟踪时,我发现存在无限循环。

有任何想法吗?(我认为,这是比我的第一个更具体的问题。。。我肯定会更加接近...)

合金

找不到变量是有道理的inputsliceexample,因为定义的变量已命名inputlistsliceexample所以您的string-replace工作正常。我不确定您的问题open-input-string,但从您发布的链接来看,它看起来像是read在接收文件或端口之类的东西,而您open-input-string返回的是字符串。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章