【问题标题】:How to "load" a file only once in scheme r5rs?如何在方案 r5rs 中仅“加载”一次文件?
【发布时间】:2022-11-20 03:19:04
【问题描述】:

有没有办法确保方案文件(R5RS)只被loaded 一次?

也就是说,如果foo.scmbar.scm中被多次加载(直接或间接),确保foo.scm的内容只在第一次被加载。

在 C++ 中,可以像这样将源文件的全部内容包含在 #ifndef 中以避免重复导入:

#ifndef _some_tag 
#define _some_tag

//...

#endif

有没有类似的方法来确保旧的 R5RS 文件 loads 在 REPL 会话中只出现一次?

【问题讨论】:

    标签: scheme r5rs


    【解决方案1】:

    简短的回答是,你做不到。但。

    Load 有一个名为的可选参数环境,默认情况下是指向user-envcurrent-env,其父级是system-env。加载文件意味着在您的可选中填充一些符号环境或在当前环境.您可以使用 bound? 检查文件中的特定符号是否已加载到目标环境中。

    PS:一个更好的方法是这样的:

    • 创建一个空的环境
    • 在您的环境中加载您的文件
    • 导出上市使用 environment-define 在 current-env 中来自新环境的符号(以便您的应用程序能够在当前环境中执行导出的符号)。
    • 当您不再需要加载的函数时,您可以删除环境并从当前环境中删除导出的符号。

    (这几乎与加载/选项有效,它还使用本地数据库来了解用什么填充环境等)。

    【讨论】:

    • 您的答案可能是专门针对 MIT Scheme 而不是针对 R5RS 兼容实现。 load 在报告中是可选的,并且在定义时它的合同是一个字符串参数。
    • @Sylwester 确实,麻省理工学院/计划我想到了。但无论如何,不​​可能在R5RSR6RS)中做到这一点。我认为在R7RS 中是可能的,但我没有使用第 7 版,我不知道如何。我刚刚提供了一个可以在中间方案.但我说了一个解决方案,以某种方式加载并使用bound?检查加载。
    猜你喜欢
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 2014-03-26
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    相关资源
    最近更新 更多