你有什么建议在Python中编写Lisp方言/解释器吗?我想从几个基本命令开始,比如set
,print
和define
什么的。写lisp方言
Q
写lisp方言
1
A
回答
4
6
Python中有一个全功能的Scheme解释器here。它的主要“评估循环”就是这样:
def _eval(self, expr, env):
if DEBUG: print('~~~~ Eval called on %s [%s]' % (expr_repr(expr), type(expr)))
if DEBUG: print('Env:')
if DEBUG: pprint.pprint(env.binding)
# Standard Scheme eval (SICP 4.1.1)
#
if is_self_evaluating(expr):
return expr
elif is_variable(expr):
return env.lookup_var(expr.value)
elif is_quoted(expr):
return text_of_quotation(expr)
elif is_assignment(expr):
env.set_var_value(
var=assignment_variable(expr).value,
value=self._eval(assignment_value(expr), env))
return None
elif is_definition(expr):
env.define_var(
var=definition_variable(expr).value,
value=self._eval(definition_value(expr), env))
return None
elif is_if(expr):
predicate = self._eval(if_predicate(expr), env)
if predicate == Boolean(False):
return self._eval(if_alternative(expr), env)
else:
return self._eval(if_consequent(expr), env)
elif is_cond(expr):
return self._eval(convert_cond_to_ifs(expr), env)
elif is_let(expr):
return self._eval(convert_let_to_application(expr), env)
elif is_lambda(expr):
return Procedure(
args=lambda_parameters(expr),
body=lambda_body(expr),
env=env)
elif is_begin(expr):
return self._eval_sequence(begin_actions(expr), env)
elif is_application(expr):
return self._apply(
self._eval(application_operator(expr), env),
self._list_of_values(application_operands(expr), env))
else:
raise self.InterpretError("Unknown expression in EVAL: %s" % expr)
你的教科书计划eval循环,但这是实际的代码,工作。 Bob的代码非常注重清晰度,如果您有其他问题,请随时问我。
+0
谢谢! :)这证明非常有帮助 – tekknolagi 2011-06-04 17:19:41
相关问题
- 1. Emacs Lisp的方案方言
- 2. OS X Scheme语言(lisp的方言)
- 3. 哈斯克尔是一种Lisp方言
- 4. 写VS在LISP
- 5. 如何编译和运行用T编写的程序(Lisp的一种方言)
- 6. LISP的哪一种方言是'The Little Lisper'[3rd Edn]写的? (当时)
- 7. 转化Lisp语言到C++
- 8. Lisp语言的功能
- 9. Lisp语言 - setq和汽车
- 10. 用Lisp以外的语言编写Emacs扩展
- 11. Lisp语言 - 编写评估图形节点的功能标签
- 12. Lisp语言:如何写一个高阶函数
- 13. 这是什么意思一种语言是LISP的一种方言?
- 14. LISP的哪种方言是“人工智能编程的范例”?
- 15. 在Common Lisp中编写++宏
- 16. 编写递归GCD用Lisp
- 17. 写在文件的Common Lisp
- 18. 如何以LISP语言实现堆栈
- 19. LISP追加方法
- 20. Lisp(Scheme)Newton方法
- 21. 如何为SQLAlchemy编写外部方言?
- 22. Scheme和Common Lisp之间的实际区别是什么? (或Lisp的任何其他两种方言)
- 23. Lisp中的平方和
- 24. 编写一个Lisp宏与嵌套quasiquoting
- 25. 如何编写Lisp/Scheme代码?
- 26. Common Lisp的:写外部程序输入
- 27. Common Lisp a Lisp-n?
- 28. 读/写ProcessMemory宣言
- 29. 序言写列表
- 30. 关于LISP编程语言的绑定概念
这是一个编程练习。 – tekknolagi 2011-06-04 07:42:22
对不起,我混淆了链接。现在再检查一次。 – 2011-06-04 07:44:15
我知道,我是彼得的好朋友。其实,他是我的邻居。建议吗?他最近很忙。 – tekknolagi 2011-06-04 07:46:40