ウィキペディアの継続に関する記事には次のように書かれてい
ます。
それが真実であり、その方法を知る必要があるか、それとも真実ではなく、そのステートメントを修正する必要があります.
これが本当なら、Lua で call/cc を実装する方法を教えてください。方法がわかりません。ここで
説明されているように、Lua に coroutine.clone 関数があれば、call/cc を手動で実装できると思います。
クロージャーが call/cc を実装するのに十分でない場合、他に何が必要ですか?
以下のテキストはオプションの読み物です。
PS: Lua には、コルーチン テーブルによるワンショット継続があります。coroutine.clone 関数を使用すると、それを複製して複数回呼び出すことができるため、実質的に call/cc が可能になります (call/cc を誤解していない限り)。しかし、そのクローン機能は Lua には存在しません。Lua IRC チャンネルの誰かが、Pluto ライブラリ (シリアライゼーションを実装) を使用してコルーチンをマーシャリングし、コピーしてからアンマーシャリングし、再度使用することを提案しました。それはおそらくうまくいくでしょうが、call/cc の理論的な実装と、言語が手動で実装できるようにするために必要な機能の実際の最小セットは何かを見つけることにもっと興味があります。
編集 1: OK 人々、ここで私を助けてください。Scheme をまったく知らないので、これには長い時間がかかりましたが、私たちを助ける何かを思いつきました。以下のコードを見てください。1 つ目は Scheme のプログラムで、2 つ目は同じプログラムですが Lua で作成したものです。
うまくいけば、これが私たちを助けるでしょう。私たちは非常に近いと信じています。
PS: これらの例は、CallCC に関するウィキペディアの記事の最初の例から取られています。
スキームのバージョン
(define call/cc call-with-current-continuation)
; callcc CPS-transformed (thanks to the people from the #scheme channel at freenode.net)
(define cpscallcc
(lambda (consumer k)
(let ((cc (lambda (result) (k result))))
(consumer cc k))))
; this is the continuation we will use to display the "returned" values
(define main-continuation
(lambda (result)
(display "--> ")
(display result)
(newline)))
; define f function non-CPS
(define (f return)
(return 2)
3)
; these are my past attempts at defining a CPS f function
;(define (cps-f return k)
; (k (return 2)) 3)
;(define (cps-f return k)
; (k (lambda ()
; (return 2)
; 3)))
; this is what I came up with - I'm not sure if this is correctly CPS-transformed but I believe so
(define (cps-f return k)
(return 2)
(k 3))
; call the non-CPS f function
(display (f (lambda (x) x))) ; displays 3
(newline)
; call the non-CPS f function with call/cc (I don't understand what this does)
(display (call/cc f)) ; displays 2
(newline)
; now call the CPS version of the f function
(cps-f (lambda (x) x) main-continuation) ; displays --> 3
; now call the CPS version of the f function with the CPS version of call/cc
(cpscallcc cps-f main-continuation) ; displays --> 2 but then it also displays --> 3 afterwards -> I'm not sure why it displays the 3 afterwards, as it should only display the 2 just like the non-CPS versions above
ルア版
-- callcc CPS-version
cpscallcc = function(consumer, k)
local cc = function(result)
return k(result) -- ?or k(result)
end
return consumer(cc, k) -- ?or return consumer(cc,k)
end
-- define f function non-CPS
f = function(ret)
ret(2)
return 3
end
-- define f function CPS-version (again, not sure this is correct)
cps_f = function(ret, k)
ret(2)
k(3)
end
-- call the non-CPS f function
print(f(function(x) return x end))
-- we cant call the non-CPS f function with callcc because
-- Lua doesnt have callcc, but the line below displays the correct expected output (maybe by accident)
--cpscallcc(f, print)
-- now call the CPS version of the f function
cps_f( function(x) return x end, print ) -- displays 3
; now call the CPS version of the f function with the CPS version of call/cc
cpscallcc( cps_f, print) -- displays 2 and then 3 just like the Scheme version!!
-- so apparently the translation from Scheme to Lua is correct...
私は Windows 用の DrScheme と Lua を使用しています。この 2 つは、簡単にダウンロードしてインストールできるツールで、これらを支援したいと考えている人なら誰でも使用できます。