Расширения и наследование Racket / Scheme C ++

Итак, я написал несколько расширений ракеток для некоторых классов C ++, используя учебник (http://docs.racket-lang.org/inside/overview.html) на сайте ракетки и смогли успешно загрузить их в ракетку. Однако мне было интересно, могу ли я использовать наследование для повторного использования некоторого кода.

Например, у меня есть два класса, которые я написал на C ++, Foo и Bar.

Класс Foo выглядит так:

Foo {
func1() { /* ... do stuff */ }
}

Класс Bar выглядит так:

Bar : Foo {
func2() { /*... do more stuff /*}
}

В настоящее время я написал одно расширение .cpp для ракеток, которое создает Bar и создает расширения как для func1 (), так и для func2 (); Тем не менее, я хотел бы создать два класса расширения ракетки. Одно расширение, которое работает только внутри Foo, а затем я просто хочу включить Foo_ext.h (мое расширение для ракетки для Foo) в Bar_ext.h, чтобы у меня был доступ ко всем функциям.

Итак, в настоящее время у меня есть это:

Bar_ext.cpp:

func1_racket_ext() { /*... do racket stuff and run func1() */}func2_racket_ext() {/* ... do more racket stuff and run func2() /*}/* Scheme initializes etc... */

Но то, что я действительно хочу, это:

Foo_ext.h:

func1_racket_ext() { /*... do racket stuff and run func1() */}/* Scheme initializes etc... */

Bar_ext.cpp:

#include "Foo_ext.h"

func2_racket_ext() {/* ... do more racket stuff and run func2() /*}/* Scheme initializes etc... */

Это вообще возможно? Я чувствую, что пространство имен может быть проблемой. Это было бы чрезвычайно полезно для меня, потому что это позволило бы мне не писать много-много избыточного кода, так как у меня есть много классов, которые используют класс Foo в качестве суперкласса.

Любой совет был бы очень признателен, и если бы вы могли указать мне пример (может быть, есть что-то в базовом коде ракетки вы можете указать мне?)

2

Решение

Таким образом, решение этого вопроса является более прямым, чем я первоначально думал. Ошибка в том, что я хотел включить расширение в другое, в этом нет необходимости. Ключ заключается в создании расширений, отдельно реализующих каждую функцию, которую вы хотите представить в racket, и каждая функция ссылается на указатель на объект. Например:

Foo_ext.cpp (псевдокод)

static Foo * foo;
Scheme_Object * create_foo(...) {
foo = new Foo();
return make_scheme_ptr(foo);
}

Scheme_Object * do_func1(..., Foo * f)
{
foo = f;
/* do func_1 stuff */
}

/* ... Do scheme stuff... */

Тогда тот же код будет сделан для bar_ext.

Здесь ключ к тому, что в скрипте ракетки, где вы хотите использовать свои расширения, вам нужны оба расширения:

(require "Foo_ext.rkt")
(require "Bar_ext.rkt")

; my_bar is the pointer to the bar created.
(define my_bar (create_bar))

; Pass 11 and the my_bar pointer to func1 declared in Foo_ext
(func1 11 my_bar)
; Pass 12 and the my_bar pointer to func2 declared in Bar_ext
(func2 12 my_bar)

И это все, что она написала …

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]