如果n定义为5,( - n)将给出-5的值。在Racket语言中是否可以使用宏来标识“-n”为n或( - n)的负数?
> (define n 5)
> n
5
> (- n)
-5
> (-n)
. . -n: undefined;
cannot reference an identifier before its definition
> -n
. . -n: undefined;
cannot reference an identifier before its definition
>
答案 0 :(得分:2)
是。如果我们假设您的程序中没有变量,其标识符以破折号开头,则可以滥用#%top
。
表达式-n
是对未绑定变量的变量引用。
扩展器会将-n
转换为(#%top . -n)
。
如果您在模块negative.rkt
中编写一个名为my-top
的宏并使用它来提供它
(provide (rename-out [my-top #%top]))
然后您可以撰写(require "negative.rkt")
来使用您自己的#%top
版本。
my-top
的定义类似于:
如果输入标识符x以-
开头,则将-something
转为(- something)
否则返回(#%top . x)
。
有关如何重新定义#%top
的示例,请参阅此问题:Macro of [S:N] for in-range in Racket