首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Racket程序中使用Scheme库

在Racket程序中使用Scheme库
EN

Stack Overflow用户
提问于 2019-03-19 13:38:35
回答 1查看 860关注 0票数 8

我用Racket编写了一个程序(源代码在.rkt文件中,#lang racket位于顶部)。我还用(大部分)可移植R7RS方案编写了一个库。我能以干净的方式使用程序中的库吗?

我的目标是使库在Scheme实现之间广泛移植(至少是R7RS兼容的实现,理想的其他实现也是如此)。有一个第三方R7RS球拍垫片,但据我所知,它要求我在源文件的顶部键入#lang r7rs。我猜想这个#lang指令会混淆除Racket之外的其他方案。

我能否将库的核心放在一个或多个可移植的.scm源文件中,然后有一个带有#lang r7rs指令的.rkt文件,该指令以某种方式告诉Racket包含可移植文件?是否理解某些库定义文件,如.sld雪堡上使用的

我试着查找所有的球拍文档,但我找不到这个讨论的任何地方。我也没有找到通用计划、可移植性、常见问题解答或最佳实践文档。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-24 08:55:00

我成功地将Racket和R7RS代码混合用于实际工作,并以论GitHub技术为例。

以下是回购协议中自述的一份副本:

球拍R7RS Shim

球拍不提供R7RS支持。它在由Alexis编写的第三方软件包r7rs中:https://github.com/lexi-lambda/racket-r7rs --尽管它不是Racket的官方部分,但对我来说工作得很好(我使用了一个中等复杂的库来进行HTML解析,并在此基础上编写了一些非常复杂的字符串处理和树遍历,所以这对实际工作绝对有用)。

您可以通过raco pkg install r7rs安装垫片。还请注意,info.rkt在依赖项中列出了r7rs,这是Heroku等人所需要的。

模块

  • app --一个球拍应用程序
  • lib -- app使用的R7RS库
  • sublib -- lib使用的R7RS库

模块是由什么文件组成的?

所以app只需要一个文件,app.rkt,就像任何普通的球拍模块一样。

但是libsublib分别需要3个文件。lib.scm是方案代码。lib.sld是计划库的定义。而lib.rkt是它的球拍包装。从技术上讲,您可以将lib.sldlib.scm合并到一个文件中,但是将它们分开比较干净。您还可以将所有Scheme代码直接复制到lib.rkt中,但不能将其导入其他方案。

请注意,lib.scm在顶部没有(import ...)表单。导入在define-library表单中的lib.sld中。define-library表单使用(include ...)将实际代码包含在lib.scm中。

lib.rkt的工作就是把#lang r7rs说成是Racket,然后包括Scheme的内容。它首先需要(import (scheme base)),以便我们可以使用includeexport。所包含的.sld文件从库所需的Scheme标准导入其他所有内容。

注意,lib依赖于sublib,但是sublib不是由lib.sld中的define-library表单导入的。相反,lib.rkt必须加载lib及其所有依赖项:除了明显的(include "lib.sld")之外,它还包含(include "sublib.sld")

因此,lib.sld只从Scheme标准导入内容,而lib.rkt则导入我们的所有自定义库。我不得不求助于这个黑客,因为如果我把它放在sublib导入中,就无法让球拍模块查找器找到它。我一点也不努力,所以很可能有办法让它发挥作用。

可变列表与不可变列表

默认情况下,球拍使用不变的反单元格(由球拍的cons制作,满足pair?),而R7RS使用可变的缺点单元格(由球拍的mcons制作,满足mpair?)。也就是说,当你在球拍侧调用cons时,它实际上做出了一些看起来像在球拍侧调用mcons的东西。可变的缺点意味着您可以使用Scheme的set-car!set-cdr!来改变它的位置,而不可变的缺点的car和cdr不能在初始cons之后被更改。

默认情况下,Racket显示使用{curly braces}而不是(ordinary parentheses)由可变的conses组成的列表。当你通过R7RS-球拍边界时,这会咬你一口。您可以通过更改print-mpair-curly-braces参数使用普通括号进行打印,但在许多情况下,可以更容易地将列表(和树)从可变转换为不可变。

我不知道球拍R7RS垫片是否允许你在计划方面做不可变的凹痕。最好让Scheme cons有一个选项来生成不可变的连接(在这种情况下,set-car!set-cdr!会导致一个错误,这对于只使用不可变的数据结构的代码来说是很好的)。

在哪里找到R7RS库

很多R7RS库都是由http://snow-fort.org/的Alex收集的。

底线

这一切的结果是,你可以混合R7RS和球拍与一些工作,你的代码库保持相当干净(至少对简单的情况)。

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

https://stackoverflow.com/questions/55242394

复制
相关文章

相似问题

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