syntax-case是 define-syntax里面的另一种形式。 Kent Dybvig是 syntax-case的主要支持者,他有一个使用...
对于syntax-rules(),The Scheme Programming Language 上面是这样描述的:While it is much less expressive than syntax-case, it is sufficient for defining many common syntactic extension。也就是说,它的表达能力是远弱于 syntax-case 的。syntax-case 在 r6rs 是标准实现所要求的,但是在 r7rs small 中被废除...
syntax-rules的能力是受限的,不能引入新的syntax-object,只能写一些简单的宏.但是用syntax-rules写出来的宏肯定比用syntax-case或define-macro写的更优雅. syntax-case完全不受限制,扩展能力与传统lisp宏(defmacro)是一样的,但由于它自带模式匹配功能,所以写起来会更方便,至少quasiquote,unquote,unquote-splicing少了很...
可以hygiene也可以dirty的syntax-case(define-syntax) 逐步被淘汰的lisp传统宏系统define-macro(有些实现里叫defmacro) syntax-rules的能力是受限的,不能引入新的syntax-object,只能写一些简单的宏.但是用syntax-rules写出来的宏肯定比用syntax-case或define-macro写的更优雅. syntax-case完全不受限制,扩展能力与传统lis...
(syntax-case x () [(c ((Q (r w L/R ->Q)...)...)) #`(lambda (configuration) (let ([state (get-state configuration)] [tape (get-tape configuration)] [pos (get-position configuration)]) (letrec ([show-configuration (lambda() (for-each display (list tape pos""state"\n"))...
) (with-syntax ([break (datum->syntax #'k 'break)]) #'(call/cc (lambda (break) (let f () e ... (f)))]))) 当然,上面的代码重点在于 call/cc 的使用而不是 syntax-case 的使用。上面的代码添加了 break 语句,可以直接退出循环。下面的例子可以说明这一点: (let ([n 3] [ls '()]...
syntax-case scheme也提供了比syntax-rules更细粒度的语法控制能力(为什么这么说?), 其形式如下: (define-syntax some-macro (lambda (syntax-form) (syntax-casesyntax-form () [(_pattern ...) <fender> <expr> ... ] ... ) ) ) 关于fender的概念(不过这里没有用到): ...
(syntax-case x (parameters) [(_ x (parameters [param val ...] ...) e ...) #'(let f ([p* (list param ...)] [v** (list (list val ...) ...)]) (if (null? p*) (mat x e ...) (let ([p (car p*)])
(syntax-case x () [(_ () b1 b2 ...) #'(let () b1 b2 ...)] [(_ ((x e) ...) b1 b2 ...) (andmap identifier? #'(x ...)) (with-syntax ([(y ...) (generate-temporaries #'(x ...))]) #'(let ([y e] ...) ...
(rnrs syntax-case (6)) (rnrs hashtables (6)) (rnrs enums (6)) (rnrs eval(6)) (rnrs mutable-pairs (6)) (rnrs mutable-strings (6)) (rnrs r5rs (6))) (display (find even? '(3 1 4 1 5 9))) (newline) (display "Hello\n") ...