推理:我正在尝试将大型库从 Scheme 转换为 Python
进行这种转换有什么好的策略吗?在这种情况下特别是跨范式,因为 Python 更面向对象,而 Scheme 是函数式的。
完全主观,所以我把它做成社区维基
推理:我正在尝试将大型库从 Scheme 转换为 Python
进行这种转换有什么好的策略吗?在这种情况下特别是跨范式,因为 Python 更面向对象,而 Scheme 是函数式的。
完全主观,所以我把它做成社区维基
我会将原始语言实现几乎视为需求规范,并基于它编写设计(最重要的是包括详细的接口定义,包括外部接口和库中模块之间的接口)。然后我会从那个设计中实现。
我绝对不会做的是任何一种逐个功能的翻译。
使用方案实现作为生成测试用例的一种方式。我会编写一个可以调用方案代码的函数,并读取输出,将其转换回 python。
这样,您可以编写如下所示的测试用例:
def test_f():
assert_equal(library.f(42), reference_implementation('(f 42)'))
这并不能帮助您翻译库,但它会让您非常有信心,您所拥有的内容会产生正确的结果。
当然,根据方案的作用,可能没有这么简单……
我会设置一堆白板并从 Scheme 代码中写出算法。然后我会在 Python 中实现这些算法。然后,正如@PaulHankin 建议的那样,使用 Scheme 代码作为编写测试用例来测试 Python 代码的一种方式
在 Scheme 中编写一个 Python 解释器,然后直接将你的程序翻译成那个 :-) 你可以从以下开始def
:
(define-syntax def
(syntax-rules ()
((def func-name rest ...)
(define func-name (lambda rest ...)))))
;; test
(def sqr (x) (* x x))
(sqr 2) => 4
如果您没有时间按照其他人的建议去做并实际重新实现该功能,那么您没有理由不能以严格的功能方式实现它。
Python 支持进行函数式编程所需的关键特性,您可能会发现将时间花在做其他事情上会更好,尤其是在不需要绝对优化的情况下。另一方面,您可能会发现寻找错误非常困难。