< ピアノレッスン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