0

四个模块:

  1. 定义库函数
  2. 定义使用库函数的库宏
  3. 定义使用库宏的应用程序函数
  4. 加载其他三个

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-syntaxsyntax-case它表明您可以将任何函数实现为宏。它甚至在宏中实现了一个基本的 Lisp。所以这是一些事情。JRM 的语法规则入门

编辑 3:就像@GoZoner 所说,这可以使用for-syntaxand来完成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 没有。

4

1 回答 1

2

如果是“Scheme 新手”,请坚持使用 Scheme。语法形式'define-macro'不是任何Scheme标准的一部分,并且从您给出的示例中,与Scheme标准中的相比,它是一个非常劣质的宏系统。

查看 R5RS、R6RS 或 R7RSsyntax-rules作为您的第 1 步。之后syntax-case在 R6RS 中可以让您做其他事情。

于 2014-01-13T15:30:23.650 回答