代码之家  ›  专栏  ›  技术社区  ›  Michael

关于从非常不相关的语言(在本例中是Scheme到Python)翻译代码的建议?

  •  5
  • Michael  · 技术社区  · 6 年前

    推理:我正试图将一个大型库从Scheme转换为Python

    做这种转换有什么好的策略吗?特别是在这种情况下,因为Python是更面向对象的,Scheme是功能性的。

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

    5 回复  |  直到 14 年前
        1
  •  7
  •   Vicky    14 年前

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

    我绝对不会做任何一种逐项翻译。

        2
  •  6
  •   user97370    14 年前

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

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

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

    这并不能帮你翻译这个库,但它会给你很好的信心,让你相信你所拥有的东西会产生正确的结果。

    当然,这取决于这个计划的作用,它可能并没有这么简单。。。

        3
  •  1
  •   inspectorG4dget    14 年前

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

        4
  •  0
  •   Paul McMillan    14 年前

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

    Python支持进行函数式编程所必需的关键特性,您可能会发现,您最好将时间花在其他事情上,特别是在不需要绝对优化的情况下。另一方面,你可能会发现寻找虫子是相当困难的。

        5
  •  0
  •   Vijay Mathew    14 年前

    在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