だから私はSchemeが初めてです。((name: name) (args: args) (body: body)) という形式の仕様を使用してグローバル関数を定義する関数を作成しようとしていますので、たとえば
(fn-maker '((name: mult5) (x) (* x 5)))
グローバルに呼び出すことができます
(mult5 3)
そして15を取得します。
これが私がこれまでに持っているものです:
(define (fn-maker fn-spec)
(let* (spec (map cdr fn-spec))
(name (caar spec))
(args (cadr fn-spec))
(body (caaddr (cdaddr fn-spec))))
(lambda (args)
body)))
現時点で私が混乱しているのは、ラムダにこれらの引数を使用させる方法です。現状では、ラムダは args の背後にあるリストを評価する代わりに、「args」という名前の新しいローカル変数を作成します。これを回避する方法はありますか?私の現在の思考プロセスは、args によって提供されるリスト全体で何らかの形式の let を使用する必要があるということですが、それがどのように見えるか、またはそれを構造化する方法さえわかりません。
これは宿題なので、コード (不正行為など) を探しているのではなく、正しい方向へのポイントと批評を探しているのは間違いありません。ありがとうございました。
更新: 将来これに遭遇する人には、巧妙な引用を使用してこのコードを非常に簡単に実行することができます。マクロは必要ありません。また、後でわかるように、Pretty Big の eval はデフォルトでグローバルに評価されます。