R5RS方案解释器,支持卫生宏和完全调用/抄送
Scheme的Python项目详细描述
schemepy
==
>在python中实现scheme,支持调用/cc和卫生宏
1.2版在syntax撸expand
模块中增加了对预扩展语法的支持。它在适当的位置修改simpleprocedure对象。版本1.2还添加了一个jit编译器,它将simpleprocedure对象转换为本地python函数。它在jit模块中可用。设置scheme.jit.enabled
将提供基本的、安全的jit活动级别。设置scheme.jit.lambdas_enabled
和scheme.jit.unstable_enabled会增加jit活动,但会干扰动态程序。可以通过调用scheme.jit.makefunction(proc)为单个
函数手动触发jit,proc会展开proc的
语法(就地展开),然后为proc返回一个新的python函数(如果出现任何错误,则返回
原始过程)。默认情况下,jit是chatty,
,但可以在scheme.debug.debug_设置中静音。注意jited
函数会破坏tco。
使用schemepy
——
使用schemepy有三种基本方法。作为一个独立的方案解释器:
$/usr/bin/schemepy<;script.scm>;
,或者从python运行预定义字符串
import scheme
scheme.eval.eval(mystring)
在builtins.py中,在builtins.scm中添加
其他定义(scheme/builtins.scm位于
源中,/usr/share/schemepy/stdlib/builtins.scm一旦安装)。
scheme被沙盒从python中移除,因此只能访问提供到全局环境(scheme.globals.globals)或其他scheme
环境中的函数。注意,默认情况下,解释器可以访问文件系统和其他敏感功能。如果要将它用作用户代码的沙盒,则需要去掉不希望调用的任何内容。此外,getattr和getitem在默认环境中未定义。如果运行的是可信的
代码,只需将标准getattr添加到全局
环境中。如果您正在运行用户代码,并且希望提供
getattr,请编写一个只允许访问已批准的数据类型的代码:
def safegetattr(obj,attr):
if isinstance(obj,some_class):
return getattr(obj,attr)
raise typeerror(“getattr只支持%r类型的对象(某些类)
或类似的对象。
r5rs方案的不同之处在于宏扩展与代码执行是混合的。通常宏
扩展是在编译时完成的,但是为了简单起见,每个语句都是在执行之前展开的。通过
本身,这对性能的唯一影响是。
宏是一流的对象。通常,宏和normal
过程基本上是相同的,只是宏的名称在宏表中列出,而过程在normal
变量表中列出。我不维护单独的宏列表,因此
作为宏的对象会记录在对象本身上。通常,这个
不会引起注意,因为在racket中不会产生错误的任何代码都应该产生相同的输出(这是通过使
define syntax接受宏或过程并将其包装在
宏中来完成的,该宏使用语法调用包装的对象,并期望
返回类型是语法),但是它确实打开了一些东西的门ngs
用户不会期望的方案。
(定义一些宏f)
(定义(somefun)
(定义语法垃圾(lambda(x)'(+12))
(设置)!一些宏垃圾)
)
(somefun)(一些宏)
;3
tail递归和一般tail调用优化
--
tail递归的处理方式与其他tail调用不同;但是,
部分支持tco。有些调用递归地调用process(),
,这会破坏tco,但大多数调用都经过了tc优化。
booleans
--
truth值遵循python的约定,而不是scheme的约定(0,
false,none,()和“”为false,或者任何提供返回false的
bool\u方法的调用。如果你需要scheme的行为,
只需重写eq?还有什么不检查身份不假。
==
>在python中实现scheme,支持调用/cc和卫生宏
1.2版在syntax撸expand
模块中增加了对预扩展语法的支持。它在适当的位置修改simpleprocedure对象。版本1.2还添加了一个jit编译器,它将simpleprocedure对象转换为本地python函数。它在jit模块中可用。设置scheme.jit.enabled
将提供基本的、安全的jit活动级别。设置scheme.jit.lambdas_enabled
和scheme.jit.unstable_enabled会增加jit活动,但会干扰动态程序。可以通过调用scheme.jit.makefunction(proc)为单个
函数手动触发jit,proc会展开proc的
语法(就地展开),然后为proc返回一个新的python函数(如果出现任何错误,则返回
原始过程)。默认情况下,jit是chatty,
,但可以在scheme.debug.debug_设置中静音。注意jited
函数会破坏tco。
使用schemepy
——
使用schemepy有三种基本方法。作为一个独立的方案解释器:
$/usr/bin/schemepy<;script.scm>;
,或者从python运行预定义字符串
import scheme
scheme.eval.eval(mystring)
在builtins.py中,在builtins.scm中添加
其他定义(scheme/builtins.scm位于
源中,/usr/share/schemepy/stdlib/builtins.scm一旦安装)。
scheme被沙盒从python中移除,因此只能访问提供到全局环境(scheme.globals.globals)或其他scheme
环境中的函数。注意,默认情况下,解释器可以访问文件系统和其他敏感功能。如果要将它用作用户代码的沙盒,则需要去掉不希望调用的任何内容。此外,getattr和getitem在默认环境中未定义。如果运行的是可信的
代码,只需将标准getattr添加到全局
环境中。如果您正在运行用户代码,并且希望提供
getattr,请编写一个只允许访问已批准的数据类型的代码:
def safegetattr(obj,attr):
if isinstance(obj,some_class):
return getattr(obj,attr)
raise typeerror(“getattr只支持%r类型的对象(某些类)
或类似的对象。
r5rs方案的不同之处在于宏扩展与代码执行是混合的。通常宏
扩展是在编译时完成的,但是为了简单起见,每个语句都是在执行之前展开的。通过
本身,这对性能的唯一影响是。
宏是一流的对象。通常,宏和normal
过程基本上是相同的,只是宏的名称在宏表中列出,而过程在normal
变量表中列出。我不维护单独的宏列表,因此
作为宏的对象会记录在对象本身上。通常,这个
不会引起注意,因为在racket中不会产生错误的任何代码都应该产生相同的输出(这是通过使
define syntax接受宏或过程并将其包装在
宏中来完成的,该宏使用语法调用包装的对象,并期望
返回类型是语法),但是它确实打开了一些东西的门ngs
用户不会期望的方案。
(定义一些宏f)
(定义(somefun)
(定义语法垃圾(lambda(x)'(+12))
(设置)!一些宏垃圾)
)
(somefun)(一些宏)
;3
tail递归和一般tail调用优化
--
tail递归的处理方式与其他tail调用不同;但是,
部分支持tco。有些调用递归地调用process(),
,这会破坏tco,但大多数调用都经过了tc优化。
booleans
--
truth值遵循python的约定,而不是scheme的约定(0,
false,none,()和“”为false,或者任何提供返回false的
bool\u方法的调用。如果你需要scheme的行为,
只需重写eq?还有什么不检查身份不假。