1

スキームR6RSで変数の名前を出力することは可能ですか?つまり:

(define (f) 
   (lambda (arg)
      (display ( *name* arg))))

そのような:

(define my-var 3)
(f my-var) ; => displays the string "my-var")
4

2 に答える 2

5

評価を防ぐには、構文拡張(別名マクロ)が必要です。

#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)

同じ結果を得るには;-)

于 2012-05-30T13:48:04.003 に答える
1

(f my-var)式がどのように評価されるかを見てみましょう。まず、それがアプリケーションであることに注意してください。アプリケーションは、すべての部分式をある順序で評価します(標準のスキームでは定義されていませんが、ほとんどのスキームの実装では左から右に使用されます)。つまり、式fが評価され、を表す値v1が得られ(lambda () (lambda (arg) (display (*name* arg)))ます。はmy-var、値を与えて評価されます3。今v1はに適用され3ます。

したがって、ここでの問題は、関数が変数名my-varを認識せず、それを評価した結果のみを認識していることです3

したがって、あなたの質問に対する答えは「いいえ」でなければなりません。

しかし、別の解決策があるかもしれません。何のためにそれが必要でしたか-デバッグ?

于 2012-05-30T13:37:57.383 に答える