需要一个Ypsilon用法的例子

Iva*_*kin 6 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个元素的向量:第一个是布尔值(端口是文本的),其他五个是函数指针(onRead,onWrite,onSetPos,onGetPos,onClose).

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

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

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

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

Chr*_*ung 3

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

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