Gauche > Archives > 2019/09/06

2019/09/06 08:40:33 UTCshiro
#
確かに束縛部を全部括弧でくくるとand-let*とかと同じにはなるなあ。束縛をただ並べて最後だけ普通の式、っていうのはsrfi-42と同じなんだけれども。and-let*式だと括弧が多くなるので嫌ったんだったか。
2019/09/06 08:54:02 UTCshiro
#
あと$doっていう名前、Haskellのdoから来てるって知識がないとなんでdoなのかわからんってのもありそう。Scheme的にやるなら$let*とかの方がいいかもしれん。
2019/09/06 09:09:20 UTC齊藤
#
ああ~。 まさに私が以前に持った感想ですね。 https://twitter.com/SaitoAtsushi/status/1011316206786134017
2019/09/06 09:47:57 UTCkaki
#
srfi-42も括弧が少ないのは好きじゃないですね。そこに構造があるなら括弧で括るべきだと思います。自分だったら、Haskellのdoを持ってくるって考えてもand-let*式の括弧の使い方にします。
2019/09/06 09:58:57 UTCshiro
#
今の$doは2つ目以降のparser式が実行時まで評価されないっていう形になってて、そうするとparserの中でその前に読み出して束縛した値が使えるんだけども、速度的には実行の度にクロージャを作るので不利。以前はparseを全て先に評価するバージョンとそうでないバージョンがあって$doと$do*だったかな、使い分けてた。でも$do*って何するのか名前からわからないんでやめた。んだけども、$letと$let*にして構文もlet形式にしたらいいのかも。
2019/09/06 11:22:31 UTCkaki
#
なるほど、$letと$let*いいかもしれません。
#
$seq0 毎回自分で定義してる気がするんですがそれっぽいの今ないですよね、$seqの結果だけ逆のやつ。
#
あと $bind はコメントでAPIって書いてありますがexport忘れです?
2019/09/06 11:26:45 UTCshiro
#
ん、たぶん忘れ。$bindも後から足したんだったと思う。これもHaskellのモナド由来なんだけど、名前これでいいかなあ。まあそれ言い出すと$returnもモナド知らないとわかりづらいかもなあ。
2019/09/06 11:35:41 UTCshiro
#
引数のn個目を返す関数、たとえば(define (xfirst . args) (first args)) を作っておけば ($seq0 p ...) は ($lift xfirst p ...) になる。んだけどbegin0があるし$seq0はあってもいいか。
2019/09/06 11:40:54 UTCkaki
#
名前問題は難しいですね。自分はParsec使ったことあるので、(>>)は$seqで(<*)相当はなくてfmapは$liftでよくて…と考えているので、今も$bind使おうとしてアッとなったんですが。$liftみたいに可変長引数に吸収されて一対一に対応しないのもありますし。
#
$seq0は私もその気持ちです>begin0があるし
#
(<*)相当がないってのもありますが。
2019/09/06 11:47:40 UTCshiro
#
ただ、モナドのbindはオーバロードすればその上に作られてる他のモナド演算が全部その型で使えるようになる、っていう意味でプリミティブなAPIとして出しておくのが重要だけど、parser.pegの場合はオーバロードできるわけでないし、それならユーザプログラムは$doで書くことにする、っていうのもそれなりに統一感はありそうな気もする。$bindを特に使いたい場面ってどんな時かな。
2019/09/06 12:36:18 UTCkaki
#
Parsec系のライブラリを使ったことがある人だと、基本的な語彙の中にbindが入っていて、bindで書けるじゃーんと思ったら$bindがなかった、てのはありそうです。というかさっきの私の状況です。
#
(define ($seq0 p . parsers)
  ($bind p
         (cut $fold-parsers (^ (v s) s) <> parsers)))
#
$seq の定義を見て、 $fold-parsers を使って $seq0 を定義しようとしたらこうなりました。
#
特に使いたいというより、あったら普通に使いそう、みたいな気がします。無駄に変数名付けなくて済みますし。