打印变量的名称

时间:2012-05-30 08:16:19

标签: scheme r6rs

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

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

这样:

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

2 个答案:

答案 0 :(得分:5)

你需要一个句法扩展(a.k.a.宏)来阻止评估:

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

得到相同的结果; - )

答案 1 :(得分:1)

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

所以这里的问题是函数永远不会看到变量名my-var,它只能看到评估它的结果3

因此,您的问题的答案必须是“否”。

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