define-syntax表支持与define的函数一样的快捷语法,因此下面的self-as-string定义等同于显式使用lambda的那个定义: > (define-syntax (self-as-string stx) (datum->syntax stx (format "~s" (syntax->datum stx)))) 16.2.3 混合模式和表达式:syntax-case 通过
Racket中的元编程还可以用于代码生成,帮助我们减少重复代码。例如,假设我们需要生成多个类似的函数,我们可以使用宏来简化这一过程:(define-syntax generate-functions (syntax-rules ()((_ name1 name2)(begin (define (name1 x) (+ x 1))(define (name2 x) (* x 2)))使用generate-functions宏,我们可...
(define-syntax-rule (1-arg-lambda (x) expr) (lambda (x) expr)) (define-syntax-rule (1-arg-app e1 e2) (#%app e1 e2)) (define-syntax-rule (1-form-module-begin e) (#%module-begin e)) (define-syntax (no-literals stx) (raise-syntax-error #f "no" stx)) (define-syntax-rule...
Optional: Tokenization, Parenthesization, and Scope Optional: Racket Macros With define-syntax Optional: Variables, Macros, and Hygiene Optional: More Macro Examples 基本上是与Macro的概念剖析、定义语法和实现示例相关。虽然Racket的Macro是一种非常强大且有效的特性(感觉和C的宏类似),但由于没有怎么用到,以及...
但这个实际是是不 work 的。如果流比较大或者是无限流,几乎一定会导致无限递归、内存溢出。解决的办法参考了 stack overflow 上一个答案,利用 Racket 的 define-syntax 语法定义宏。其实和 Common Lisp 里宏有点接近,只是定义时使用的语法有差异,用到方括号,详见代码。
(define-syntax-rule(swap!xy); !表示会修改 (let([tmpx]) (set!xy) (set!ytmp))) (definetmp2) (defineother3) (swap!tmpother) (printf"tmp = ~a; other = ~a\n"tmpother) ;; 变量 `tmp` 被重命名为 `tmp_1` ;; 避免名字冲突 ...
(define-syntax-rule (swap! x y) ; !表示会修改 (let ([tmp x]) (set! x y) (set! y tmp))) (define tmp 2) (define other 3) (swap! tmp other) (printf "tmp = ~a; other = ~a\n" tmp other) ;; 变量 `tmp` 被重命名为 `tmp_1` ...
Syntax and Parentheses Parentheses Matter! (Debugging Practice) Dynamic Typing Cond Local Bindings (1)首先是let关键词。其语法是 (2)其次是let*表达式,语法与let相同,但特性不同 (3)然后是letrec 表达式,语法仍然与let相同 (4)Local define Toplevel Bindings ...
和-1+ 作为运营商。而且,我也尝试了1+ 和incf ,但没有用。 它们没有定义,因为方案和球拍试图避免突变;但是您可以轻松地自己定义它们: decf (define-syntax incf (syntax-rules () ((_ x) (begin (set! x (+ x 1)) x)) ((_ x n) (begin (set! x (+ x n)) x))) (define-syntax decf...
Racket图文教程