1

lambdaという名前の のバージョンがlambda-r欲しいのですが、そこから ができreturnます。例:

(+ ((lambda-r ()
    (return 1)
    2)) 5)

これにより、値が得られます6。値が 7 であることを期待するかもしれませんが、2 に到達する前にラムダ式から 1 が返されるため、6 です。

これは、私が探している種類の変換の例です。次のように使用するlambda-rとします。

(lambda-r (a b)
    (return a)
    (+ a b))

私はそれを次のように変換したい:

(call/cc (lambda (k)
       (define return (lambda (v)
                        (k (lambda (a b)
                             v))))
       (lambda (a b)
         (return a)
         (+ a b))))

これは、内部定義の代わりに let 式で表現することもできますが、わかりやすくするために定義を使用しています。

上記のコードは実際には期待どおりに機能することに注意してください。問題は、マクロlambda-rとして表現するのに苦労していることです。理由は、衛生的でありたいが、衛生的でありたくないからです。kvreturn

現時点での私のマクロは次のとおりです。

(define-syntax lambda-r
  (syntax-rules (return)
    [(_ (var ...) body ...)
     (call/cc (lambda (k)
           (define return (lambda (v)
                            (k (lambda (var ...)
                                 v))))
           (lambda (var ...)
             body ...)))
     ]))

returnは衛生的に扱われ、その結果、使用時に直接見えないため、これは機能しませんlambda-r。そのため、有効な識別子(lambda-r () (return 1))ではないというエラーが表示されます。return


編集: Nathan Sanders の回答のおかげで、ここで何をしなければならないかを理解することに近づいています。ただし、次の手順を完全には理解していないため、これをまだ機能させることができていません。以下を説明するリソースについて説明/案内していただければ幸いです。

  • syntax 手順_
  • datum->syntax/syntax->datum手順_

編集:気にしないでください-私は今それを手に入れました:)

4

1 に答える 1

2

あなたが欲しいのはsyntax-caseの代わりですsyntax-rules

R6RS の定義では、いくつかの例が示されています。特に、 syntax-object と datum conversions に関するセクションがあり、これはあなたが望むものです。loopw/ breakexample をあなたの に適応させることができるはずですreturn

于 2010-07-10T22:31:46.573 に答える