2013-02-19 5 views
5

Я начал работать с Ypsilon, что является реализацией Схемы на C++.Нужно пример использования Ypsilon

Это соответствует R6RS, функции быстрого сборщика мусора, поддерживает многоядерные процессоры и Unicode, но имеет ОТСУТСТВИЕ документации, C++ примеры кода и комментарии в коде!

Авторы предоставляют его как отдельное консольное приложение. Моя цель - использовать его как скриптовый движок в приложении для обработки изображений.

Исходный код хорошо структурирован, но структура незнакома. я провел две недели проникая его, и вот что я выяснил:

  1. Все коммуникации с внешним миром осуществляется через структуры C++ называемые порты, они соответствуют портам Scheme.
  2. Виртуальная машина имеет 3 порта: IN, OUT и ERROR.
  3. Порты могут быть STD-портами (через консоль), сокет-порты, bytevector-ports, named-file-ports и custom-ports.
  4. Каждый пользовательский порт должен предоставить заполненную структуру, называемую обработчиками.
  5. Обработчики представляет собой вектор, содержащий 6 элементов: первый из них является булево (будь то порт является текстовым), а остальные пять указателей на функции (onRead, onWrite, onSetPos, onGetPos, OnClose).

Насколько я понимаю, мне нужно реализовать 3 пользовательских порта (IN, OUT и ERROR). Но пока я не могу понять, каковы входные параметры каждой функции (onRead, onWrite, onSetPos, onGetPos, onClose) в обработчиках .

К сожалению, нет ни пример не реализует в пользовательский порт не пример следующего материала:

  1. C++ в функции привязки схемы (приведены примеры куча .scm-файлов, до сих пор неясно, что делать на стороне C++).
  2. Компиляция и работает bytecode (через bytevector-ports? Но как скомпилировать текст в bytecode?).

Резюмируя, если кто-нибудь дает пример C++ любого сценария, упомянутого выше, было бы значительно сэкономить свое время. Спасибо заранее!

+0

Вы пытались связаться с разработчиком проекта? Это может сэкономить вам время. – Seki

+1

@Seki, Yep. Они не ответили. –

ответ

2

Хорошо, от того, что я могу читать из исходного кода, вот как различные обработчики вызываются (это все неофициальные, основанные исключительно на источник инспекции кода):

  1. Read Обработчик: (lambda (bv off len)): берет bytevector (который ваш обработчик поместит прочитанные данные), смещение (fixnum) и длину (fixnum). Вы должны прочитать до len байт, поместив эти байты в bv, начиная с off. Верните количество фактически прочитанных байтов (как fixnum).
  2. Обработчик записи: (lambda (bv off len)): принимает байтовый вектор (который содержит данные для записи), смещение (fixnum) и длину (fixnum). Захватите до len байт от bv, начиная с off и выпишите их. Верните количество фактически записанных байтов (как fixnum).
  3. Получить обработчик положения: (lambda (pos)) (только в текстовом режиме): Позволяет хранить некоторые данные для pos, так что будущий вызов обработчику заданного положения с тем же значением pos вернет позицию обратно в текущую позицию. Возвращаемое значение игнорируется.
  4. Установить обработчик положения: (lambda (pos)): Переместить текущее положение в значение pos. Возвращаемое значение игнорируется.
  5. Закрыть обработчик: (lambda()): Закройте порт. Возвращаемое значение игнорируется.
+0

Это поможет, спасибо, @ Крис! Вы связаны с развитием Ypsilon? –

+0

Мое удовольствие. Я вообще не связан: я только что загрузил Ypsilon после того, как увидел этот вопрос и решил копаться. Тем не менее, две вещи помогли: 1. Я являюсь коммиттером для Guile (другая реализация схемы), поэтому я знаю, как реализуются реализации Scheme в целом, и 2. У меня есть профессиональный опыт работы на C++ и рассматриваю C++ один из моих основных языков. –

2

Для того, чтобы ответить на другой вопрос, который вы имели, о компиляции и запуска "байткод":

  1. Чтобы компилировать выражение, используйте compile. Это возвращает объект кода.
  2. Существует не публично экспортированный подход для запуска этого объекта кода. Внутренне код использует run-vmi, но вы не можете получить к нему доступ извне кода.
  3. Внутренне единственное место, где загружен и используется скомпилированный код, находится в его системе auto-compile-cache.

Для получения более подробной информации см. heap/boot/eval.scm. (Опять же, это не официальный ответ, а основанный исключительно на личных экспериментах и ​​проверке исходного кода.)

+0

Спасибо за ответы и спасибо за ваше время @Chris! –

Смежные вопросы