【问题标题】:Need an example of Ypsilon usage需要一个 Ypsilon 使用示例
【发布时间】:2013-02-19 09:05:13
【问题描述】:

我开始搞乱Ypsilon,这是一个C++实现的Scheme。

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

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

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

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

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

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

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

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

【问题讨论】:

  • 您是否尝试联系项目的项目维护者?它可以为您节省一些时间。
  • @Seki,是的。他们没有回答。

标签: c++ scheme bytecode ffi


【解决方案1】:

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

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

【讨论】:

  • 这会有所帮助,谢谢@Chris!您与 Ypsilon 的开发有关吗?
  • 我的荣幸。我根本没有关系:我在看到这个问题并决定四处挖掘后才下载了 Ypsilon。但是,有两件事有所帮助:1. 我是 Guile(另一个 Scheme 实现)的提交者,所以我知道 Scheme 实现的一般工作原理,以及 2. 我在 C++ 方面有专业经验,并认为 C++ 是我的主要语言之一。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2011-09-03
    • 2023-03-25
    相关资源
    最近更新 更多