【发布时间】:2016-12-15 02:27:49
【问题描述】:
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) 的代码?
但这应该行不通,因为宏不像函数那样是一等对象......
【问题讨论】:
-
这你应该在编译时/写时知道。 XY?打算用它做什么?
-
我已为我的问题添加了详细信息。
标签: scheme chicken-scheme