四个模块:
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的作者克里斯蒂安·奎因内克在这些问题上处理得很好。他写了23件我知道的关于计划模块的事情。我觉得,如果我既会说法语,又会说计划,那就会给我所有的答案。
编辑2:我看了一下最初的方案,它是为运行我正在尝试移植的系统而构建的。结果发现他们作弊了。从define-macro调用的每个“函数”在C中都有一个影子实现,该实现附加到宏全局命名空间。这可能是一个技巧,我可以复制在Gambit-C,因为它是非常面向C,但我仍在研究的可能性。
我不知道是否可以使用语法用例从宏调用通常的defined函数。我找不到任何容易理解的东西(大多数文档似乎都是由博士编写的),但是有一个关于define-syntax和syntax-case的非常有趣的教程,它表明您可以将任何函数实现为宏。它甚至在宏中实现了基本的Lisp。所以这是有意义的。JRM的句法规则入门仅仅是为古怪的人
编辑3:Like @GoZoner说这可以用for-syntax和define-syntax来完成,至少在球拍中是这样的。它是否能在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 ...是魔法发生的地方。球拍拿到了。游戏-C不知道。
发布于 2014-01-13 15:30:23
当“新计划”时,坚持“计划”。语法形式‘定义-宏’不是任何Scheme标准的一部分,从您给出的示例来看,它是一个与Scheme标准中的宏系统相比非常差的宏系统。
看看R5RS,R6RS或R7RS,把syntax-rules理解为你的第一步。在那之后,R6RS中的syntax-case让你做其他事情。
https://stackoverflow.com/questions/21094645
复制相似问题