Island Life

< ピアノレッスン4回目 | 忘れた頃に >

2011/05/29

Schemeでgoto (tagbody&go)

なんか聞こえてきた

http://twitter.com/bugyo/statuses/74784105946038272

@bugyo なんで Scheme には goto がないんだ! 何もできない!

のでやってみた。Lispの伝統にしたがい、gotoではなくgoを使う。 そしてラベルのスコープを決めるのにtagbodyを使う。

思ったより複雑になっちゃった。もうちょっと簡単にできないかな。

最初は、各ラベルをthunkにして、goはそのラベルを呼び出した後に tagbodyからexitすればいいや、と思ってたんだけど、それだと(go loop:) でループするような場合にgoが末尾呼び出しにならないので、ループしてるだけで スタックを消費してしまう。 goを末尾呼び出しにするために、結局トランポリンを使った。

というかlequeさんが2年も前にやっておられたわい。(でもこれだとgoto labelのlabelの呼び出しが末尾呼び出しじゃないので、ループでスタック消費問題があるような…)

Tags: Programming, Lisp, Scheme, Gauche

Post a comment

Name: