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
として表現するのに苦労していることです。理由は、衛生的でありたいが、衛生的でありたくないからです。k
v
return
現時点での私のマクロは次のとおりです。
(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
手順_
編集:気にしないでください-私は今それを手に入れました:)