需要一个Ypsilon用法的例子

时间:2013-02-19 09:05:14

标签: c++ scheme bytecode ffi

我开始讨论Ypsilon,这是Scheme的C ++实现。

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

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

源代码结构合理,但结构不熟悉。 我花了两周时间穿透它,这就是我发现的:

  1. 与外部世界的所有通信都是通过调用的C ++结构完成的 端口,它们对应于Scheme端口。
  2. 虚拟机有3个端口:IN,OUT和ERROR。
  3. 端口可以是std-ports(通过控制台),socket-ports, bytevector-ports,named-file-ports和custom-ports。
  4. 每个自定义端口必须提供名为处理程序的填充结构。
  5. 处理程序是一个包含6个元素的向量:第一个是布尔值 (是否     port是textual),其他五个是函数指针(onRead,onWrite,onSetPos,onGetPos,onClose)。
  6. 据我了解,我需要实现3个自定义端口(IN,OUT和ERROR)。 但是现在我无法弄清楚,处理程序中每个函数(onRead,onWrite,onSetPos,onGetPos,onClose)的输入参数是什么。

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

    1. C ++到Scheme函数绑定(提供的示例是一堆 .scm-files,仍然不清楚在C ++方面该怎么做)。
    2. 编译和     运行字节码(通过bytevector-ports?但是如何编译文本到     字节码?)。
    3. 总结,如果有人提供上述任何场景的C ++示例,它将大大节省我的时间。 提前谢谢!

2 个答案:

答案 0 :(得分:2)

好的,从我能读到的源代码,这里是如何调用各种处理程序(这完全是非官方的,完全基于源代码检查):

  1. 读取处理程序:(lambda (bv off len)):接受一个bytevector(处理程序将读取数据放入其中),偏移量(fixnum)和长度(fixnum)。您应该读入最多len个字节,将这些字节从bv开始放入off。返回实际读入的字节数(作为fixnum)。
  2. 写入处理程序:(lambda (bv off len)):接受一个bytevector(包含要写入的数据),offset(fixnum)和length(fixnum)。从len开始,从bv获取off个字节,然后将其写出来。返回实际写入的字节数(作为fixnum)。
  3. 获取位置处理程序:(lambda (pos))(仅在文本模式下调用):允许您存储pos的一些数据,以便将来调用具有相同pos的设置位置处理程序value会将位置重置回当前位置。忽略返回值。
  4. 设置位置处理程序:(lambda (pos)):将当前位置移动到pos的值。忽略返回值。
  5. 关闭处理程序:(lambda ()):关闭端口。忽略返回值。

答案 1 :(得分:2)

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

  1. 要编译表达式,请使用compile。这将返回一个代码对象。
  2. 没有公开导出的方法来运行此代码对象。在内部,代码使用run-vmi,但您无法从外部代码访问此代码。
  3. 在内部,加载和使用已编译代码的唯一位置是auto-compile-cache系统。
  4. 详细了解heap/boot/eval.scm。 (同样,这不是官方回复,而是纯粹基于个人实验和源代码检查。)