球拍的repl如何评估这些引用的表达式?

时间:2015-05-28 11:20:31

标签: scheme racket

对于以下输入,我无法理解球拍的REPL行为:

> 1     ;; Simple, 1 is self-evaluating
1
> '1    ;; (quote x) => x
1
> ''1   ;; ?? I expected '1
''1
> '''1  ;; ???
'''1

我尝试编写一个简单的宏来测试:

#lang racket

(define-syntax e
  (syntax-rules ()
    ((e x) (display (eval x )))))

但它也给了我意想不到的输出:

> (e 1)     ;;Self evaluating 
1
> (e '1)    ;;Evaluated '1 as 1
1
> (e ''1)   ;;Shouldn't ''1 have been evaluated only once to '1?
1
> (e '''1)
'1

那么racket的repl做了多少额外的步骤,为什么我的宏不像我预期的那样工作?

1 个答案:

答案 0 :(得分:5)

这与Racket打印机的默认行为有关(REPL用于输出;它与display不同)。运行此,然后再试一次:

(print-as-expression #f)

至于(eval ''1),这与''1(quote (quote 1))相同,后者评估为(quote 1),传递给{{1}时然后导致1。