在-Retet

时间:2016-09-06 12:20:29

标签: macros scheme racket

如果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
> 

1 个答案:

答案 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