racket 的 repl 如何评估这些引用的表达式?
How is racket's repl evaluating these quoted expressions?
对于以下输入,我无法完全理解球拍的 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 做了什么额外的步骤,为什么我的宏没有像我预期的那样工作?
这与 Racket 打印机的默认行为有关(它被 REPL 用于输出;它不同于 display
)。 运行这个,然后再试一次:
(print-as-expression #f)
至于 (eval ''1)
,这与 ''1
与 (quote (quote 1))
相同,计算结果为 (quote 1)
,当传递给 eval
然后结果为 1.
对于以下输入,我无法完全理解球拍的 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 做了什么额外的步骤,为什么我的宏没有像我预期的那样工作?
这与 Racket 打印机的默认行为有关(它被 REPL 用于输出;它不同于 display
)。 运行这个,然后再试一次:
(print-as-expression #f)
至于 (eval ''1)
,这与 ''1
与 (quote (quote 1))
相同,计算结果为 (quote 1)
,当传递给 eval
然后结果为 1.