Scheme

継続パズルyin-yangの回答

Shiroさんに教えてもらったyin-yang puzzleの回答。課題のプログラムは次の通りです。 (let* ([yin ((lambda (foo) (newline) foo) (call/cc (lambda (bar) bar)))] [yang ((lambda (foo) (write-char #\*) foo) (call/cc (lambda (bar) bar)))]) (yin yang)…

第一級の継続とローカル名前環境の変更は相性悪い

限定継続であれ、無限定の継続であれ、第一級の継続と、ローカル名前環境の変更は相性が悪い、ということに気づきました。お酒を飲んだのでたぶん思考がゆるいですが、だらだら書きます。 名前環境の変更 たとえば次のRubyプログラムは、「x = 1」によってロ…

限定継続 (delimited continuation) の動作を理解する

限定継続のオペレータであるshift/resetおよびcontrol/promptについて、その動作が腑に落ちたので、以下にまとめます。 継続とは 継続とは、呼び出されると「この後の計算」を実行する関数です。Schemeにはcall/ccという関数が存在し、プログラムの任意の箇…

いろんな言葉で竹内関数

Kink #!/usr/bin/env kink &tak = { ( &X &Y &Z ) ( X <= Y ).then { Y } { tak( tak( X - 1 Y Z ) tak( Y - 1 Z X ) tak( Z - 1 X Y ) ) } } [ &X &Y &Z ] = ARGS.map { __.int } &TAK = tak( X Y Z ) print_line: format: 'tak( #X #Y #Z ) = #TAK' Scheme…