首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要一个使用Ypsilon的例子

需要一个使用Ypsilon的例子
EN

Stack Overflow用户
提问于 2013-02-19 09:05:13
回答 2查看 179关注 0票数 6

我开始处理Ypsilon,它是Scheme的一个C++实现。

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

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

源代码结构良好,但结构不熟悉。我花了两个星期钻研它,下面是我发现的:

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

据我所知,我需要实现3个自定义端口(输入、输出和错误)。但是现在我还不知道处理程序中每个函数(onRead、onWrite、onSetPos、onGetPos、onClose)的输入参数是什么。

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

  1. C++到Scheme函数绑定(提供的示例是一堆..scm文件,还不清楚在C++端该做什么)。
  2. 编译和运行字节码(通过字节矢量端口?)但是如何将文本编译成字节码呢?)。

Summarizing,如果有人提供了上述任何场景的C++示例,这将大大节省我的时间。提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2013-02-19 20:29:07

好的,根据我对源代码的了解,下面是如何调用各种处理程序(这都是非官方的,完全基于源代码检查):

  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 ()):关闭端口。忽略返回值。
票数 3
EN

Stack Overflow用户

发布于 2013-02-19 21:21:41

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

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

有关详细信息,请查看heap/boot/eval.scm。(同样,这不是官方的回应,而是纯粹基于个人试验和源代码检查。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14953563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档