2012-05-30 141 views
1

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

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

这样的:

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

回答

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) 

得到相同的结果;-)

1

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

所以这里的问题是,函数从来没有看到变量名称my-var,它只能看到它的评估结果,3

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

但它可能有一个替代解决方案。 你需要什么 - 调试?