Code Aquarium

minazoko's blog -*- 水底のブログ -*-

(Gauche) sort における #"|a|" の(?) 謎挙動

[追記] 本件、早々に突っ込みをいただきました。

#"|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 ... )