#キーワード引数の自動インデント、書いてみました。 https://gist.github.com/gengar/4e469cc407f83547232093c48e35c6fa stateに外側の開き括弧の開始位置が全部保存されていたので、思ったよりすんなりできました。デバッグはまだ甘いです。あとlisp-localとの共存にはまだ未知の部分があります。major modeに組み込めば大丈夫だろうと期待しているのですが、お試しで (setq-local lisp-indent-function 'gauche-mode-indent-function) などとするとlisp-localは忘れ去られます。 #(define-constant ((foo x) y) x) はOKで (define-inline ((foo x) y) x) はNGなんですね。
#キーワード自動インデント<おお、自分はquack使っててgauche-modeは使って無いんですが、試してみます。
#define-inlineのそれは多分深く考えて無かったと思うのだけれど、define-inlineには束縛を作るというのと手続きにインライン情報を付加するという2つの操作があるからちょっとややこしい。でもできなくはないかな?
##高階defineに対応しました。
#major modeが他のindent functionを提供している場合は、scheme-indent-functionの所をそれに置き換えた方が良さそうです。
#gosh> (format "~f" 0.0001)
"1.0e-4"
#これって意図通りですか?CLのは "0.0001" になるっぽいですが
##カジュアルに小数表示する方法が欲しいですね
#そうですね。ScmNumberFormatのデフォルト値を変えるのが手軽かなあ。
#format の ~f はexponential notation無しで表示せよという指示子なんだと思ってました。printf の %f もそんな感じですよね。
#まだ~eを実装してないのでかりそめの動作ではあるんですが、この際ちゃんと実装するかなあ。
#一応CLでも、~fも桁数指定がなくてmagnitudeがうんと大きかったり小さかったりした場合はexponential notationにフォールバックして良いことになってはいる
#~fの動作をCommon Lispに合わせて (指数表示にしない)、~eをサポートした。但し~eはもっとテストが必要。
#:1+:
#Hello, how can I do non-blocking IO with gauche?
#@noob Low-level fcntl() call is exposed and you can set O_NONBLOCK. However, we don't have a specific support of nonblocking I/O yet (except sys-accept, which returns #f immediately if the listening socket is nonblocking mode), I believe. That is, you should handle EAGAIN by yourself. It's just that we haven't had a use case for that---if there's a demand, we can add support.
#;; compose に渡すと arity が死んでしまう問題
gosh> (define (const x y) x)
const
gosh> (arity const)
2
gosh> (arity (.$ values const))
#<arity-at-least 0>
##シグネチャを取り出せればそれを eval すれば良さそうなんですが、<procedure> の info スロットがどのような値を取り得るかって特に保証はないですよね。
#case-lambda とか適用可能オブジェクトとかあるから思ったより面倒かな、arity的な情報を保存する compose
#コンパイラがstaticにカタをつけられる方向で頑張るべきか…?
#(話がとっ散らかってしまいますが)…というのを、(g (f x)) で (f x) が #f のときに短絡するやつが欲しいなあと思って、composeの#f短絡版があればいいかなと考えていたときに思いました。srfi.197の chain-and はちょっとだるい気がしまして。で、考えていたら思い付いたのが、$ を拡張して ($ g $? f x) で短絡できるようにするといいんじゃないかと。JSの ?. やRubyの &. からの着想です。
#$? があると #f が来た時に$式全体が短絡すればいいと考えていましたが、この挙動だと途中までの短絡をしたい場合に ($ h ($ g $? f x)) みたいにネストする必要が出てきますね(折角のネストキラー(?)なのに)。逆に直近だけ短絡するなら、全部短絡したい場合は ($ h $? g $? f x) と書かせるか。
#このような複雑さを、現状のシンプルな $ に持ち込んでよいものか。
#別に用意するなら (?$ h $ g $? f x) とか?暗号めいてきた気がしないでもないですが。$? が $? なのは $* に揃えてます。先頭の ?$ は、$? だと述語っぽくなっちゃうので。
#(1)arityについては、なるべくそういうメタな情報を実行時にも保存してゆく方向で考えてます。Schemeの慣習として不定長引数で受けてapplyする、というのが書かれることは防げないので、あくまで出来る範囲で、ってことですが。静的にやるのはSchemeでは難しいですね。
#(2)ショートカットはあっても良いですが、ありと無しを混ぜるのはぱっと見わかりづらそう。and-let* やchain-andのように、ショートカットやるなら全部、混ぜたければカッコ使って、ってのでも良いように思います。
#「手続きをショートカット手続きに変える」手続きがあれば良い気もしてきた。
(?$ proc) == (^x (and x (proc x))
(?$ proc arg) == (and arg (proc arg))