查找 lambda 表达式中的自由变量

2024-03-28

有谁知道如何找出 lambda 表达式中的自由变量?自由变量是不属于 lambda 参数的变量。

我当前的方法(这对我毫无帮助)是简单地使用 car 和 cdr 来遍历表达式。我的主要问题是确定一个值是否是一个变量或者它是否是方案原语之一。有没有办法测试某些内容是否评估为方案的内置函数之一?例如:

(is-scheme-primitive? 'and)
;Value: #t

我正在使用麻省理工学院的方案。


对于任意的 MIT 计划程序,没有任何方法可以做到这一点。一个问题是您描述的功能无法工作。例如,这不使用“方案原语”and:

(let ((and 7)) (+ and 1))

但它确实使用了这个符号'and.

另一个问题是很多事情,比如and,是用宏实现的特殊形式。您需要知道程序中的所有宏扩展为什么,才能弄清楚程序中使用了哪些变量。

要实现此目的,您需要限制接受作为输入的程序集。最好的选择是将其限制为“完全扩展”的程序。换句话说,您要确保您的输入中没有留下任何宏的使用。free-variables功能。

为此,您可以使用expand许多Scheme系统提供的功能。不幸的是,从在线文档 http://www.gnu.org/software/mit-scheme/documentation/mit-scheme-ref/index.html#Top,好像MITScheme没有提供这个功能。如果您能够使用其他系统,Racket http://racket-lang.org/提供了expand http://docs.racket-lang.org/reference/Expanding_Top-Level_Forms.html#%28def._%28%28quote._~23~25kernel%29._expand%29%29功能以及local-expand http://docs.racket-lang.org/reference/stxtrans.html?q=local-expand#%28def._%28%28quote._~23~25kernel%29._local-expand%29%29它在宏内可以正常工作。

Racket实际上还提供了一个实现free-variables功能 http://docs.racket-lang.org/syntax/syntax-helpers.html#%28mod-path._syntax/free-vars%29正如我所描述的,这需要完全扩展的程序作为输入(例如expand or local-expand)。您可以看到源代码 https://github.com/plt/racket/blob/master/collects/syntax/free-vars.rkt#L46以及。

有关完全扩展源代码所涉及问题的详细讨论,请参见这篇即将发表的论文 http://www.cs.utah.edu/plt/expmodel-6/作者:弗拉特、卡尔佩珀、达赖斯和芬德勒。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找 lambda 表达式中的自由变量 的相关文章

随机推荐

  • GTK 窗口运动动画?

    我想自动在屏幕上移动我的 GTK WINDOW 目前我将它置于绘制 移动循环中 但这非常不稳定 我对 GTK 编程 以及一般的 gui 编程 非常陌生 我缺少什么 您还没有说您希望窗口遵循什么样的路径 如果路径是时间的一些简单函数 也就是说
  • 如何在swift4中创建串行队列[重复]

    这个问题在这里已经有答案了 DispatchQueue init label qos attributes autoreleaseFrequency target 参数怎么写 原著笔记看了半天 还是不会写串行队列 None
  • Bootstrap - 如何用JSP实现模态弹出窗口

    我正在尝试使用 Spring MVC 通过 JSP 实现模式弹出窗口 In my 索引 jsp我有这个href链接 a href findCompany Find company a and 总是在这个 jsp中 有这样的代码片段 div
  • Crypto++“Tee”式过滤器

    我正在研究根据某些条件处理数据流 数据从输入管道读取 处理并推送到 Crypto CBC Mode
  • 如何在Mac中从命令行启动docker

    我在 mac 上安装了 docker 桌面 因此 为了启动 docker 我打开应用程序并找到 docker 然后我可以在顶部栏看到一个泊坞窗图标 稍后我可以从命令行运行 docker 命令 我的问题是如何从命令行启动 docker 本身
  • 使用 Passport.js 登录后如何通过 React 进行“重定向”?

    新手反应问题 我将其与passport js 和express 一起使用 我已成功登录该应用程序 但我不知道如何进行重定向 router post login passport authenticate local function req
  • ASP.NET Mvc - 可为空参数和逗号作为分隔符

    我应该如何在 global asax 中定义路由才能使用可为空的参数和逗号作为分隔符 我正在尝试为我的搜索用户页面实施路由规则 例如 Controller Action name page status Global asax 的完整条目
  • 是否可以将事件传递给 Ajax 表单的 OnBegin 函数?

    我的应用程序中有一个 Ajax 表单 我想将事件传递给OnBegin函数 然后使用event preventdefault 这将阻止表单提交 然后在检查某些条件时我尝试手动提交表单 但它不起作用 我无法弄清楚为什么 Ajax BeginFo
  • npm 从本地位置而不是从网络安装软件包?

    这个问题让我抓狂 npm 数据库中有一个包 但它有一些错误 这些错误已经在 github 中修复 我如何使用修复版本 github 版本 Edit 您可以直接从 GitHub 存储库安装 甚至只使用 GitHub 用户名和存储库名称 npm
  • 从 eclipse 中卸载和删除插件

    我正在从 eclipse 卸载选项中卸载名为 X 的插件 现在为了明确方法 我进入 eclipse 插件目录并从那里删除插件 jar 文件 现在我尝试重新安装相同的插件 并且 eclipse 提示错误 期间发生错误 org eclipse
  • 结构化 Spark 流指标检索

    我有一个具有结构化 Spark 流的应用程序 我想获取一些指标 例如调度延迟 延迟等 通常 此类指标可以在 Spark UI Streaming 选项卡中找到 但是 结构化流不存在此类功能我知道 那么如何获取这些指标值呢 目前 我尝试使用查
  • Java 泛型:泛型映射(深拷贝)的方法签名

    我有几个Map其本身可能再次包含Maps 任何类型 我写了一个带有签名的方法 public static
  • netbeans jvi vimrc 文件位置

    我已经开始使用 netbeans vim 插件 Jvi 并且我似乎找不到 vimrc 文件位置 我发现一个选项似乎说它将把 vimrc 保存在主文件夹中 但那里没有 我正在使用Ubuntu 谢谢 jVi 不支持 vimscript 因此它不
  • 文本框的日期验证

    我一直用它来将日期设为 mm dd yyyy 格式
  • ViewModelProviders 在 1.1.0 中已弃用

    看着谷歌文档 https developer android com topic libraries architecture viewmodel for ViewModel 他们展示了下面的示例代码 说明如何获得ViewModel val
  • 观察角度指令中 ngModel.$invalid 的变化

    我有一个指令替换select具有自定义输入控件的元素 这是它的简化版本 angular module MyModule directive reflector function timeout return require ngModel
  • Android 从 youtube 获取视频链接

    您好 我正在开发一个 Android 应用程序 我的应用程序的一部分想要将歌曲标题解析到 YouTube 并获取视频链接 获得 100 正确的视频并不重要 那么我如何从 youtube 检索数据呢 任何人都可以帮助我找到解决方案 这对我来说
  • gzip 文件如何存储在 HDFS 中

    HDFS存储支持压缩格式来存储压缩文件 我知道 gzip 压缩不支持夹板 现在假设该文件是一个 gzip 压缩文件 其压缩大小为 1 GB 现在我的问题是 该文件将如何存储在 HDFS 中 块大小为 64MB 由此link http com
  • 非常奇怪的 Application.ThreadException 行为

    我正在使用应用程序线程异常 http msdn microsoft com en us library system windows forms application threadexception aspx事件来处理和记录我的 winf
  • 查找 lambda 表达式中的自由变量

    有谁知道如何找出 lambda 表达式中的自由变量 自由变量是不属于 lambda 参数的变量 我当前的方法 这对我毫无帮助 是简单地使用 car 和 cdr 来遍历表达式 我的主要问题是确定一个值是否是一个变量或者它是否是方案原语之一 有