Советы по переводу кода с очень не связанных языков (в данном случае Scheme на Python)? - PullRequest
5 голосов
/ 24 мая 2010

Причина: я пытаюсь преобразовать большую библиотеку из Scheme в Python

Есть ли хорошие стратегии для такого преобразования? Конкретно кросс-парадигма в этом случае, так как Python больше ОО, а Схема функциональна

Абсолютно субъективно, поэтому я делаю это вики сообщества

Ответы [ 5 ]

7 голосов
/ 24 мая 2010

Я бы относился к исходной языковой реализации почти как к спецификации требований и написал бы дизайн, основанный на ней (наиболее важно, включая подробные определения интерфейсов, как для внешних интерфейсов, так и для интерфейсов между модулями в библиотеке). Тогда я бы реализовал из этого дизайна.

Что бы я определенно НЕ сделал, так это какой-либо перевод функции за функцией.

6 голосов
/ 24 мая 2010

Используйте реализацию схемы как способ генерации тестовых случаев. Я написал бы функцию, которая может вызывать код схемы, и читать результат, преобразовывая его обратно в python.

Таким образом, вы можете написать контрольные примеры, которые выглядят так:

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

Это не поможет вам перевести библиотеку, но даст вам достаточно уверенности, что то, что у вас есть, дает верные результаты.

Конечно, в зависимости от того, что делает схема, она может быть не такой простой, как эта ...

1 голос
/ 24 мая 2010

Я бы установил кучу досок и выписал алгоритмы из кода Схемы. Тогда я бы реализовал алгоритмы на Python. Затем, как предлагает @PaulHankin, используйте код Scheme как способ написания тестовых случаев для тестирования кода Python

0 голосов
/ 24 мая 2010

Напишите интерпретатор Python в Scheme и напрямую переведите вашу программу на него :-) Вы можете начать с def:

 (define-syntax def
      (syntax-rules ()
        ((def func-name rest ...)
         (define func-name (lambda rest ...)))))

 ;; test

 (def sqr (x) (* x x))
 (sqr 2) => 4
0 голосов
/ 24 мая 2010

Если у вас нет времени, чтобы сделать то, что другие предложили, и на самом деле повторно реализовать эту функциональность, нет никаких причин, по которым вы НЕ МОЖЕТЕ реализовать ее строго функциональным образом.

Python поддерживает ключевые функции, необходимые для функционального программирования, и вы можете обнаружить, что ваше время было лучше потрачено на другие вещи, особенно если абсолютная оптимизация не требуется. С другой стороны, охота на багов может оказаться довольно сложной.

...