四个模块:
libfunc.scm:
(define (my-func ls) ...)
libmacro.scm:
(define-macro (my-macro ls) (define mfls (my-func ls)) `...
libapp.scm
(define app (begin (my-macro '(1 2 3 ...
libmain.scm
(load "libfunc.scm")
(load "libmacro.scm")
(load "libapp.scm")
(define (main . args) (app ...
从其他方案移植到Gambit-C,而不是。我开始认为这是不可能的。 Gambit-C有##define-macro
和##namespace
这可能是相关的,但无法记录并且无法转录。我在Meroon中找到的一件事,就是可以在许多方案中移植的大型库,这个代码用于解决Gambit-C问题。
编辑:我认为Meroon的作者Christian Queinnec对这些问题有很好的处理。他写了23 things I know about modules for Scheme。我觉得如果我说法语和Scheme会给我所有的答案。
编辑2 :我看了一下最初的Scheme,它是为了运行我想要移植的系统而设计的。事实证明他们作弊。从define-macro
调用的每个“函数”在C中都有一个阴影实现,它附加到宏全局命名空间。这可能是我可以在Gambit-C中复制的一个技巧,因为它非常注重C,但我仍在研究这种可能性。
我不知道是否可以使用语法大小写从宏调用define
d函数。我找不到任何易于理解的东西(大多数文档似乎是由phds编写的)但是define-syntax
和syntax-case
上有一个非常有趣的教程,它表明你可以实现任何作为一个宏。它甚至在宏中实现了一个基本的Lisp。这就是事情。 JRM's Syntax-rules Primer for the Merely Eccentric
编辑3 :与@GoZoner一样,这可以使用for-syntax
和define-syntax
完成,至少在Racket中。如果它可以在Gambit-C中起作用还有待观察
#lang racket
(require srfi/1)
(require (for-syntax srfi/1))
(require (for-syntax syntax/stx))
(define-syntax (fnodup x)
(define mydat (delete-duplicates (syntax->datum x)))
(syntax-case mydat ()
[(fnodup f) #'(f) ]
[(fnodup f x0) #'(f x0) ]
[(fnodup f x0 ...) #'(f '(x0 ...)) ]
))
(fnodup print "hi" "der" "hi")
(require (for-syntax ...
是神奇发生的地方。球拍有它。 Gambit-C没有。
答案 0 :(得分:1)
当'刚接触计划'时,坚持使用Scheme。句法形式'define-macro'不是任何Scheme标准的一部分,并且从你给出的例子来看,与Scheme标准相比,它是一个非常低劣的宏系统。
请查看R5RS,R6RS或R7RS以了解syntax-rules
作为您的第1步。之后,R6RS中的syntax-case
允许您执行其他操作。