zoukankan      html  css  js  c++  java
  • 用syntaxrules实现definemacro(defmacro)

    scheme目前其实有至少三套宏系统:

    1. 完全hygiene的syntax-rules(define-syntax)
    2. 可以hygiene也可以dirty的syntax-case(define-syntax)
    3. 逐步被淘汰的lisp传统宏系统define-macro(有些实现里叫defmacro)
    syntax-rules的能力是受限的,不能引入新的syntax-object,只能写一些简单的宏.但是用syntax-rules写出来的宏肯定比用syntax-case或define-macro写的更优雅.

     syntax-case完全不受限制,扩展能力与传统lisp宏(defmacro)是一样的,但由于它自带模式匹配功能,所以写起来会更方便,至少quasiquote,unquote,unquote-splicing少了很多.

    因为syntax-case的强大能力,用它来实现define-syntax 也是很简单滴:


    (define-syntax define-macro
      (lambda (x)
        (syntax-case x ()
          ((define-macro (name . params) body1 body2 ...)
           #'(define-macro name (lambda params body1 body2 ...)))
          ((define-macro name expander)
           #'(define-syntax name
               (lambda (x)
                 (syntax-case x ()
                   [(name . args) ;(_ . args) more hygiene!!
                    (datum->syntax #'name (apply expander (syntax->datum #'args)))]))))))) 

    以上代码证明了scheme的清洁宏系统至少和传统lisp宏系统一样强大.

    那么,能不能用非清洁宏系统来实现清洁宏呢?这篇文章有介绍:Hygiene for the Unhygienic

  • 相关阅读:
    part11-1 Python图形界面编程(Python GUI库介绍、Tkinter 组件介绍、布局管理器、事件处理)
    part10-3 Python常见模块(正则表达式)
    Cyclic Nacklace HDU
    模拟题 Right turn SCU
    状态DP Doing Homework HDU
    Dp Milking Time POJ
    区间DP Treats for the Cows POJ
    DP Help Jimmy POJ
    Dales and Hills Gym
    Kids and Prizes Gym
  • 原文地址:https://www.cnblogs.com/GodWroteinlisp/p/2420426.html
Copyright © 2011-2022 走看看