在Scheme R6RS中是否可以打印变量的名称?我的意思是:
(define (f)
(lambda (arg)
(display ( *name* arg))))
Run Code Online (Sandbox Code Playgroud)
这样:
(define my-var 3)
(f my-var) ; => displays the string "my-var")
Run Code Online (Sandbox Code Playgroud)
你需要一个语法扩展(aka宏)来阻止评估:
#lang r6rs
(import (rnrs))
(define-syntax f
(syntax-rules ()
[(_ x) (display 'x)]))
(define my-var 3)
(f my-var)
Run Code Online (Sandbox Code Playgroud)
输出
my-var
Run Code Online (Sandbox Code Playgroud)
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)))
Run Code Online (Sandbox Code Playgroud)
当然,这意味着你可以简单地写
(display 'my-var)
Run Code Online (Sandbox Code Playgroud)
得到相同的结果;-)