Gambit-C Scheme中的define-macro命名空间

时间:2014-01-13 15:11:38

标签: scheme gambit

四个模块:

  1. 定义库函数
  2. 定义使用库函数的库宏
  3. 定义使用库宏的应用程序函数
  4. 加载其他三个
  5. 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-syntaxsyntax-case上有一个非常有趣的教程,它表明你可以实现任何作为一个宏。它甚至在宏中实现了一个基本的Lisp。这就是事情。 JRM's Syntax-rules Primer for the Merely Eccentric

    编辑3 :与@GoZoner一样,这可以使用for-syntaxdefine-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没有。

1 个答案:

答案 0 :(得分:1)

当'刚接触计划'时,坚持使用Scheme。句法形式'define-macro'不是任何Scheme标准的一部分,并且从你给出的例子来看,与Scheme标准相比,它是一个非常低劣的宏系统。

请查看R5RS,R6RS或R7RS以了解syntax-rules作为您的第1步。之后,R6RS中的syntax-case允许您执行其他操作。