#gosh> (define-method describe () (describe *1))
#<generic describe (6)>
gosh> (d)
#<generic describe (6)> is an instance of class <generic>
#ってどうでしょう。今出てきた値をdescribeしたいってきっと頻出パターンだと思ったので。
#HEADならプロンプトで ,d と打つと直前の値がdescribeされます。
#関数版もあってもいいかもしれませんが、*1を使ってるとほぼREPL専用になっちゃうので、top-level commandがあるなら関数版はいらないかなと思ったんだけどどうだろう。
#ていうか既に無引数版のdescribeは定義済みであった。
#なん…だと…
#じゃなくて、もう入っていたとは流石です!やはり私はもっとHEADを追いかけるべきですね。
#独立して複数人が思いつくなら妥当性が高いと考えられるので、情報を寄せてもらえるのはありがたいです。
#このトップレベルコマンドの引数って read じゃなくて read-line で読まれちゃうんですね。,d (list 42) と書けるのを期待してしまいます。
#そこはまだ迷ってます。
#あ、でもread系を使うとしても評価はされないので、 ,d (list 42) は (d '(list 42)) 相当になるとは思いますが。
#いや、そんなことないか。コマンドによって評価したりしなかったりするんだよな。
#(というか、トップレベルコマンドリーダが一種のマクロとして動作しているので、コマンドリーダ内で処理しちゃう場合は評価なし、コマンドリーダがフォームを作ってreplのevalに渡される場合は評価される場合がある)
#read-line で読む場合、空白のエスケープが必要になり、エスケープのエスケープが必要になり、ややこしい事態が発生しそうな気がします。直感的には、他の式と同じルールで読まれるほうが混乱が少ないと思います。
#それはもっともです。根本的な問題は、引数終端をどう判断するか、なんですね (現在は行末で判断)。なのでread-lineでフェッチした文字列からreadでEOFまで読む、という形でもいいかも。
#でそれを何でやってないかというと不完全なS式が来たときにどうすべきかというのを保留にしたためであったことを思い出した。選択肢としては(1)安直にエラーにしちゃう(2)complete-sexp?でチェックして終わってなかったら次の行も読み込んでread、とする、あたり
#で、complete-sexp? はreadと統合する形で書き直したいと思ってて、(2)のパスに進むとYak shavingだなあとなって止まってたんだった。
#うーむ、なるほど。現在の方法よりは、とりあえず(1)にしてしまうのが私はよいと思います。
#complete-sexp? は、ひとまず、read-from-string してunexpected eofだったら #f みたいな実装にしておくという選択肢はないでしょうか。と思ったんですが &unexpected-eof みたいなコンディションが飛んでくるわけではないのでやっぱりreadに手を入れることになるんですかね。
#readに関しては、部分readみたいなものがあるといいなあと思った記憶があります。なんだったかなあ。
#read中にEOFに当たったときに、一旦制御を戻して、続き(?)を渡して再開できれば、read-lineで読みながら式が不完全なら次の行も読む、ってのが自然にできる気がします。(raise-continuableってこういう目的で使えるんでしょうか)
#gauche.interactiveの %reader %evaluator %prompter (printerも?)が gauche.interactive:read-eval-print-loop のデフォルト値として export されていると自作REPLが作りやすいと思います。
#「read中にEOFに当たった時に制御を戻す」<
#これ、readを全部Schemeで書いとけば継続使えるので簡単なんですが、今はCで書いてあるので難しいんですよね。しかしScheme的には継続使うのが綺麗だよなあ。