【发布时间】:2021-01-22 15:18:43
【问题描述】:
例如,假设 'match 是一个宏,而 'car 不是:
> (macro? 'match)
#t
> (macro? 'car)
#f
【问题讨论】:
标签: scheme chez-scheme bigloo
例如,假设 'match 是一个宏,而 'car 不是:
> (macro? 'match)
#t
> (macro? 'car)
#f
【问题讨论】:
标签: scheme chez-scheme bigloo
大多数方案都没有这样的macro? 函数。要区分普通函数和宏,您可以使用 RnRS 中的procedure?:
> (procedure? car)
#t
【讨论】:
(procedure? let) 不是语法错误吗?
Unbound variable -- let。
问题是不能使用 Scheme 语法命名关键字:
> (procedure? let)
Exception: invalid syntax let
所以你必须使用一个符号,比如'let,来引用它。鉴于eval 需要能够将关键字与其他标识符区分开来,您可以尝试以下操作:
(define keyword?
(lambda (symbol)
(guard (x [else (syntax-violation? x)])
(eval symbol)
#f)))
(keyword? 'let) ⇒ #t
(keyword? 'car) ⇒ #f
(keyword? 'does-not-exist) ⇒ #f
但这无疑是一把相当大的锤子。 eval 的这种单参数形式是 Chez Scheme 的扩展,提供 (interaction-environment) 作为默认环境。它也不是完全安全的,因为它会挂起:
(let-syntax ([foo (lambda (x) (raise "oops"))])
(keyword? 'foo))
【讨论】: