四个模块:
- 定义库函数
- 定义使用库函数的库宏
- 定义使用库宏的应用程序函数
- 加载其他三个
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 很好地处理了这些问题。他写了我所知道的关于 Scheme 模块的 23 件事。我觉得如果我同时说法语和 Scheme,它会给我所有的答案。
编辑 2:我查看了原始方案,该方案几乎是为运行我要移植的系统而构建的。事实证明他们作弊。从 a 调用的每个“函数”define-macro
在 C 中都有一个影子实现,它附加到宏全局命名空间。这可能是我可以在 Gambit-C 中复制的一个技巧,因为它非常面向 C,但我仍在研究这种可能性。
我不知道是否可以define
使用语法大小写从宏中正常调用 d 函数。我找不到任何易于理解的内容(大多数文档似乎是由 phds 编写并为 phds 编写的),但是有一个非常有趣的教程define-syntax
,syntax-case
它表明您可以将任何函数实现为宏。它甚至在宏中实现了一个基本的 Lisp。所以这是一些事情。JRM 的语法规则入门
编辑 3:就像@GoZoner 所说,这可以使用for-syntax
and来完成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 没有。