Archive for 2022年2月|Monthly archive page

入れ子リストに map する、、、または文字列のUTF8化

 clié のバッテリーがついに壊れ、palm から離れることに、、、
 とは言え、今までのデータを見るためのスクリプトは用意してあり、心配はないのですが、、、
 この辺でSJISコードをUTF8コードに変換することに。
 そこで、データ(入れ子リスト)中の文字列だけを操作するスクリプトを考えました。

(define (test x)
   (if (list? x) (map test x)
  (string? x) (sjis2utf8 x)
  x))

 ここで sjis2utf8 は前に作ったSJIS文字列をUTF8文字列に変換するスクリプト
 ん、これはもしかして、汎用化できるかも、、、
 と、考えたのが次のスクリプト

(define (map1all func x (pre? or))
  (if (list? x) (map (fn(x) (map1all func x pre?)) x)
  (pre? x) (func x)
  x))

 最初は map-all と名付けるつもりでしたが、1変数関数にしか使えないの map1all に(汗)
 使い方はこんな感じ、
 今回は文字列だけに適用したいので関数 map1all の第3変数に string? 述語が必要。

newLISP v.10.7.5 64-bit on Windows IPv4/6 libffi, options: newlisp -h

> category
((1 1 0 "\131r\131W\131l\131X" "\131r\131W\131l\131X") (2 2 0 "\131p\129[\131\\\131i\131\139" 
  "\131p\129[\131\\\131i") 
 (3 17 0 "\131e\131j\131X" "\131e\131j\131X") 
 (4 128 0 "\143\238\149\241" "\143\238\149\241") 
 (5 129 0 "\131J\131\129\131\137" "\131J\131\129\131\137") 
 (6 130 0 "\145\183\142q" "\145\183\142q") 
 (7 131 0 "BS" "BS") 
 (8 132 0 "\142\145\151\191" "\142\145\151\191") 
 (9 18 0 "LispMe" "LispMe") 
 (10 133 0 "\138i\140\190\129E\150@\145\165" "\138i\140\190\129E\150@") 
 (11 134 0 "\130\168\137\217\142q" "\130\168\137\217\142q"))
> (map1all sjis2utf8 category string?)
((1 1 0 "\227\131\147\227\130\184\227\131\141\227\130\185" "\227\131\147\227\130\184\227\131\141\227\130\185") 
 (2 2 0 "\227\131\145\227\131\188\227\130\189\227\131\138\227\131\171" "\227\131\145\227\131\188\227\130\189\227\131\138") 
 (3 17 0 "\227\131\134\227\131\139\227\130\185" "\227\131\134\227\131\139\227\130\185") 
 (4 128 0 "\230\131\133\229\160\177" "\230\131\133\229\160\177") 
 (5 129 0 "\227\130\171\227\131\161\227\131\169" "\227\130\171\227\131\161\227\131\169") 
 (6 130 0 "\229\173\171\229\173\144" "\229\173\171\229\173\144") 
 (7 131 0 "BS" "BS") 
 (8 132 0 "\232\179\135\230\150\153" "\232\179\135\230\150\153") 
 (9 18 0 "LispMe" "LispMe") 
 (10 133 0 "\230\160\188\232\168\128\227\131\187\230\179\149\229\137\135" "\230\160\188\232\168\128\227\131\187\230\179\149") 
 (11 134 0 "\227\129\138\232\143\147\229\173\144" "\227\129\138\232\143\147\229\173\144"))
> 

 これで、入れ子リスト中の文字列だけの操作はおてのもの(笑)
 以上、如何でしょうか。