Macros 使用宏创建新标识符

Macros 使用宏创建新标识符,macros,scheme,r5rs,Macros,Scheme,R5rs,我想要一个宏来创建一个新的标识符,比如 (new-name first second) => first-second 可以用来定义新的顶级绑定 (define-syntax define-generic (syntax-rules () ((define-generic (name a b ...)) (begin (define (new-name name data) 15) ; <= create a new binding

我想要一个宏来创建一个新的标识符,比如

(new-name first second) => first-second
可以用来定义新的顶级绑定

(define-syntax define-generic 
  (syntax-rules ()
    ((define-generic (name a b ...))
     (begin
       (define (new-name name data) 15)      ; <= create a new binding
       (define name (lambda (a b ...)
         (add (new-name name-data) 7))))))   ; <= use new identifier
(定义语法定义泛型
(语法规则()
((定义泛型(名称a b…)
(开始

(define(new name data)15);在纯R5RS中无法做到这一点。幸运的是,除了有限的R5RS之外,大多数流行的Scheme实现都提供了合适的宏系统:


(定义宏(新名称a b)(字符串->符号(字符串附加(符号->字符串a)”-“(符号->字符串b)))
几天前就有一个关于Reddit的讨论。可能值得研究发布的实现,以了解更多详细信息-

-1“正确的宏系统”巨魔。不卫生的宏是非常有问题的,对Scheme来说更是如此,因为Scheme是一个没有符号包的Lisp-1,不像普通的Lisp。这是一场古老的圣战。我个人讨厌卫生的宏。它们是有限的。它们很愚蠢。我可以很容易地在一个适当的基础上实现卫生系统(来吧,给我另一个-1),基本宏系统,但您不能在卫生系统之上实现基本系统。请参见此处的适当宏系统的可能示例:我在Gambit-C中尝试过这一点,但(定义(新名称a b)5)不起作用(在不同的变体中)@knivil,它不适用于define、let、let*、letrec等-仅适用于需要表达式的情况。您需要定义一个transformer宏才能使其工作。如果您详细说明为什么需要这样的东西,这会有所帮助。您读过这篇文章吗?它可能很难看,但我认为您可能会对您看到的一些事情感到惊讶可以使用卫生宏…你想做什么?可能有更好的方法。很难描述:我正在使用chicken scheme,并实现了一个类似于coops的oop系统(只是更简单)。可以用附加数据修饰过程(扩展过程)。我希望通过使用define创建新的绑定名称数据(其中名称是过程名称)来模拟Gambit-C中的情况。如果用户创建新的通用过程,则应根据给定名称定义两个新绑定,一个新过程和一个过程数据绑定。