(Gauche) sort における #"|a|" の(?) 謎挙動
[追記] 本件、早々に突っ込みをいただきました。
@mnzktw #"|a|" は只の定数文字列"|a|"になるので、比較関数が引数に関わらず定数値を返しているためだと思います。多分意図したのは #"~|a|" じゃないでしょうか。
— Kilo Kawai (@anohana) 2014, 10月 11
#"|a|" ではなく、 #"~|a|" または #"~a" とするのが正解。ただの書式記憶違いでした。
以下、元記事。
feature identifierの列挙の方法を教えてもらったので弄ってたら謎の挙動に遭遇。
srfiで始まる定義済みシンボルを抽出。
(use r7rs) (import scheme.base) (define features-srfi (filter (.$ #/srfi/ x->string) (features)))
ソート
(sort features-srfi (^[a b] (string<? #"|a|" #"|b|")))
評価
(srfi-0 srfi-1 srfi-2 srfi-4 srfi-5 srfi-6 srfi-7 srfi-8 srfi-9 srfi-10 srfi-11 srfi-13 srfi-14 srfi-16 srfi-17 srfi-18 srfi-19 srfi-22 srfi-23 srfi-25 srfi-26 srfi-27 srfi-28 srfi-29 srfi-30 srfi-31 srfi-34 srfi-35 srfi-36 srfi-37 srfi-38 srfi-39 srfi-40 srfi-42 srfi-43 srfi-45 srfi-55 srfi-61 srfi-62 srfi-87 srfi-95 srfi-98 srfi-99 srfi-106)
綺麗に並びすぎじゃないですか?
だって、こうすると、
(sort features-srfi (^[a b] (string<? (x->string a) (x->string b))))
(srfi-0 srfi-1 srfi-10 srfi-106 srfi-11 srfi-13 srfi-14 srfi-16 srfi-17 srfi-18 srfi-19 srfi-2 srfi-22 srfi-23 srfi-25 srfi-26 srfi-27 srfi-28 srfi-29 srfi-30 srfi-31 srfi-34 srfi-35 srfi-36 srfi-37 srfi-38 srfi-39 srfi-4 srfi-40 srfi-42 srfi-43 srfi-45 srfi-5 srfi-55 srfi-6 srfi-61 srfi-62 srfi-7 srfi-8 srfi-87 srfi-9 srfi-95 srfi-98 srfi-99)
そうそう、文字列で比較してるからこうなるハズ...
ちなみにこれだと、
(sort '(srfi-8 srfi-9 srfi-10 srfi-11) (^[a b] (string<? #"|a|" #"|b|")))
(srfi-11 srfi-10 srfi-9 srfi-8)
あ、そうなるんだ... あれぇ?
参考までにうちの環境
(gauche.ces.utf8 gauche.sys.setenv gauche.sys.nanosleep gauche.sys.select gauche gauche-0.9.4 gauche.os.windows gauche-windows r7rs exact-closed ieee-float full-unicode ratios windows little-endian gauche.sys.threads gauche.sys.wthreads gauche.net.tls gauche.net.tls.axtls ... )