0

変数が現在定義されているかどうかを実行時に確認する方法がチキン スキームにありますか?

(let ((var 1))
 (print (is-defined? var))   ; #t

(print (is-defined? var))    ; #f

編集: XY 問題。

コードを生成するマクロを書いています。この生成されたコードは相互再帰でマクロを呼び出す必要があります。マクロが単にそれ自体を呼び出すだけでは機能しません。マクロが再帰的に呼び出されるとき、最初に呼び出されたときとは異なる動作をする必要があります。ネストされた関数を使用しますが、ええと....それはマクロです。

大まかな例:

(defmacro m (nested)
 (if nested
  BACKQUOTE(print "is nested")
  BACKQUOTE(m #t)

(はい、スキームが defmacro を使用していないことは知っていますが、私は Common Lisp から来ています。また、すべてが地獄に行かなければ、ここに逆引用符を入れることはできないようです。)

マクロの INITIAL 呼び出しで、再帰的に呼び出された場合にのみ意味を持つ余分な引数を取りたくありません。他の手段で知ってもらいたい。

生成されたコードで、最初のマクロ内にネストされていて呼び出しサイトに存在しないマクロを呼び出すことはできますか? たとえば、?(,other-macro)の代わりに呼び出すコードを生成します。(macro)

しかし、マクロは関数のようなファーストクラスのオブジェクトではないため、それは機能しないはずです...

4

2 に答える 2

0

一般に、Scheme はレキシカル スコープであるため、これを行う方法はありません。未定義の変数の参照がエラーである場合、変数が定義されているかどうかを尋ねるのはあまり意味がありません。

トップレベル/グローバル変数の場合、symbol-utils の卵を使用できますが、モジュール内のグローバル変数も別のものに書き換えられることを考えると、期待どおりに機能しない可能性があります。

あなたが本当に何をしようとしているのかを言うことができれば、おそらく別の解決策を手伝うことができます.

于 2016-08-09T09:07:18.200 に答える