【发布时间】:2017-01-10 08:32:51
【问题描述】:
-
关于卫生宏
我不完全了解卫生宏的工作原理。这是两个例子。
第一个是:
#lang racket
(define-syntax (g stx)
(syntax-case stx ()
([_ arg]
#'(display arg))))
(let ([display 1])
(g 3))
这很好,但这个:
#lang racket
(define-syntax (g stx)
(syntax-case stx ()
([_ arg]
#'(display arg))))
(define display 1)
(g 3)
会引发异常。如何解释这两种情况的区别?
-
如何定义这样的宏
我想定义一个宏来允许在球拍中使用匿名递归函数。 这个不起作用,因为模块中没有定义 recur:
#lang racket
(define Z
(λ(recur)
((λ(x) (recur (λ(y) (x x) y)))
(λ(x) (recur (λ(y) (x x) y))))))
(define-syntax-rule (R proc)
(Z (λ(recur) proc)))
((R (λ(n)
(if [= n 1]
1
(* n (recur (- n 1)))))) 3)
如何做到这一点?
【问题讨论】:
-
这个问题如果分成两个独立的问题会更好。