如何确定一个变量是否存在于鸡方案



是否有一种方法在Chicken Scheme中确定在运行时是否定义了变量?

(let ((var 1))
 (print (is-defined? var))   ; #t
(print (is-defined? var))    ; #f

编辑:XY问题

我正在写一个生成代码的宏。生成的代码必须以相互递归的方式调用宏——让宏简单地调用自身是行不通的。当递归地调用宏时,我需要它的行为与最初调用时不同。我会使用嵌套函数,但是....这是一个宏。

粗糙的例子:

(defmacro m (nested)
 (if nested
  BACKQUOTE(print "is nested")
  BACKQUOTE(m #t)

(是的,我知道scheme不使用defmacro,但我来自Common Lisp。而且,我似乎不能在这里加上反引号,否则一切都会变糟。

我不希望宏的INITIAL调用使用一个只有在递归调用时才有意义的额外参数。我想用别的方法让它知道。

我可以得到生成的代码调用嵌套在第一个宏和不存在于调用站点的宏,也许吗?例如,生成调用(,other-macro)而不是(macro)的代码?

但是这不应该起作用,因为宏不是像函数那样的一等对象。

当您编写递归宏时,我得到的印象是您有一个宏扩展(m a b ...),它会变成(m-helper a (b ...)),可能会变成(let (a ...) (m b ...))。这是而不是直接递归,因为您正在将代码转换为恰好包含宏的代码。

使用destructuring-bind,您实际上只需要跟踪两个变量。一个用于car,一个用于cdr,并使用隐式重命名宏,非来自表单的内容被重命名,因此卫生:

(define-syntax destructuring-bind
  (ir-macro-transformer
   (lambda (form inject compare?)
     (define (parse-structure structure expression optional? body)
       ;;actual magic happens here. Returns list structure with a mix of parts from structure as well as introduced variables and globals
       )
     (match form
       [(structure expression) . body ]
       `(let ((tmp ,expression))
          ,(parse-structure structure 'tmp #f body))))))

要检查输入中的某项是否与所提供的compare?过程相同。如。(compare? expression '&optional) .

通常无法做到这一点,因为Scheme具有词法作用域。如果引用未定义的变量是错误的,那么询问变量是否定义就没有多大意义了。

对于顶层/全局变量,你可以使用符号-utils彩蛋,但它可能不会像你期望的那样工作,考虑到模块内的全局变量也被重写为其他东西。

也许如果你能说出你真正想要做什么,我可以帮你找到一个替代的解决方案。

相关内容

  • 没有找到相关文章

最新更新