python - eval(parse()) 在 norvig 的 lispy.py 解释器的编辑版本中与 repl 的效果不同
问题描述
我正在尝试为一个球拍程序编辑 Norvig 的 lispy.py scheme-to-python 解释器,在该程序中,除了他包含的程序之外,我还使用string->jsexpr
和string-replace
.
为此,我编辑了他的 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
'reverse':lambda x: x[::-1],
'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 中,字符串替换似乎成功了:
% 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()
程序挂起——当我跟踪它时,我看到有一个无限循环。
有任何想法吗?
解决方案
知道了。我需要添加一个额外的反斜杠来逃避三引号部分中的转义,就像这样
if __name__ == '__main__':
x = eval(parse("""(begin
(string-replace "[['Noth', '<b>ing</b>'], ' in']" "\\'" "\\"")
)
"""
))
print x
推荐阅读
- ios - iOS - Swift - UICollectionView 和 ScrollToItemAtIndexPath 的辅助功能 VoiceOver 问题
- bash - 不包括第一个元素的 Bash 脚本
- laravel - 在 Laravel 中评估环境变量
- python - 我无法解密文件
- github - 如何在不消耗待处理邀请的情况下从 GitHub 的团队中恢复已删除的用户?
- c# - c# 在包含 CLOB 时在 DataTable 上使用 OracleDataAdapter 中的 .Fill
- react-native - 为什么我会出错:React Native 中的重新渲染过多
- reactjs - 如何复制反应组件以进行错误记录?
- php - 将上传的图像存储到数据库 laravel 8
- python - 远程服务器上的文件存在检查器总是返回 255