打印变量的名称

Asl*_*986 1 scheme r6rs

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

use*_*lpa 5

你需要一个语法扩展(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)

得到相同的结果;-)