6

我开始搞乱Ypsilon,它是 Scheme 的 C++ 实现。

它符合R6RS,具有快速垃圾收集器,支持多核 CPU 和 Unicode,但缺少文档、C++ 代码示例和代码中的注释!

作者将其作为独立的控制台应用程序提供。我的目标是将它用作图像处理应用程序中的脚本引擎。

源代码结构良好,但结构不熟悉。我花了两周时间研究它,这就是我发现的:

  1. 与外部世界的所有通信都是通过称为端口的 C++ 结构完成的,它们对应于 Scheme 端口。
  2. 虚拟机有 3 个端口:IN、OUT 和 ERROR。
  3. 端口可以​​是标准端口(通过控制台)、套接字端口、字节向量端口、命名文件端口和自定义端口。
  4. 每个自定义端口都必须提供一个名为handlers的填充结构。
  5. Handlers是一个包含 6 个元素的向量:第一个是布尔值(端口是否为文本),其他五个是函数指针(onRead、onWrite、onSetPos、onGetPos、onClose)。

据我了解,我需要实现 3 个自定义端口(IN、OUT 和 ERROR)。但是现在我无法弄清楚 handlers 中每个函数(onRead、onWrite、onSetPos、onGetPos、onClose)的输入参数是什么

不幸的是,没有实现自定义端口的示例,也没有以下内容的示例:

  1. C++ 到 Scheme 函数绑定(提供的示例是一堆 .scm 文件,仍然不清楚在 C++ 端做什么)。
  2. 编译和运行字节码(通过 bytevector-ports?但是如何将文本编译为字节码?)。

总而言之,如果有人提供上述任何场景的 C++ 示例,它将大大节省我的时间。提前致谢!

4

2 回答 2

3

要回答您的另一个问题,关于编译和运行“字节码”:

  1. 要编译表达式,请使用compile. 这将返回一个代码对象。
  2. 没有公开导出的方法来运行此代码对象。在内部,代码使用run-vmi,但您无法从外部代码访问它。
  3. 在内部,加载和使用已编译代码的唯一位置是在其auto-compile-cache系统中。

请查看heap/boot/eval.scm详细信息。(再次声明,这不是官方回应,纯粹基于个人实验和源代码检查。)

于 2013-02-19T21:21:41.737 回答
3

好的,从我可以阅读的源代码来看,这是调用各种处理程序的方式(这都是非官方的,纯粹基于源代码检查):

  1. 读取处理程序: (lambda (bv off len)): 接受一个字节向量(您的处理程序会将读取的数据放入其中)、一个偏移量(fixnum)和一个长度(fixnum)。您应该最多读取len字节,将这些字节放入bvoff. 返回实际读入的字节数(作为固定数字)。
  2. Write handler: (lambda (bv off len)): 接受一个字节向量(包含要写入的数据)、一个偏移量(fixnum)和一个长度(fixnum)。从,从 开始,最多抓取len字节并将它们写出。返回实际写入的字节数(作为固定数字)。bvoff
  3. 获取位置处理程序:((lambda (pos))仅在文本模式下调用):允许您存储一些数据,pos以便将来调用具有相同pos值的设置位置处理程序会将位置重置回当前位置。返回值被忽略。
  4. 设置位置处理程序::(lambda (pos))将当前位置移动到 的值pos。返回值被忽略。
  5. 关闭处理程序::(lambda ())关闭端口。返回值被忽略。
于 2013-02-19T20:29:07.793 回答