Gauche > Archives > 2025/04/21

2025/02/06 08:07:31 UTCkaki
#
(or (is-a? super </>) <class>) だと常に真になっちゃってますけどなんとなく動いてますね。分岐自体必要なかった…?
2025/02/06 08:17:36 UTCkaki
#
常に小さくできるからdelegate-to-superする必要はない気がします。
2025/02/06 08:24:59 UTCshiro
#
あれほんとだ。
2025/02/06 08:56:49 UTCkaki
#
そういえば、Cの char に対応するnative typeってFFIとかで必要にならないんですか?ABIとかはよく知らないんですが、Cの型システム上では char は signed char とも unsigned char とも異なる型(中身は処理系定義でどちらかと同じ)みたいなので。
2025/02/06 10:56:25 UTCshiro
#
単純に引数や戻り値での受け渡しの場合、1 byteであることさえ合わせてあれば、Scheme側でsignedと解釈しようがunsignedと解釈しようが自由ではあるんだけど、ヘッダ読み込んで型取り出す場合とかは分けておいた方が気持ちいいかなあ。
2025/02/06 11:10:35 UTCshiro
#
今あるffi (undocumentedだけど) の低レベル呼び出しルーチンではint系はどうせ6汎用レジスタかスタック渡しの時に64bitになるからcharの符号の有無は気にしてないな。ただstructとかを扱い始めたら気にせざるを得ないかな。
2025/02/06 11:28:16 UTCkaki
#
ふーむ、なるほど。
2025/02/18 11:11:12 UTCkaki
#
.$ の説明で、"これはR7RSの 範囲内では有効な識別子でないので" とありますが、R5RSで有効でなかったものでR7RSでは有効だと思います。まとめて置換してしまったのでしょうか。⟨peculiar identifier⟩ → . ⟨dot subsequent⟩ ⟨subsequent⟩* で、⟨dot subsequent⟩ にはinitialが書けるので。Gaucheも |.$| ではなく .$ とwriteしてくれます。
2025/02/18 13:24:24 UTCshiro
#
あ、多分R5RSからそのままアップデートしたんだと思います。Mahalo.
2025/02/20 06:20:58 UTCkaki
#
(ineq x <= y < z) の話なんですが、英語で書くのが難しいのとまとまってないのでここに書いちゃいます。典型的な不等式以外にも使えそうな気がして、最初はandでchainすることや間のオペランドが折り重なることに注目して命名した方がいいかと思ったんですが、そうすると一般的になりすぎたり(chainとか)長くなったり(and-chainとか)するんですよね。簡易記法のためのマクロなんだから、説明的すぎるより短い名前がいいでしょうし。かといって、&とか&&とかだと短すぎたり記号的すぎたりする気もしますし、記号でこれ以上複雑にすると暗号的になりそうですし、and*とするにはandと違いすぎますし、自信を持って推せる名前は思い付きませんでした。
#
典型的な不等式っぽい手続き以外でineqで使えそうな手続きはいくつか思い付いていて、member、alist-ref辺りはまだましなんですが、hash-table-delete!みたいな副作用があって成否を返すやつを使い出すと変な感じがします。まあ、これはそう使う人が変っていう話かもしれませんが。
2025/02/20 06:26:29 UTCkaki
#
関連する話題として、(complement =) もしくは complement の略記が欲しくなりそうですね。(ineq a < x (complement =) y < b) くらいは普通にありそうなので。(.$ not =) の方が短いなんて。
2025/02/20 06:31:19 UTCkaki
#
(complement =) に略記を与えちゃうと string=? 他はどうするんだとなっちゃいますが。
2025/02/20 07:18:00 UTCkaki
#
(ineq a < x (complement =) y < b) これ、(< x b) じゃないし普通じゃないか。
2025/02/20 07:22:54 UTCshiro
#
そう、最初は一種のchainingだから(Pythonでもchain of comparisonって言ってるし)、一般化するならそれに類する名前がいいかなと思ってたんだけどchainはsrfi-197で取られてるし、長くなったら意味ないし。
#
記号では、不等式なので >< とか (<> だとcutとかぶる)、数学で二項関係を一般化するときよく ~ を使うから ~* とか考えたんだけど、試してみたらいまいちだった。
2025/02/20 08:27:40 UTCkaki
#
andでchainするので記号を使うんだったら&を軸にするかなと思いました。&*とか。…&~とか?うーん。使用頻度的に記号2文字を割り当てるほどでもない気もするんですよね。ineqは長さや衝突しなさ的には丁度よさそうな感じがします。
2025/03/02 17:19:55 UTCkaki
#
(define (foo)
  (guard (e (#f #f))
    (raise "hoge")))

(foo)
;; スクリプトトップレベルで実行するとsegvします。main経由やREPLでは大丈夫でした。
2025/03/02 19:48:32 UTCshiro
#
なるほど。以前のバージョンだと動くのでどっかでバグ入れてますね
2025/03/02 21:48:59 UTCshiro
#
https://github.com/shirok/Gauche/issues/1120
2025/03/26 07:15:26 UTCkaki
#
(define (foo :key (bar 1)
                  (baz 2))
  ;;         ^(a) ^(b)
  0)
#
キーワード引数の途中で改行するとき、scheme-mode等のデフォルトでは(a)の位置になりますが、(b)の位置にインデントしたくなるんですよね。どうしてます?Gaucheのソースだとどちらもあるようですが。
2025/03/26 12:02:16 UTCshiro
#
bの位置が好みですが、自動で揃えてくれないので手でやってます。 aになってるのは多分自動インデントしたあと直し忘れ。
2025/03/26 17:26:16 UTCkaki
#
なるほど。では自動インデントがうまいこと書けたらシェアします。今の所いいアイデアがあるわけではありませんが。
2025/04/06 23:04:59 UTCkaki
#
キーワード引数の自動インデント、書いてみました。 https://gist.github.com/gengar/4e469cc407f83547232093c48e35c6fa stateに外側の開き括弧の開始位置が全部保存されていたので、思ったよりすんなりできました。デバッグはまだ甘いです。あとlisp-localとの共存にはまだ未知の部分があります。major modeに組み込めば大丈夫だろうと期待しているのですが、お試しで (setq-local lisp-indent-function 'gauche-mode-indent-function) などとするとlisp-localは忘れ去られます。
2025/04/07 05:31:46 UTCkaki
#
(define-constant ((foo x) y) x) はOKで (define-inline ((foo x) y) x) はNGなんですね。
2025/04/07 05:47:57 UTCshiro
#
キーワード自動インデント<おお、自分はquack使っててgauche-modeは使って無いんですが、試してみます。
#
define-inlineのそれは多分深く考えて無かったと思うのだけれど、define-inlineには束縛を作るというのと手続きにインライン情報を付加するという2つの操作があるからちょっとややこしい。でもできなくはないかな?
2025/04/07 07:15:31 UTCshiro
#
簡単だった> (define-inline ((foo x) y) ...) https://github.com/shirok/Gauche/commit/2bb48fa86f02cde5f61d46709350531198589f90
2025/04/07 07:36:57 UTCkaki
#
高階defineに対応しました。
#
major modeが他のindent functionを提供している場合は、scheme-indent-functionの所をそれに置き換えた方が良さそうです。