0

4 つのモジュール:

  1. ライブラリ関数を定義します
  2. ライブラリ関数を使用するライブラリ マクロを定義します。
  3. ライブラリ マクロを使用するアプリケーション関数を定義します
  4. 他の 3 つをロードします。

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 has##define-macroおよび##namespacewhich は関連する可能性がありますが、どこにも文書化されておらず、Google で検索できません。多くのスキーム間で移植可能な大きなライブラリである Meroon で私が見つけたものの 1 つは、Gambit-C を回避するためのこのコードです。

編集: Meroon の作者である Christian Queinnec は、この問題をうまく処理していたと思います。彼は、Scheme のモジュールについて私が知っている 23 のことを書きました。フランス語とスキームの両方を話せば、すべての答えが得られるような気がします。

編集 2 : 移植しようとしているシステムを実行するために構築された元のスキームを調べました。彼らはだますことがわかりました。から呼び出されるすべての「関数」にはdefine-macro、マクロ グローバル名前空間に関連付けられた C のシャドウ実装があります。Gambit-C は非常に C 指向であるため、Gambit-C でコピーできるトリックかもしれませんが、その可能性はまだ調査中です。

define構文ケースを使用してマクロから通常の d 関数を呼び出すことができるかどうかはわかりません。私はそれについて理解しやすいものを見つけることができません (ほとんどのドキュメンテーションは Phds によって、そして Phds のために書かれているようです) が、マクロとして任意の関数を実装できることを示す非常に興味深いチュートリアルがdefine-syntaxあります。syntax-caseマクロで基本的な Lisp を実装することさえできます。それは何かです。単なるエキセントリックのための JRM の構文規則入門

編集 3 : @GoZonerのように、少なくとも Racket ではfor-syntaxandを使用してこれを行うことができます。define-syntaxGambit-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 標準のものと比較して非常に劣ったマクロ システムです。

ステップ 1 として理解するには、R5RS、R6RS、または R7RS をsyntax-rules参照してください。その後syntax-case、R6RS では他のことを行うことができます。

于 2014-01-13T15:30:23.650 に答える