スキームR6RSで変数の名前を出力することは可能ですか?つまり:
(define (f)
(lambda (arg)
(display ( *name* arg))))
そのような:
(define my-var 3)
(f my-var) ; => displays the string "my-var")
評価を防ぐには、構文拡張(別名マクロ)が必要です。
#lang r6rs
(import (rnrs))
(define-syntax f
(syntax-rules ()
[(_ x) (display 'x)]))
(define my-var 3)
(f my-var)
出力
my-var
ラケットのマクロエキスパンダーは、変換の効果を示しています。
(module anonymous-module r6rs
(#%module-begin
(import (rnrs))
(define-syntax f (syntax-rules () [(_ x) (display 'x)]))
(define my-var 3)
(f my-var)))
-> [Macro transformation]
(module anonymous-module r6rs
(#%module-begin
(import (rnrs))
(define-syntax f (syntax-rules () [(_ x) (display 'x)]))
(define my-var 3)
(display 'my-var)))
もちろん、これは単に書くことができることを意味します
(display 'my-var)
同じ結果を得るには;-)
(f my-var)
式がどのように評価されるかを見てみましょう。まず、それがアプリケーションであることに注意してください。アプリケーションは、すべての部分式をある順序で評価します(標準のスキームでは定義されていませんが、ほとんどのスキームの実装では左から右に使用されます)。つまり、式fが評価され、を表す値v1が得られ(lambda () (lambda (arg) (display (*name* arg)))
ます。はmy-var
、値を与えて評価されます3
。今v1
はに適用され3
ます。
したがって、ここでの問題は、関数が変数名my-var
を認識せず、それを評価した結果のみを認識していることです3
。
したがって、あなたの質問に対する答えは「いいえ」でなければなりません。
しかし、別の解決策があるかもしれません。何のためにそれが必要でしたか-デバッグ?