Scheme 打印变量的名称

Scheme 打印变量的名称,scheme,r6rs,Scheme,R6rs,在方案R6RS中是否可以打印变量的名称?我的意思是: (define (f) (lambda (arg) (display ( *name* arg)))) 以便: (define my-var 3) (f my-var) ; => displays the string "my-var") 让我们看看表达式(f my var)是如何计算的。 首先,请注意,这是一个应用程序。应用程序以某种顺序计算所有子表达式(在标准方案中,它是未定义的,但大多数方案实现使用从左到右

在方案R6RS中是否可以打印变量的名称?我的意思是:

(define (f) 
   (lambda (arg)
      (display ( *name* arg))))
以便:

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

让我们看看表达式
(f my var)
是如何计算的。 首先,请注意,这是一个应用程序。应用程序以某种顺序计算所有子表达式(在标准方案中,它是未定义的,但大多数方案实现使用从左到右)。也就是说,计算表达式f时给出的值v1表示
(lambda()(lambda(arg)(display(*name*arg))
。计算
my var
时给出的值为
3
。现在
v1
应用于
3

因此,这里的问题是,函数从未看到变量名
my var
,它只看到对其求值的结果,
3

因此,你的问题的答案必须是“不”

但可能有另一种解决方案。
您需要它做什么-调试?

让我们看看表达式
(f my var)
是如何计算的。 首先,请注意,这是一个应用程序。应用程序以某种顺序计算所有子表达式(在标准方案中,它是未定义的,但大多数方案实现使用从左到右)。也就是说,计算表达式f时给出的值v1表示
(lambda()(lambda(arg)(display(*name*arg)))
。计算
我的var
时给出值
3
。现在
v1
应用于
3

因此,这里的问题是,函数从未看到变量名
my var
,它只看到对其求值的结果,
3

因此,你的问题的答案必须是“不”

但可能有另一种解决方案。
您需要它做什么-调试?

您需要一个语法扩展(也称为宏)来防止计算:

#lang r6rs
(import (rnrs))

(define-syntax f
  (syntax-rules ()
    [(_ x) (display 'x)]))

(define my-var 3)
(f my-var)
输出

my-var
Racket的宏扩展器显示了转换的效果:

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

要获得相同的结果;-)

您需要一个语法扩展(也称为宏)来防止计算:

#lang r6rs
(import (rnrs))

(define-syntax f
  (syntax-rules ()
    [(_ x) (display 'x)]))

(define my-var 3)
(f my-var)
输出

my-var
Racket的宏扩展器显示了转换的效果:

(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)
为了得到相同的结果;-)