在Scheme R6RS中可以打印变量的名称吗?我的意思是:打印变量的名称
(define (f)
(lambda (arg)
(display (*name* arg))))
这样的:
(define my-var 3)
(f my-var) ; => displays the string "my-var")
在Scheme 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)
如何进行评估。首先,请注意这是一个应用程序。应用程序以某种顺序评估所有子表达式(在标准Scheme中未定义,但大多数Scheme实现使用从左到右)。这就是表达式f被评估给出代表(lambda() (lambda (arg) (display (*name* arg)))
的值v1。评估my-var
的值为3
。现在v1
适用于3
。
所以这里的问题是,函数从来没有看到变量名称my-var
,它只能看到它的评估结果,3
。
因此,您的问题的答案必须是“否”。
但它可能有一个替代解决方案。 你需要什么 - 调试?