2013-02-19 13 views
5

Zacząłem zadzierać z Ypsilon, co jest implementacją Schematu w C++.Potrzebujesz przykładu użycia Ypsilon

spełnia on R6RS, posiada szybki śmieciarza, obsługuje wielordzeniowe procesory i Unicode, ale ma BRAK dokumentacji, C Przykłady i komentarze w kodzie kod ++!

Autorzy udostępniają go jako samodzielną aplikację konsolową. Moim celem jest wykorzystanie go jako silnika skryptów w aplikacji do przetwarzania obrazu.

Kod źródłowy jest dobrze skonstruowany, ale struktura jest nieznana. Spędziłem dwa tygodnie przenikliwy, i oto co znalazłem na:

  1. Cała komunikacja ze światem zewnętrznym odbywa się za pomocą C++ struktur zwanych porty, oni odpowiadają portów systemu.
  2. Maszyna wirtualna ma 3 porty: IN, OUT i ERROR.
  3. Porty mogą być portami std (przez konsolę), gniazdami-gniazdami, portami bytevector, nazwanymi portami-plikami i portami niestandardowymi.
  4. Każdy niestandardowy port musi zawierać wypełnioną strukturę o nazwie obsługujące.
  5. Rączki jest wektorem zawierającym 6 elementów: 1. Jeden jest logiczna (czy portu jest tekstowy), a pozostałe pięć to wskaźniki funkcyjne (OnRead, onWrite, onSetPos, onGetPos, onClose).

O ile rozumiem, muszę zaimplementować 3 niestandardowe porty (IN, OUT i ERROR). Ale na razie nie mogę dowiedzieć się, jakie są parametry wejściowe dla każdej funkcji (onRead, onWrite, onSetPos, onGetPos, onClose) w obsługujących.

Niestety, nie ma ani przykładem wdrożenie Port niestandardowy żadnego przykładu następującej treści:

  1. C++ do powiązań funkcjonalnych systemu (dostarczone przykłady to banda SCM-plików, nadal nie wiadomo, co robić po stronie C++).
  2. Kompilowanie i działający kod bajtowy (przez porty bytevector? Ale jak skompilować tekst do kod bajtowy?).

Podsumowując, jeśli ktoś dostarcza przykład C++ jakiegokolwiek scenariusza mowa powyżej, byłoby to znacznie zaoszczędzić swój czas. Z góry dziękuję!

+0

Czy próbowałeś skontaktować się z opiekunem projektu w ramach projektu? To może zaoszczędzić ci trochę czasu. – Seki

+1

@Seki, Yep. Nie odpowiedzieli. –

Odpowiedz

2

Ok, z tego co mogę odczytać kodu źródłowego, oto jak różne teleskopowe się nazywa (to wszystko jest nieoficjalny, oparte wyłącznie na kontroli kodu źródłowego):

  1. Czytaj obsługi: (lambda (bv off len)): trwa bytevector (do którego twój przewodnik umieści dane odczytu), offset (fixnum) i długość (fixnum). Powinieneś przeczytać do len bajtów, umieszczając te bajty w bv zaczynając od off. Zwraca liczbę bajtów faktycznie wczytanych (jako fixnum).
  2. Write handler: (lambda (bv off len)): bierze bytevector (który zawiera dane do zapisu), offset (fixnum) i długość (fixnum). Zyskaj do len bajtów z bv, zaczynając od off i zapisuj je. Zwraca liczbę faktycznie zapisanych bajtów (jako fixnum).
  3. Get obsługi pozycji: (lambda (pos)) (nazywany tylko w trybie tekstowym): Pozwala przechowywać niektóre dane dla pos tak że przyszły wezwanie do obsługi pozycji zestaw o tej samej wartości pos wyzeruje pozycję z powrotem do aktualnej pozycji. Zwracana wartość jest ignorowana.
  4. Ustaw pozycję transportera pozycji: (lambda (pos)): Przenieś bieżącą pozycję do wartości pos. Zwracana wartość jest ignorowana.
  5. Close handler: (lambda()): Zamknij port. Zwracana wartość jest ignorowana.
+0

To pomoże, dziękuję, @Chris! Czy jesteś powiązany z rozwojem Ypsilon? –

+0

Moja przyjemność. Nie jestem w ogóle spokrewniony: Właśnie pobrałem Ypsilon po tym, jak zobaczyłem to pytanie i postanowiłem się rozejrzeć. Pomogły mi jednak dwie rzeczy: 1. Jestem uczestnikiem programu Guile (inna implementacja Schematu), więc wiem, jak ogólnie działają wdrożenia schematu, oraz 2. Posiadam doświadczenie zawodowe w C++ i uważam C++ za jeden z moich głównych języków. –

2

Aby odpowiedzieć na kolejne pytanie, trzeba było o skompilowanie i uruchomienie "kodu bajtowego":

  1. skompilować wyrażenie użyj compile. Zwraca obiekt kodu.
  2. Nie istnieje publicznie eksportowane podejście do uruchamiania tego obiektu kodu. Wewnętrznie kod używa run-vmi, ale nie można uzyskać do niego dostępu z zewnętrznego kodu.
  3. Wewnętrznie jedynym miejscem, w którym skompilowany kod jest ładowany i używany, jest jego system auto-compile-cache.

Szczegółowe informacje znajdują się pod adresem heap/boot/eval.scm. (Ponownie, nie jest to oficjalna odpowiedź, ale opiera się wyłącznie na osobistych eksperymentach i kontroli kodu źródłowego.)

+0

Dzięki za odpowiedzi i dziękuję za poświęcony czas, @Chris! –

Powiązane problemy