【问题标题】:Macro to write -n as negative of n in Racket将 -n 写为 Racket 中 n 的负数的宏
【发布时间】:2016-09-06 12:20:29
【问题描述】:

如果 n 定义为 5,(-n) 将给出 -5 的值。是否有一个宏可以将“-n”识别为 Racket 语言中的 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
> 

【问题讨论】:

    标签: macros scheme racket


    【解决方案1】:

    是的。如果我们假设您的程序中没有标识符以破折号开头的变量,您可以滥用#%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

    【讨论】:

    • #%top 只有在没有解决的情况下才会使用?因此(let ((-x 10)) (+ -x -x)) 在有或没有宏的情况下都可以正常工作吗?
    • @sylwester 是的 - 这就是为什么我开始假设没有其他标识符以破折号开头。
    • ...但实际上并没有这样做。 (能力越大责任越大)... :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    相关资源
    最近更新 更多