Итак, я написал несколько расширений ракеток для некоторых классов 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 в качестве суперкласса.
Любой совет был бы очень признателен, и если бы вы могли указать мне пример (может быть, есть что-то в базовом коде ракетки вы можете указать мне?)
Таким образом, решение этого вопроса является более прямым, чем я первоначально думал. Ошибка в том, что я хотел включить расширение в другое, в этом нет необходимости. Ключ заключается в создании расширений, отдельно реализующих каждую функцию, которую вы хотите представить в 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)
И это все, что она написала …
Других решений пока нет …