gpt4 book ai didi

variables - 如何知道是否定义了 Racket 变量

转载 作者:行者123 更新时间:2023-12-03 23:46:14 31 4
gpt4 key购买 nike

如果变量是用 Racket 语言定义的还是没有定义的,你怎么能有不同的行为?

最佳答案

有几种方法可以做到这一点。但我怀疑这些都不是你想要的,所以我只会提供指向函数的指针(并解释每个函数的问题):

  • namespace-variable-value 是一个从某个命名空间检索顶级变量值的函数。不过,这仅对 REPL 交互和 REPL 代码有用,因为在模块中定义的代码无论如何都不会使用这些东西。换句话说,您可以使用这个函数(以及相应的 namespace-set-variable-value! )来获取值(如果有的话)并设置它们,但是这些值的唯一用途是在模块中本身不存在的代码中。换句话说,使用这个工具就像保存一个将符号映射到值的哈希表一样好,只是它在 REPL 中稍微方便一些,因为你只需键入名称...
  • 更有可能的是,这类事情是在宏中完成的。第一种方法是使用特殊的 #%top 宏。此宏会自动插入到模块中未知绑定(bind)的所有名称中。这个宏做的通常的事情是抛出一个错误,但你可以在你的代码中重新定义它(或组成你自己的语言来重新定义它),用这些未知的名字做其他事情。
  • 一个稍微复杂的方法是使用 identifier-binding 函数——同样,在宏中,而不是在运行时——并使用它来获取有关赋予宏的某个名称的信息,并根据该名称决定要扩展的内容。

  • 最后两个选项是更有用的选项,但它们不是新手级别的宏,这就是为什么我怀疑你问错问题的原因。为了澄清,你可以用它们来写一种 defined?检查是否定义了某个名称的特殊形式,但是该问题将由宏根据其余代码来回答,因此询问它并不是很有用。如果你想要这样的东西,可以在使用这种谓词的其他动态语言中启用那种代码,那么最好的方法是重新定义 #%top。进行某种查找(哈希表或全局命名空间)而不是引发编译错误——但同样,这与显式使用哈希表之间的区别主要是装饰性的(同样,这不是新手的事情)。

    关于variables - 如何知道是否定义了 Racket 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20076868/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com