理由: 大きなライブラリをSchemeからPythonに変換しようとしています
この種の変換を行うための良い戦略はありますか? この場合、特にクロスパラダイムです。これは、Python がオブジェクト指向であり、Scheme が機能的であるためです。
完全に主観なのでコミュニティwikiにしています
理由: 大きなライブラリをSchemeからPythonに変換しようとしています
この種の変換を行うための良い戦略はありますか? この場合、特にクロスパラダイムです。これは、Python がオブジェクト指向であり、Scheme が機能的であるためです。
完全に主観なのでコミュニティwikiにしています
元の言語実装をほぼ要件仕様のように扱い、それに基づいて設計を作成します (最も重要なのは、外部インターフェイスとライブラリ内のモジュール間のインターフェイスの両方について、詳細なインターフェイス定義を含むことです)。次に、その設計から実装します。
私が絶対にやりたくないことは、あらゆる種類の関数ごとの変換です。
テスト ケースを生成する方法としてスキームの実装を使用します。スキームコードを呼び出すことができる関数を作成し、出力を読み取り、それを 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 は、関数型プログラミングを行うために必要な主要な機能をサポートしているため、絶対的な最適化が必要ない場合は特に、時間を他のことに費やしたほうがよいことに気付くかもしれません。一方で、バグハンティングは非常に難しいと感じるかもしれません。