首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Gambit-C方案中定义-宏命名空间

在Gambit-C方案中定义-宏命名空间
EN

Stack Overflow用户
提问于 2014-01-13 15:11:38
回答 1查看 965关注 0票数 0

四个模块:

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

libfunc.scm:

代码语言:javascript
复制
(define (my-func ls) ...)

libmacro.scm:

代码语言:javascript
复制
(define-macro (my-macro ls) (define mfls (my-func ls)) `...

libapp.scm

代码语言:javascript
复制
(define app (begin (my-macro '(1 2 3 ...

libmain.scm

代码语言:javascript
复制
(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-syntaxsyntax-case的非常有趣的教程,它表明您可以将任何函数实现为宏。它甚至在宏中实现了基本的Lisp。所以这是有意义的。JRM的句法规则入门仅仅是为古怪的人

编辑3:Like @GoZoner说这可以用for-syntaxdefine-syntax来完成,至少在球拍中是这样的。它是否能在Gambit-C中工作还有待观察。

代码语言:javascript
复制
#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不知道。

EN

回答 1

Stack Overflow用户

发布于 2014-01-13 15:30:23

当“新计划”时,坚持“计划”。语法形式‘定义-宏’不是任何Scheme标准的一部分,从您给出的示例来看,它是一个与Scheme标准中的宏系统相比非常差的宏系统。

看看R5RS,R6RS或R7RS,把syntax-rules理解为你的第一步。在那之后,R6RS中的syntax-case让你做其他事情。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21094645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档