2016-09-06 8 views
0

nが5と定義されている場合、( - n)は-5の値を与えます。ラケット言語でnまたは( - n)の否定として "-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 
> 

答えて

2

はい。プログラム中にダッシュで始まる識別子を持つ変数がないと仮定すると、乱用する可能性があります。#%top

-nは、バインドされていない変数への変数参照です。 エクスパンダは-n(#%top . -n)に変換します。モジュールnegative.rkt

あなたの場合はmy-topという名前のマクロを作成し、その後、あなたが#%topの独自のバージョンを使用するように(require "negative.rkt")を書くことができ (provide (rename-out [my-top #%top]))を使用して、それを提供しています。

my-topの定義のようなものです:

入力識別子xが-で始まるならば、(- something)-somethingを回すそう(#%top . x)を返します。

#%topを再定義する方法の例については、この質問を参照してください:それは解決していない場合Macro of [S:N] for in-range in Racket

+0

は '#1%のtop'にのみ使用されないでしょうか?したがって、 '(let((-x 10))((-x -x))'はマクロの有無にかかわらず同じように動作しますか? – Sylwester

+0

@sylwesterはい - そのため、他の識別子がダッシュで始まっていないと仮定して始めました。 – soegaard

+1

...実際にはこれを実行しません。 (大きな力をもって大きな責任を負う)... :) –

関連する問題