5

推理:我正在尝试将大型库从 Scheme 转换为 Python

进行这种转换有什么好的策略吗?在这种情况下特别是跨范式,因为 Python 更面向对象,而 Scheme 是函数式的。

完全主观,所以我把它做成社区维基

4

5 回答 5

7

我会将原始语言实现几乎视为需求规范,并基于它编写设计(最重要的是包括详细的接口定义,包括外部接口和库中模块之间的接口)。然后我会从那个设计中实现。

我绝对不会做的是任何一种逐个功能的翻译。

于 2010-05-23T20:33:20.210 回答
6

使用方案实现作为生成测试用例的一种方式。我会编写一个可以调用方案代码的函数,并读取输出,将其转换回 python。

这样,您可以编写如下所示的测试用例:

def test_f():
  assert_equal(library.f(42), reference_implementation('(f 42)'))

这并不能帮助您翻译库,但它会让您非常有信心,您所拥有的内容会产生正确的结果。

当然,根据方案的作用,可能没有这么简单……

于 2010-05-23T20:45:16.803 回答
1

我会设置一堆白板并从 Scheme 代码中写出算法。然后我会在 Python 中实现这些算法。然后,正如@PaulHankin 建议的那样,使用 Scheme 代码作为编写测试用例来测试 Python 代码的一种方式

于 2010-05-23T21:36:22.547 回答
0

在 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
于 2010-05-24T05:39:22.833 回答
0

如果您没有时间按照其他人的建议去做并实际重新实现该功能,那么您没有理由不能以严格的功能方式实现它。

Python 支持进行函数式编程所需的关键特性,您可能会发现将时间花在做其他事情上会更好,尤其是在不需要绝对优化的情况下。另一方面,您可能会发现寻找错误非常困难。

于 2010-05-23T21:46:55.080 回答