我找到了Python内置函数eval
,但未能找到类似于Schemeapply
的函数。
我已经详尽地检查了其他 Python 关键字,但没有一个与apply
匹配。
候选人可能exec
:
In [14]: eval("print('testing')")
testing
In [15]: exec("print('testing')")
testing
和方案中:
> (eval '(display 'testing))
testing
> (apply display '(testing))
testing
Python的exec
是Schemeapply
的对应物吗?
No.Scheme 的apply
用于将函数应用于存储在列表中的参数。Python这样做的方式是*
,而不是exec
:
>>> args = [1, 2, 3]
>>> print(*args)
1 2 3
Python曾经有一个与Scheme的apply
匹配的apply
函数,但它被删除了,取而代之的是*
符号。
在 Python 中定义 apply:
def apply(f, arg_list):
return f(*arg_list)
方案示例:
(define (pythagoras a b)
(sqrt (+ (* a a) (* b b))))
(apply pythagoras '(3 4)) ; Returns: 5
类似的 Python 示例:
import math
def pythagoras(a, b):
return math.sqrt(a**2 + b**2)
apply(pythagoras, [3, 4]) # Returns: 5.0
旁注(基于您对这些事情的明显兴趣(
Python的eval
:
eval('pythagoras(3, 4)')
而在方案中:
(eval '(pythagoras 3 4))
(eval "Hello")
(eval `(,(if (> x 0) + -) 100 ,(pythagoras 3 4)))
如您所见,Python 的eval
要求您摆弄字符串、字节或"代码对象"。Scheme的eval
采用Scheme。参见:同质性究竟是什么意思?
您可能有兴趣阅读有关元循环评估器的信息(来自计算机程序的结构和解释,第4章,元语言抽象(,以了解Scheme的eval
和apply
的含义。
请注意,强烈建议不要在 Python 中使用eval
(如果您确实需要使用它,请考虑ast.literal_eval(。在这两种语言中,如果您的问题可以使用其他方法解决,通常建议您避免eval
。