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

  • 相关阅读:
    Powerdesigner数据库建模--概念模型--ER图【转】
    oralce闪回
    DBA
    linux socket使用经验总结
    寒假学习笔记1:结构化程序设计
    寒假作业2:简化电梯设计elevator
    鹤发银丝映日月,丹心热血沃新花——忆三位良师
    走廊泼水节
    种树
    P2938 [USACO09FEB]股票市场Stock Market
  • 原文地址:https://www.cnblogs.com/GodWroteinlisp/p/2420426.html
Copyright © 2011-2022 走看看